PluginProbe
WP Debugging / 2.11.16
WP Debugging v2.11.16
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.16, at src/Bootstrap.php

221 lines 5.5 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 add_action(
86 'plugins_loaded',
87 function() {
88 \WP_Dependency_Installer::instance()->run( $this->dir );
89 }
90 );
91 }
92
93 /**
94 * Get the `wp-config.php` file path.
95 *
96 * The config file may reside one level above ABSPATH but is not part of another installation.
97 *
98 * @see wp-load.php#L26-L42
99 *
100 * @return string $config_path
101 */
102 public function get_config_path() {
103 $config_path = ABSPATH . 'wp-config.php';
104
105 if ( ! file_exists( $config_path ) ) {
106 if ( @file_exists( dirname( ABSPATH ) . '/wp-config.php' ) && ! @file_exists( dirname( ABSPATH ) . '/wp-settings.php' ) ) {
107 $config_path = dirname( ABSPATH ) . '/wp-config.php';
108 }
109 }
110
111 /**
112 * Filter the config file path.
113 *
114 * @since 2.3.0
115 *
116 * @param string $config_path
117 */
118 return apply_filters( 'wp_debugging_config_path', $config_path );
119 }
120
121 /**
122 * Load hooks.
123 *
124 * @return void
125 */
126 public function load_hooks() {
127 add_action(
128 'plugins_loaded',
129 function() {
130 ( new Settings( self::$options, self::$config_path, $this->defined_constants ) )
131 ->load_hooks()
132 ->process_filter_constants();
133 }
134 );
135 add_action(
136 'init',
137 function () {
138 load_plugin_textdomain( 'wp-debugging' );
139 }
140 );
141 add_filter(
142 'wp_dependency_timeout',
143 function ( $timeout, $source ) {
144 $timeout = basename( $this->dir ) !== $source ? $timeout : 45;
145
146 return $timeout;
147 },
148 10,
149 2
150 );
151
152 register_activation_hook( $this->file, [ $this, 'activate' ] );
153 register_deactivation_hook( $this->file, [ $this, 'deactivate' ] );
154 }
155
156 /**
157 * Run on activation.
158 * Reloads constants to wp-config.php, including saved options.
159 *
160 * @return void
161 */
162 public function activate() {
163 $this->set_pre_activation_constants();
164
165 // Need to remove user defined constants from filter.
166 $user_defined = apply_filters( 'wp_debugging_add_constants', [] );
167 foreach ( array_keys( $user_defined ) as $defined ) {
168 unset( self::$options[ $defined ] );
169 }
170
171 $constants = [ 'wp_debug_log', 'script_debug', 'savequeries' ];
172 $constants = array_flip( array_merge( array_keys( self::$options ), $constants ) );
173
174 ( new Settings( self::$options, self::$config_path, $this->defined_constants ) )->add_constants( $constants );
175 }
176
177 /**
178 * Run on deactivation.
179 * Removes all added constants from wp-config.php.
180 *
181 * @return void
182 */
183 public function deactivate() {
184 $restore_constants = get_site_option( 'wp_debugging_restore' );
185 $remove_user_added = array_diff( self::$options, array_flip( $this->defined_constants ) );
186 $remove_constants = array_diff( array_flip( $this->defined_constants ), array_keys( $restore_constants ) );
187 $remove_constants = array_merge( $remove_constants, $remove_user_added );
188
189 ( new Settings( self::$options, self::$config_path, $this->defined_constants ) )->remove_constants( $remove_constants );
190
191 $this->restore_pre_activation_constants();
192 }
193
194 /**
195 * Set pre-activation constant from `wp-config.php`.
196 *
197 * @return void
198 */
199 private function set_pre_activation_constants() {
200 $config_transformer = new \WPConfigTransformer( self::$config_path );
201 $predefined_constants = [];
202 foreach ( $this->defined_constants as $defined_constant ) {
203 if ( $config_transformer->exists( 'constant', strtoupper( $defined_constant ) ) ) {
204 $value = $config_transformer->get_value( 'constant', strtoupper( $defined_constant ) );
205 $predefined_constants[ $defined_constant ]['value'] = $value;
206 }
207 }
208 update_site_option( 'wp_debugging_restore', $predefined_constants );
209 }
210
211 /**
212 * Restore pre-activation constants to `wp-config.php`.
213 *
214 * @return void
215 */
216 private function restore_pre_activation_constants() {
217 $restore_constants = get_site_option( 'wp_debugging_restore' );
218 ( new Settings( self::$options, self::$config_path, $this->defined_constants ) )->add_constants( $restore_constants );
219 }
220 }
221