PluginProbe
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts / 2.7.8
Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts v2.7.8
2.7.9 2.7.8 2.7.7 2.7.6 2.7.5 2.7.4 trunk 1.3 2.0.4 2.0.6 2.1.91 2.2.4 2.2.7 2.2.9 2.3.1 2.3.10 2.4.10 2.4.2 2.4.4 2.4.5 2.4.6 2.4.7 2.4.8 2.4.9 2.6.0 All 30 releases
insert-php / insert_php.php

insert_php.php in Woody Code Snippets – Insert PHP, CSS, JS, and Header/Footer Scripts 2.7.8, at insert_php.php

346 lines 10.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Plugin Name: Woody Code Snippets
4 * Plugin URI: https://woodysnippet.com/
5 * Description: Executes PHP code, uses conditional logic to insert ads, text, media content and external service's code. Ensures no content duplication.
6 * Author: Themeisle
7 * Version: 2.7.8
8 * WordPress Available: yes
9 * Requires License: no
10 * Text Domain: insert-php
11 * Domain Path: /languages/
12 * Author URI: https://themeisle.com
13 *
14 * @package Woody_Code_Snippets
15 */
16
17 // Exit if accessed directly.
18 if ( ! defined( 'ABSPATH' ) ) {
19 exit;
20 }
21
22 if ( version_compare( PHP_VERSION, '7.4', '<' ) ) {
23 add_action(
24 'admin_notices',
25 function () {
26 ?>
27 <div class="notice notice-error">
28 <p><?php esc_html_e( 'Woody Code Snippets requires PHP 7.4 or higher. Please upgrade your PHP version.', 'insert-php' ); ?></p>
29 </div>
30 <?php
31 }
32 );
33
34 return;
35 }
36
37 global $wbcr_inp_safe_mode;
38
39 $wbcr_inp_safe_mode = false;
40
41 // Set the constant that the plugin is activated.
42 define( 'WINP_PLUGIN_ACTIVE', true );
43
44 define( 'WINP_PLUGIN_VERSION', '2.7.8' );
45
46 // Root directory of the plugin.
47 define( 'WINP_PLUGIN_DIR', __DIR__ );
48
49 define( 'WINP_PLUGIN_FILE', __FILE__ );
50
51 // Absolute url of the root directory of the plugin.
52 define( 'WINP_PLUGIN_URL', plugins_url( '', __FILE__ ) );
53
54 // Relative url of the plugin.
55 define( 'WINP_PLUGIN_BASE', plugin_basename( __FILE__ ) );
56
57 // Plugin slug.
58 define( 'WINP_PLUGIN_SLUG', basename( dirname( WINP_PLUGIN_FILE ) ) );
59
60 define( 'WINP_PLUGIN_NAMESPACE', str_replace( '-', '_', strtolower( trim( WINP_PLUGIN_SLUG ) ) ) );
61
62 // The type of posts used for snippets types.
63 define( 'WINP_SNIPPETS_POST_TYPE', 'wbcr-snippets' );
64
65 // The taxonomy used for snippets types.
66 define( 'WINP_SNIPPETS_TAXONOMY', 'wbcr-snippet-tags' );
67
68 // The snippets types.
69 define( 'WINP_SNIPPET_TYPE_PHP', 'php' );
70 define( 'WINP_SNIPPET_TYPE_TEXT', 'text' );
71 define( 'WINP_SNIPPET_TYPE_UNIVERSAL', 'universal' );
72 define( 'WINP_SNIPPET_TYPE_CSS', 'css' );
73 define( 'WINP_SNIPPET_TYPE_JS', 'js' );
74 define( 'WINP_SNIPPET_TYPE_HTML', 'html' );
75 define( 'WINP_SNIPPET_TYPE_AD', 'advert' );
76
77 // We need to update these.
78 define( 'WINP_UPGRADE', 'https://woodysnippet.com/upgrade' );
79 define( 'WINP_DOCS', 'https://docs.themeisle.com/category/2429-woody-installation-and-setup' );
80 define( 'WINP_ORG_SUPPORT', 'https://wordpress.org/support/plugin/insert-php/' );
81 define( 'WINP_SUPPORT', 'https://themeisle.com/contact/' );
82
83 // Load text domain for translations.
84 add_action(
85 'plugins_loaded',
86 function () {
87 load_plugin_textdomain( 'insert-php', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
88 }
89 );
90
91 // START: Related to premium version compatibility check for below 1.3.
92 add_action(
93 'plugins_loaded',
94 function () {
95 $premium_plugin_file = 'woody-ad-snippets-premium/woody-ad-snippets-premium.php';
96 $premium_plugin_path = WP_PLUGIN_DIR . '/' . $premium_plugin_file;
97
98 if ( ! file_exists( $premium_plugin_path ) ) {
99 return;
100 }
101
102 if ( ! function_exists( 'is_plugin_active' ) ) {
103 require_once ABSPATH . 'wp-admin/includes/plugin.php';
104 }
105
106 if ( ! is_plugin_active( $premium_plugin_file ) ) {
107 return;
108 }
109
110 if ( ! function_exists( 'get_plugin_data' ) ) {
111 require_once ABSPATH . 'wp-admin/includes/plugin.php';
112 }
113 $premium_data = get_plugin_data( $premium_plugin_path );
114
115 if ( version_compare( $premium_data['Version'], '1.3.0', '<' ) ) {
116 deactivate_plugins( $premium_plugin_file );
117 set_transient( 'winp_premium_version_incompatible', true, WEEK_IN_SECONDS );
118 }
119 },
120 5
121 );
122
123 add_action(
124 'admin_init',
125 function () {
126 if ( isset( $_GET['winp_dismiss_premium_notice'] ) && check_admin_referer( 'winp_dismiss_premium_notice' ) ) {
127 delete_transient( 'winp_premium_version_incompatible' );
128 wp_safe_redirect( remove_query_arg( 'winp_dismiss_premium_notice' ) );
129 exit;
130 }
131 }
132 );
133
134 add_action(
135 'admin_notices',
136 function () {
137 if ( get_transient( 'winp_premium_version_incompatible' ) ) {
138 $dismiss_url = wp_nonce_url(
139 add_query_arg( 'winp_dismiss_premium_notice', '1' ),
140 'winp_dismiss_premium_notice'
141 );
142 ?>
143 <div class="notice notice-error">
144 <p>
145 <strong><?php esc_html_e( 'Woody Code Snippets Premium has been deactivated.', 'insert-php' ); ?></strong>
146 </p>
147 <p>
148 <?php
149 printf(
150 // translators: %s Premium version number.
151 esc_html__( 'The installed premium version is not compatible with the current version of Woody Code Snippets. Please update the premium plugin to version %s or higher.', 'insert-php' ),
152 '<strong>1.3.0</strong>'
153 );
154 ?>
155 </p>
156 <p>
157 <a href="<?php echo esc_url( $dismiss_url ); ?>" class="button button-secondary">
158 <?php esc_html_e( 'Dismiss this notice', 'insert-php' ); ?>
159 </a>
160 </p>
161 </div>
162 <?php
163 }
164 }
165 );
166 // END: Related to premium version compatibility check for below 1.3.
167
168 require_once WINP_PLUGIN_DIR . '/includes/class.insertion.locations.php';
169 require_once WINP_PLUGIN_DIR . '/includes/class.http.php';
170 require_once WINP_PLUGIN_DIR . '/includes/class.helpers.php';
171 require_once WINP_PLUGIN_DIR . '/includes/class.code-validator.php';
172 require_once WINP_PLUGIN_DIR . '/includes/class.error-handler.php';
173 require_once WINP_PLUGIN_DIR . '/includes/class.plugin.php';
174
175 if ( file_exists( WINP_PLUGIN_DIR . '/vendor/autoload.php' ) ) {
176 require_once WINP_PLUGIN_DIR . '/vendor/autoload.php';
177 }
178
179 /**
180 * Adds a hint and button to the fatal error message.
181 *
182 * Since WordPress 5.2, we have access to a special mode for catching PHP errors.
183 * If a user makes a syntax error while editing a snippet, instead of a white screen
184 * (if PHP errors are disabled on the server), they will see a message from WordPress
185 * generated by the WP_Fatal_Error_Handler class.
186 *
187 * We decided to add a button to this message to switch to safe mode.
188 */
189 add_filter(
190 'wp_php_error_message',
191 function ( $message ) {
192 $safe_mode_url = admin_url( 'edit.php?post_type=' . WINP_SNIPPETS_POST_TYPE . '&wbcr-php-snippets-safe-mode' );
193 $safe_mode_button = '<div style="margin:20px 0;padding:20px; background:#ffe8e8;">' . __( 'If you see this message after saving the snippet to the Woody Code Snippets plugin, please enable safe mode in the Woody plugin. Safe mode will allow you to continue working in the admin panel of your site and change the snippet in which you made a php error.', 'insert-php' ) . '</div>';
194 $safe_mode_button .= '<a href="' . $safe_mode_url . '" class="button">' . __( 'Enable Safe Mode', 'insert-php' ) . '</a>';
195
196 return $message . $safe_mode_button;
197 }
198 );
199
200 /**
201 * Enables/Disable safe mode, in which the php code will not be executed.
202 */
203 add_action(
204 'plugins_loaded',
205 function () {
206 if ( isset( $_GET['wbcr-php-snippets-safe-mode'] ) ) {
207 WINP_Helper::enable_safe_mode();
208 wp_safe_redirect( esc_url( remove_query_arg( [ 'wbcr-php-snippets-safe-mode' ] ) ) );
209 die();
210 }
211
212 if ( isset( $_GET['wbcr-php-snippets-disable-safe-mode'] ) ) {
213 WINP_Helper::disable_safe_mode();
214 wp_safe_redirect( esc_url( remove_query_arg( [ 'wbcr-php-snippets-disable-safe-mode' ] ) ) );
215 die();
216 }
217 },
218 - 1
219 );
220
221 /**
222 * Register product to SDK
223 *
224 * @param array<string> $products Registered products.
225 * @return array<string>
226 */
227 function winp_sdk_register_products( $products ) {
228 $products[] = WINP_PLUGIN_FILE;
229
230 return $products;
231 }
232
233 /**
234 * About page metadata
235 *
236 * @return array<string, mixed>
237 */
238 function winp_sdk_about_page() {
239 return [
240 'location' => 'edit.php?post_type=wbcr-snippets',
241 'logo' => WINP_PLUGIN_URL . '/admin/assets/img/icon-256x256.png',
242 'review_link' => false,
243 'has_upgrade_menu' => false,
244 ];
245 }
246
247 /**
248 * AI Connect metadata.
249 *
250 * Only the read abilities are listed: the abilities that save or activate
251 * snippets run code, so the site owner switches those on deliberately.
252 *
253 * @return array<string, mixed>
254 */
255 function winp_sdk_ai_connect() {
256 return [
257 'name' => 'Woody Code Snippets',
258 'notice_cases' => [
259 __( 'find where a script is inserted', 'insert-php' ),
260 __( 'review the code of a snippet', 'insert-php' ),
261 __( 'audit your active snippets', 'insert-php' ),
262 ],
263 'prompts' => [
264 __( 'Find which Woody Code Snippets load gtag and where they are inserted.', 'insert-php' ),
265 __( 'Show me the code of my header scripts snippet and explain what it does.', 'insert-php' ),
266 __( 'Which of my snippets run PHP on every page?', 'insert-php' ),
267 ],
268 'ability_prefix' => 'woody',
269 ];
270 }
271
272 /**
273 * Register compatibility using SDK.
274 *
275 * @param array<string, array<string, string>> $compatibilities All compatibilities.
276 *
277 * @return array<string, array<string, string>> Registered compatibility.
278 */
279 function winp_sdk_register_compatibility( $compatibilities ) {
280 $compatibilities['WoodyPro'] = [
281 'basefile' => defined( 'WASP_PLUGIN_FILE' ) ? WASP_PLUGIN_FILE : '',
282 'required' => '1.3.0',
283 ];
284
285 return $compatibilities;
286 }
287
288 add_filter( 'themeisle_sdk_products', 'winp_sdk_register_products' );
289 add_filter( WINP_PLUGIN_NAMESPACE . '_about_us_metadata', 'winp_sdk_about_page' );
290 add_filter( WINP_PLUGIN_NAMESPACE . '_ai_connect_metadata', 'winp_sdk_ai_connect' );
291 add_filter( 'themeisle_sdk_compatibilities/' . basename( WINP_PLUGIN_DIR ), 'winp_sdk_register_compatibility' );
292
293 // Register activation/deactivation hooks.
294 register_activation_hook(
295 WINP_PLUGIN_FILE,
296 function () {
297 global $winp_snippets_locations;
298 if ( ! isset( $winp_snippets_locations ) ) {
299 $winp_snippets_locations = new WINP_Insertion_Locations();
300 }
301
302 // Instantiate plugin for activation.
303 $plugin = new WINP_Plugin();
304 $plugin->activation_hook();
305 }
306 );
307
308 register_deactivation_hook(
309 WINP_PLUGIN_FILE,
310 function () {
311 global $winp_snippets_locations;
312 if ( ! isset( $winp_snippets_locations ) ) {
313 $winp_snippets_locations = new WINP_Insertion_Locations();
314 }
315
316 // Instantiate plugin for deactivation.
317 $plugin = new WINP_Plugin();
318 $plugin->deactivation_hook();
319 }
320 );
321
322 // Initialize on 'init' hook with priority 0 to avoid early translation loading (WP 6.7+)
323 add_action(
324 'init',
325 function () {
326 global $winp_snippets_locations;
327 $winp_snippets_locations = new WINP_Insertion_Locations();
328
329 try {
330 new WINP_Plugin();
331 } catch ( Exception $exception ) {
332 // Plugin wasn't initialized due to an error
333 define( 'WINP_PLUGIN_THROW_ERROR', true );
334
335 $wbcr_plugin_error_func = function () use ( $exception ) {
336 $error = sprintf( 'The %s plugin has stopped. <b>Error:</b> %s Code: %s', 'Woody Ad Snippets', $exception->getMessage(), $exception->getCode() );
337 echo '<div class="notice notice-error"><p>' . $error . '</p></div>';
338 };
339
340 add_action( 'admin_notices', $wbcr_plugin_error_func );
341 add_action( 'network_admin_notices', $wbcr_plugin_error_func );
342 }
343 },
344 0
345 );
346