| @@ -3,9 +3,9 @@ | ||
| 3 | 3 | * Plugin Name: Woody Code Snippets |
| 4 | 4 | * Plugin URI: https://woodysnippet.com/ |
| 5 | 5 | * Description: Executes PHP code, uses conditional logic to insert ads, text, media content and external service's code. Ensures no content duplication. |
| 6 | 6 | * Author: Themeisle |
| 7 | - * Version: 2.7.6 | |
| 7 | + * Version: 2.7.9 | |
| 8 | 8 | * WordPress Available: yes |
| 9 | 9 | * Requires License: no |
| 10 | 10 | * Text Domain: insert-php |
| 11 | 11 | * Domain Path: /languages/ |
| @@ -40,9 +40,9 @@ | ||
| 40 | 40 | |
| 41 | 41 | // Set the constant that the plugin is activated. |
| 42 | 42 | define( 'WINP_PLUGIN_ACTIVE', true ); |
| 43 | 43 | |
| 44 | -define( 'WINP_PLUGIN_VERSION', '2.7.6' ); | |
| 44 | +define( 'WINP_PLUGIN_VERSION', '2.7.9' ); | |
| 45 | 45 | |
| 46 | 46 | // Root directory of the plugin. |
| 47 | 47 | define( 'WINP_PLUGIN_DIR', __DIR__ ); |
| 48 | 48 | |
| @@ -88,38 +88,40 @@ | ||
| 88 | 88 | } |
| 89 | 89 | ); |
| 90 | 90 | |
| 91 | 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; | |
| 92 | +/** | |
| 93 | + * Deactivates Premium versions below 1.3.0, which are not compatible with this version. | |
| 94 | + */ | |
| 95 | +function winp_deactivate_incompatible_premium(): void { | |
| 96 | + $premium_plugin_file = 'woody-ad-snippets-premium/woody-ad-snippets-premium.php'; | |
| 97 | + $premium_plugin_path = WP_PLUGIN_DIR . '/' . $premium_plugin_file; | |
| 97 | 98 | |
| 98 | - if ( ! file_exists( $premium_plugin_path ) ) { | |
| 99 | - return; | |
| 100 | - } | |
| 99 | + if ( ! file_exists( $premium_plugin_path ) ) { | |
| 100 | + return; | |
| 101 | + } | |
| 101 | 102 | |
| 102 | - if ( ! function_exists( 'is_plugin_active' ) ) { | |
| 103 | - require_once ABSPATH . 'wp-admin/includes/plugin.php'; | |
| 104 | - } | |
| 103 | + if ( ! function_exists( 'is_plugin_active' ) ) { | |
| 104 | + require_once ABSPATH . 'wp-admin/includes/plugin.php'; | |
| 105 | + } | |
| 105 | 106 | |
| 106 | - if ( ! is_plugin_active( $premium_plugin_file ) ) { | |
| 107 | - return; | |
| 108 | - } | |
| 107 | + if ( ! is_plugin_active( $premium_plugin_file ) ) { | |
| 108 | + return; | |
| 109 | + } | |
| 109 | 110 | |
| 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 ); | |
| 111 | + if ( ! function_exists( 'get_plugin_data' ) ) { | |
| 112 | + require_once ABSPATH . 'wp-admin/includes/plugin.php'; | |
| 113 | + } | |
| 114 | + $premium_data = get_plugin_data( $premium_plugin_path ); | |
| 114 | 115 | |
| 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 | -); | |
| 116 | + if ( version_compare( $premium_data['Version'], '1.3.0', '<' ) ) { | |
| 117 | + deactivate_plugins( $premium_plugin_file ); | |
| 118 | + // Still hooked this request; it calls WINP_Plugin::app() before init. | |
| 119 | + remove_action( 'plugins_loaded', 'wasp_premium_load', 20 ); | |
| 120 | + set_transient( 'winp_premium_version_incompatible', true, WEEK_IN_SECONDS ); | |
| 121 | + } | |
| 122 | +} | |
| 123 | +add_action( 'plugins_loaded', 'winp_deactivate_incompatible_premium', 5 ); | |
| 122 | 124 | |
| 123 | 125 | add_action( |
| 124 | 126 | 'admin_init', |
| 125 | 127 | function () { |
| @@ -167,8 +169,9 @@ | ||
| 167 | 169 | |
| 168 | 170 | require_once WINP_PLUGIN_DIR . '/includes/class.insertion.locations.php'; |
| 169 | 171 | require_once WINP_PLUGIN_DIR . '/includes/class.http.php'; |
| 170 | 172 | require_once WINP_PLUGIN_DIR . '/includes/class.helpers.php'; |
| 173 | +require_once WINP_PLUGIN_DIR . '/includes/class.code-validator.php'; | |
| 171 | 174 | require_once WINP_PLUGIN_DIR . '/includes/class.error-handler.php'; |
| 172 | 175 | require_once WINP_PLUGIN_DIR . '/includes/class.plugin.php'; |
| 173 | 176 | |
| 174 | 177 | if ( file_exists( WINP_PLUGIN_DIR . '/vendor/autoload.php' ) ) { |
| @@ -243,8 +246,33 @@ | ||
| 243 | 246 | ]; |
| 244 | 247 | } |
| 245 | 248 | |
| 246 | 249 | /** |
| 250 | + * AI Connect metadata. | |
| 251 | + * | |
| 252 | + * Only the read abilities are listed: the abilities that save or activate | |
| 253 | + * snippets run code, so the site owner switches those on deliberately. | |
| 254 | + * | |
| 255 | + * @return array<string, mixed> | |
| 256 | + */ | |
| 257 | +function winp_sdk_ai_connect() { | |
| 258 | + return [ | |
| 259 | + 'name' => 'Woody Code Snippets', | |
| 260 | + 'notice_cases' => [ | |
| 261 | + __( 'find where a script is inserted', 'insert-php' ), | |
| 262 | + __( 'review the code of a snippet', 'insert-php' ), | |
| 263 | + __( 'audit your active snippets', 'insert-php' ), | |
| 264 | + ], | |
| 265 | + 'prompts' => [ | |
| 266 | + __( 'Find which Woody Code Snippets load gtag and where they are inserted.', 'insert-php' ), | |
| 267 | + __( 'Show me the code of my header scripts snippet and explain what it does.', 'insert-php' ), | |
| 268 | + __( 'Which of my snippets run PHP on every page?', 'insert-php' ), | |
| 269 | + ], | |
| 270 | + 'ability_prefix' => 'woody', | |
| 271 | + ]; | |
| 272 | +} | |
| 273 | + | |
| 274 | +/** | |
| 247 | 275 | * Register compatibility using SDK. |
| 248 | 276 | * |
| 249 | 277 | * @param array<string, array<string, string>> $compatibilities All compatibilities. |
| 250 | 278 | * |
| @@ -260,8 +288,9 @@ | ||
| 260 | 288 | } |
| 261 | 289 | |
| 262 | 290 | add_filter( 'themeisle_sdk_products', 'winp_sdk_register_products' ); |
| 263 | 291 | add_filter( WINP_PLUGIN_NAMESPACE . '_about_us_metadata', 'winp_sdk_about_page' ); |
| 292 | +add_filter( WINP_PLUGIN_NAMESPACE . '_ai_connect_metadata', 'winp_sdk_ai_connect' ); | |
| 264 | 293 | add_filter( 'themeisle_sdk_compatibilities/' . basename( WINP_PLUGIN_DIR ), 'winp_sdk_register_compatibility' ); |
| 265 | 294 | |
| 266 | 295 | // Register activation/deactivation hooks. |
| 267 | 296 | register_activation_hook( |