PluginProbe
WP Debugging / 2.11.1
WP Debugging v2.11.1
2.12.6 2.12.5 trunk 2.10.0 2.10.1 2.10.2 2.11.0 2.11.1 2.11.10 2.11.11 2.11.12 2.11.13 2.11.14 2.11.15 2.11.16 2.11.17 2.11.18 2.11.19 2.11.2 2.11.20 2.11.21 2.11.22 2.11.23 2.11.24 2.11.3 All 59 releases
wp-debugging / src / Bootstrap.php

Bootstrap.php in WP Debugging 2.11.1, at src/Bootstrap.php

216 lines 5.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * WP Debugging
4 *
5 * @package wp-debugging
6 * @author Andy Fragen
7 * @license MIT
8 */
9
10 namespace Fragen\WP_Debugging;
11
12 // Exit if called directly.
13 if ( ! defined( 'WPINC' ) ) {
14 die;
15 }
16
17 /**
18 * Class Bootstrap
19 */
20 class Bootstrap {
21 /**
22 * Holds main plugin file.
23 *
24 * @var string
25 */
26 protected $file;
27
28 /**
29 * Holds main plugin directory.
30 *
31 * @var string
32 */
33 protected $dir;
34
35 /**
36 * Holds plugin options.
37 *
38 * @var array
39 */
40 protected static $options;
41
42 /**
43 * Holds `wp-config.php` file path.
44 *
45 * @var string
46 */
47 protected static $config_path;
48
49 /**
50 * Holds pre-defined constants for `wp-config.php`.
51 *
52 * @var array
53 */
54 protected $defined_constants = [ 'wp_debug_log', 'script_debug', 'savequeries', 'wp_debug', 'wp_debug_display', 'wp_disable_fatal_error_handler' ];
55
56 /**
57 * Constructor.
58 *
59 * @param string $file Main plugin file.
60 * @return void
61 */
62 public function __construct( $file ) {
63 $this->file = $file;
64 $this->dir = dirname( $file );
65 self::$options = get_site_option( 'wp_debugging', [ 'wp_debug' => '1' ] );
66 self::$config_path = $this->get_config_path();
67 @ini_set( 'display_errors', 1 ); // phpcs:ignore WordPress.PHP.IniSet.display_errors_Blacklisted
68 }
69
70 /**
71 * Test for writable wp-config.php, exit with notice if not available.
72 *
73 * @return bool|void
74 */
75 public function init() {
76 if ( ! is_writable( self::$config_path ) ) {
77 echo '<div class="error notice is-dismissible"><p>';
78 echo wp_kses_post( __( 'The <strong>WP Debugging</strong> plugin must have a <code>wp-config.php</code> file that is writable by the filesystem.', 'wp-debugging' ) );
79 echo '</p></div>';
80
81 return false;
82 }
83
84 $this->load_hooks();
85 \WP_Dependency_Installer::instance()->run( $this->dir );
86 }
87
88 /**
89 * Get the `wp-config.php` file path.
90 *
91 * The config file may reside one level above ABSPATH but is not part of another installation.
92 *
93 * @see wp-load.php#L26-L42
94 *
95 * @return string $config_path
96 */
97 public function get_config_path() {
98 $config_path = ABSPATH . 'wp-config.php';
99
100 if ( ! file_exists( $config_path ) ) {
101 if ( @file_exists( dirname( ABSPATH ) . '/wp-config.php' ) && ! @file_exists( dirname( ABSPATH ) . '/wp-settings.php' ) ) {
102 $config_path = dirname( ABSPATH ) . '/wp-config.php';
103 }
104 }
105
106 /**
107 * Filter the config file path.
108 *
109 * @since 2.3.0
110 *
111 * @param string $config_path
112 */
113 return apply_filters( 'wp_debugging_config_path', $config_path );
114 }
115
116 /**
117 * Load hooks.
118 *
119 * @return void
120 */
121 public function load_hooks() {
122 add_action(
123 'plugins_loaded',
124 function() {
125 ( new Settings( self::$options, self::$config_path, $this->defined_constants ) )
126 ->load_hooks()
127 ->process_filter_constants();
128 }
129 );
130 add_action(
131 'init',
132 function () {
133 load_plugin_textdomain( 'wp-debugging' );
134 }
135 );
136 add_filter(
137 'wp_dependency_timeout',
138 function ( $timeout, $source ) {
139 $timeout = basename( $this->dir ) !== $source ? $timeout : 45;
140
141 return $timeout;
142 },
143 10,
144 2
145 );
146
147 register_activation_hook( $this->file, [ $this, 'activate' ] );
148 register_deactivation_hook( $this->file, [ $this, 'deactivate' ] );
149 }
150
151 /**
152 * Run on activation.
153 * Reloads constants to wp-config.php, including saved options.
154 *
155 * @return void
156 */
157 public function activate() {
158 $this->set_pre_activation_constants();
159
160 // Need to remove user defined constants from filter.
161 $user_defined = apply_filters( 'wp_debugging_add_constants', [] );
162 foreach ( array_keys( $user_defined ) as $defined ) {
163 unset( self::$options[ $defined ] );
164 }
165
166 $constants = [ 'wp_debug_log', 'script_debug', 'savequeries' ];
167 $constants = array_flip( array_merge( array_keys( self::$options ), $constants ) );
168
169 ( new Settings( self::$options, self::$config_path, $this->defined_constants ) )->add_constants( $constants );
170 }
171
172 /**
173 * Run on deactivation.
174 * Removes all added constants from wp-config.php.
175 *
176 * @return void
177 */
178 public function deactivate() {
179 $restore_constants = get_site_option( 'wp_debugging_restore' );
180 $remove_user_added = array_diff( self::$options, array_flip( $this->defined_constants ) );
181 $remove_constants = array_diff( array_flip( $this->defined_constants ), array_keys( $restore_constants ) );
182 $remove_constants = array_merge( $remove_constants, $remove_user_added );
183
184 ( new Settings( self::$options, self::$config_path, $this->defined_constants ) )->remove_constants( $remove_constants );
185
186 $this->restore_pre_activation_constants();
187 }
188
189 /**
190 * Set pre-activation constant from `wp-config.php`.
191 *
192 * @return void
193 */
194 private function set_pre_activation_constants() {
195 $config_transformer = new \WPConfigTransformer( self::$config_path );
196 $predefined_constants = [];
197 foreach ( $this->defined_constants as $defined_constant ) {
198 if ( $config_transformer->exists( 'constant', strtoupper( $defined_constant ) ) ) {
199 $value = $config_transformer->get_value( 'constant', strtoupper( $defined_constant ) );
200 $predefined_constants[ $defined_constant ]['value'] = $value;
201 }
202 }
203 update_site_option( 'wp_debugging_restore', $predefined_constants );
204 }
205
206 /**
207 * Restore pre-activation constants to `wp-config.php`.
208 *
209 * @return void
210 */
211 private function restore_pre_activation_constants() {
212 $restore_constants = get_site_option( 'wp_debugging_restore' );
213 ( new Settings( self::$options, self::$config_path, $this->defined_constants ) )->add_constants( $restore_constants );
214 }
215 }
216