| @@ -39,34 +39,18 @@ | ||
| 39 | 39 | * @since 1.9.6 |
| 40 | 40 | */ |
| 41 | 41 | public function __construct() { |
| 42 | 42 | |
| 43 | - // Initialize classes that have hooks prior to the `init` hook. | |
| 44 | - // Divi Theme requires us to do this, although the Divi Builder Plugin works fine when loading | |
| 45 | - // our integration on `init`. | |
| 46 | - $this->classes['divi'] = new ConvertKit_Divi(); | |
| 47 | - $this->classes['widgets'] = new ConvertKit_Widgets(); | |
| 48 | - | |
| 49 | - // Initialize Plugin classes on init, so the `_load_textdomain_just_in_time` warning isn't triggered. | |
| 50 | - add_action( 'init', array( $this, 'initialize' ), 1 ); | |
| 51 | - add_action( 'init', array( $this, 'setup' ), 2 ); | |
| 52 | - | |
| 53 | - } | |
| 54 | - | |
| 55 | - /** | |
| 56 | - * Initialize classes. | |
| 57 | - * | |
| 58 | - * @since 2.7.7 | |
| 59 | - */ | |
| 60 | - public function initialize() { | |
| 61 | - | |
| 43 | + // Initialize class(es) to register hooks. | |
| 62 | 44 | $this->initialize_admin(); |
| 63 | 45 | $this->initialize_admin_or_frontend_editor(); |
| 64 | 46 | $this->initialize_cli_cron(); |
| 65 | 47 | $this->initialize_frontend(); |
| 66 | 48 | $this->initialize_global(); |
| 67 | - $this->initialize_mcp(); | |
| 68 | 49 | |
| 50 | + // Load language files. | |
| 51 | + add_action( 'init', array( $this, 'load_language_files' ) ); | |
| 52 | + | |
| 69 | 53 | } |
| 70 | 54 | |
| 71 | 55 | /** |
| 72 | 56 | * Initialize classes for the WordPress Administration interface |
| @@ -79,27 +63,23 @@ | ||
| 79 | 63 | if ( ! is_admin() ) { |
| 80 | 64 | return; |
| 81 | 65 | } |
| 82 | 66 | |
| 83 | - $this->classes['admin_bulk_edit'] = new ConvertKit_Admin_Bulk_Edit(); | |
| 84 | - $this->classes['admin_cache_plugins'] = new ConvertKit_Admin_Cache_Plugins(); | |
| 85 | - $this->classes['admin_category'] = new ConvertKit_Admin_Category(); | |
| 86 | - $this->classes['admin_landing_page'] = new ConvertKit_Admin_Landing_Page(); | |
| 87 | - $this->classes['admin_legacy_resource_notice'] = new ConvertKit_Admin_Legacy_Resource_Notice(); | |
| 88 | - $this->classes['admin_importer_activecampaign'] = new ConvertKit_Admin_Importer_ActiveCampaign(); | |
| 89 | - $this->classes['admin_importer_aweber'] = new ConvertKit_Admin_Importer_AWeber(); | |
| 90 | - $this->classes['admin_importer_campaignmonitor'] = new ConvertKit_Admin_Importer_CampaignMonitor(); | |
| 91 | - $this->classes['admin_importer_convertkit_legacy_forms'] = new ConvertKit_Admin_Importer_ConvertKit_Legacy_Forms(); | |
| 92 | - $this->classes['admin_importer_mc4wp'] = new ConvertKit_Admin_Importer_MC4WP(); | |
| 93 | - $this->classes['admin_importer_mailpoet'] = new ConvertKit_Admin_Importer_Mailpoet(); | |
| 94 | - $this->classes['admin_importer_newsletter'] = new ConvertKit_Admin_Importer_Newsletter(); | |
| 95 | - $this->classes['admin_post'] = new ConvertKit_Admin_Post(); | |
| 96 | - $this->classes['admin_quick_edit'] = new ConvertKit_Admin_Quick_Edit(); | |
| 97 | - $this->classes['admin_restrict_content'] = new ConvertKit_Admin_Restrict_Content(); | |
| 98 | - $this->classes['admin_settings'] = new ConvertKit_Admin_Settings(); | |
| 99 | - $this->classes['admin_setup_wizard_landing_page'] = new ConvertKit_Admin_Setup_Wizard_Landing_Page(); | |
| 100 | - $this->classes['admin_setup_wizard_plugin'] = new ConvertKit_Admin_Setup_Wizard_Plugin(); | |
| 101 | - $this->classes['admin_setup_wizard_restrict_content'] = new ConvertKit_Admin_Setup_Wizard_Restrict_Content(); | |
| 67 | + $this->classes['admin_bulk_edit'] = new ConvertKit_Admin_Bulk_Edit(); | |
| 68 | + $this->classes['admin_cache_plugins'] = new ConvertKit_Admin_Cache_Plugins(); | |
| 69 | + $this->classes['admin_category'] = new ConvertKit_Admin_Category(); | |
| 70 | + $this->classes['admin_landing_page'] = new ConvertKit_Admin_Landing_Page(); | |
| 71 | + $this->classes['admin_notices'] = new ConvertKit_Admin_Notices(); | |
| 72 | + $this->classes['admin_post'] = new ConvertKit_Admin_Post(); | |
| 73 | + $this->classes['admin_quick_edit'] = new ConvertKit_Admin_Quick_Edit(); | |
| 74 | + $this->classes['admin_refresh_resources'] = new ConvertKit_Admin_Refresh_Resources(); | |
| 75 | + $this->classes['admin_restrict_content'] = new ConvertKit_Admin_Restrict_Content(); | |
| 76 | + $this->classes['admin_settings'] = new ConvertKit_Admin_Settings(); | |
| 77 | + $this->classes['admin_setup_wizard_landing_page'] = new ConvertKit_Admin_Setup_Wizard_Landing_Page(); | |
| 78 | + $this->classes['admin_setup_wizard_plugin'] = new ConvertKit_Admin_Setup_Wizard_Plugin(); | |
| 79 | + $this->classes['admin_setup_wizard_restrict_content'] = new ConvertKit_Admin_Setup_Wizard_Restrict_Content(); | |
| 80 | + $this->classes['admin_tinymce'] = new ConvertKit_Admin_TinyMCE(); | |
| 81 | + $this->classes['admin_user'] = new ConvertKit_Admin_User(); | |
| 102 | 82 | |
| 103 | 83 | /** |
| 104 | 84 | * Initialize integration classes for the WordPress Administration interface. |
| 105 | 85 | * |
| @@ -183,37 +163,35 @@ | ||
| 183 | 163 | * @since 1.9.6 |
| 184 | 164 | */ |
| 185 | 165 | private function initialize_global() { |
| 186 | 166 | |
| 187 | - $this->classes['admin_notices'] = new ConvertKit_Admin_Notices(); | |
| 188 | - $this->classes['admin_tinymce'] = new ConvertKit_Admin_TinyMCE(); | |
| 189 | - $this->classes['admin_refresh_resources'] = new ConvertKit_Admin_Refresh_Resources(); | |
| 190 | - $this->classes['blocks_convertkit_broadcasts'] = new ConvertKit_Block_Broadcasts(); | |
| 191 | - $this->classes['blocks_convertkit_content'] = new ConvertKit_Block_Content(); | |
| 192 | - $this->classes['blocks_convertkit_formtrigger'] = new ConvertKit_Block_Form_Trigger(); | |
| 193 | - $this->classes['blocks_convertkit_form'] = new ConvertKit_Block_Form(); | |
| 194 | - $this->classes['blocks_convertkit_form_builder'] = new ConvertKit_Block_Form_Builder(); | |
| 195 | - $this->classes['blocks_convertkit_form_builder_field_email'] = new ConvertKit_Block_Form_Builder_Field_Email(); | |
| 196 | - $this->classes['blocks_convertkit_form_builder_field_name'] = new ConvertKit_Block_Form_Builder_Field_Name(); | |
| 197 | - $this->classes['blocks_convertkit_form_builder_field_custom'] = new ConvertKit_Block_Form_Builder_Field_Custom(); | |
| 198 | - $this->classes['blocks_convertkit_product'] = new ConvertKit_Block_Product(); | |
| 199 | - $this->classes['block_formatter_form_link'] = new ConvertKit_Block_Formatter_Form_Link(); | |
| 200 | - $this->classes['block_formatter_product_link'] = new ConvertKit_Block_Formatter_Product_Link(); | |
| 201 | - $this->classes['pre_publish_action_broadcast_export'] = new ConvertKit_Pre_Publish_Action_Broadcast_Export(); | |
| 202 | - $this->classes['plugin_sidebar_post_settings'] = new ConvertKit_Plugin_Sidebar_Post_Settings(); | |
| 203 | - $this->classes['broadcasts_exporter'] = new ConvertKit_Broadcasts_Exporter(); | |
| 204 | - $this->classes['broadcasts_importer'] = new ConvertKit_Broadcasts_Importer(); | |
| 205 | - $this->classes['elementor'] = new ConvertKit_Elementor(); | |
| 206 | - $this->classes['gutenberg'] = new ConvertKit_Gutenberg(); | |
| 207 | - $this->classes['mcp'] = new ConvertKit_MCP(); | |
| 208 | - $this->classes['media_library'] = new ConvertKit_Media_Library(); | |
| 209 | - $this->classes['output_restrict_content'] = new ConvertKit_Output_Restrict_Content(); | |
| 210 | - $this->classes['restrict_content_cache'] = new ConvertKit_Restrict_Content_Cache(); | |
| 211 | - $this->classes['review_request'] = new ConvertKit_Review_Request( 'Kit', 'convertkit', CONVERTKIT_PLUGIN_PATH ); | |
| 212 | - $this->classes['preview_output'] = new ConvertKit_Preview_Output(); | |
| 213 | - $this->classes['setup'] = new ConvertKit_Setup(); | |
| 214 | - $this->classes['shortcodes'] = new ConvertKit_Shortcodes(); | |
| 167 | + $this->classes['ajax'] = new ConvertKit_AJAX(); | |
| 168 | + $this->classes['blocks_convertkit_broadcasts'] = new ConvertKit_Block_Broadcasts(); | |
| 169 | + $this->classes['blocks_convertkit_content'] = new ConvertKit_Block_Content(); | |
| 170 | + $this->classes['blocks_convertkit_formtrigger'] = new ConvertKit_Block_Form_Trigger(); | |
| 171 | + $this->classes['blocks_convertkit_form'] = new ConvertKit_Block_Form(); | |
| 172 | + $this->classes['blocks_convertkit_product'] = new ConvertKit_Block_Product(); | |
| 173 | + $this->classes['block_formatter_form_link'] = new ConvertKit_Block_Formatter_Form_Link(); | |
| 174 | + $this->classes['block_formatter_product_link'] = new ConvertKit_Block_Formatter_Product_Link(); | |
| 175 | + $this->classes['pre_publish_action_broadcast_export'] = new ConvertKit_Pre_Publish_Action_Broadcast_Export(); | |
| 176 | + $this->classes['broadcasts_exporter'] = new ConvertKit_Broadcasts_Exporter(); | |
| 177 | + $this->classes['broadcasts_importer'] = new ConvertKit_Broadcasts_Importer(); | |
| 178 | + $this->classes['divi'] = new ConvertKit_Divi(); | |
| 179 | + $this->classes['elementor'] = new ConvertKit_Elementor(); | |
| 180 | + $this->classes['gutenberg'] = new ConvertKit_Gutenberg(); | |
| 181 | + $this->classes['media_library'] = new ConvertKit_Media_Library(); | |
| 182 | + $this->classes['output_restrict_content'] = new ConvertKit_Output_Restrict_Content(); | |
| 183 | + $this->classes['review_request'] = new ConvertKit_Review_Request( 'Kit', 'convertkit', CONVERTKIT_PLUGIN_PATH ); | |
| 184 | + $this->classes['preview_output'] = new ConvertKit_Preview_Output(); | |
| 185 | + $this->classes['setup'] = new ConvertKit_Setup(); | |
| 186 | + $this->classes['shortcodes'] = new ConvertKit_Shortcodes(); | |
| 187 | + $this->classes['widgets'] = new ConvertKit_Widgets(); | |
| 215 | 188 | |
| 189 | + // Run the setup's update process on WordPress' init hook. | |
| 190 | + // Doing this sooner may result in errors with WordPress functions that are not yet | |
| 191 | + // available to the update routine. | |
| 192 | + add_action( 'init', array( $this, 'init' ) ); | |
| 193 | + | |
| 216 | 194 | /** |
| 217 | 195 | * Initialize integration classes for the frontend web site. |
| 218 | 196 | * |
| 219 | 197 | * @since 1.9.6 |
| @@ -222,54 +200,8 @@ | ||
| 222 | 200 | |
| 223 | 201 | } |
| 224 | 202 | |
| 225 | 203 | /** |
| 226 | - * Initializes the MCP server if enabled in the Plugin's settings. | |
| 227 | - * | |
| 228 | - * @since 3.4.0 | |
| 229 | - */ | |
| 230 | - public function initialize_mcp() { | |
| 231 | - | |
| 232 | - // Bail if the MCP server is not enabled. | |
| 233 | - $settings = new ConvertKit_Settings_MCP(); | |
| 234 | - if ( ! $settings->enabled() ) { | |
| 235 | - return; | |
| 236 | - } | |
| 237 | - | |
| 238 | - // Bail if the Abilities API is unavailable (WordPress < 6.9). | |
| 239 | - if ( ! function_exists( 'wp_register_ability' ) ) { | |
| 240 | - return; | |
| 241 | - } | |
| 242 | - | |
| 243 | - // Bail if PHP 7.4+ is not installed, as this is required for the MCP Adapter classes. | |
| 244 | - if ( version_compare( PHP_VERSION, '7.4', '<' ) ) { | |
| 245 | - return; | |
| 246 | - } | |
| 247 | - | |
| 248 | - // Load MCP Adapter if another Plugin hasn't already loaded it. | |
| 249 | - if ( ! class_exists( 'WP\\MCP\\Core\\McpAdapter' ) ) { | |
| 250 | - // Bail if the WordPress MCP Adapter autoloader is missing. | |
| 251 | - if ( ! file_exists( CONVERTKIT_PLUGIN_PATH . '/vendor/autoload.php' ) ) { | |
| 252 | - return; | |
| 253 | - } | |
| 254 | - | |
| 255 | - // Load MCP Adapter. | |
| 256 | - require_once CONVERTKIT_PLUGIN_PATH . '/vendor/autoload.php'; | |
| 257 | - | |
| 258 | - // Bail if the MCP Adapter class doesn't exist - something went wrong with the autoloader. | |
| 259 | - if ( ! class_exists( 'WP\\MCP\\Core\\McpAdapter' ) ) { // @phpstan-ignore-line | |
| 260 | - return; | |
| 261 | - } | |
| 262 | - } | |
| 263 | - | |
| 264 | - // Bootstrap the MCP Adapter, per WordPress/mcp-adapter's recommended | |
| 265 | - // integration pattern. | |
| 266 | - // @see https://github.com/WordPress/mcp-adapter#using-mcp-adapter-in-your-plugin. | |
| 267 | - \WP\MCP\Core\McpAdapter::instance(); | |
| 268 | - | |
| 269 | - } | |
| 270 | - | |
| 271 | - /** | |
| 272 | 204 | * Runs the Plugin's initialization and update routines, which checks if |
| 273 | 205 | * the Plugin has just been updated to a newer version, |
| 274 | 206 | * and if so runs any specific processes that might be needed. |
| 275 | 207 | * |
| @@ -274,9 +206,9 @@ | ||
| 274 | 206 | * and if so runs any specific processes that might be needed. |
| 275 | 207 | * |
| 276 | 208 | * @since 1.9.7.4 |
| 277 | 209 | */ |
| 278 | - public function setup() { | |
| 210 | + public function init() { | |
| 279 | 211 | |
| 280 | 212 | $this->get_class( 'setup' )->initialize(); |
| 281 | 213 | $this->get_class( 'setup' )->update(); |
| 282 | 214 | |
| @@ -298,15 +230,15 @@ | ||
| 298 | 230 | } |
| 299 | 231 | |
| 300 | 232 | // Pro. |
| 301 | 233 | if ( array_key_exists( 'REQUEST_URI', $_SERVER ) ) { |
| 302 | - if ( strpos( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ), '/pro/' ) !== false ) { | |
| 234 | + if ( strpos( sanitize_text_field( $_SERVER['REQUEST_URI'] ), '/pro/' ) !== false ) { | |
| 303 | 235 | return true; |
| 304 | 236 | } |
| 305 | - if ( strpos( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ), '/x/' ) !== false ) { | |
| 237 | + if ( strpos( sanitize_text_field( $_SERVER['REQUEST_URI'] ), '/x/' ) !== false ) { | |
| 306 | 238 | return true; |
| 307 | 239 | } |
| 308 | - if ( strpos( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ), 'cornerstone-endpoint' ) !== false ) { | |
| 240 | + if ( strpos( sanitize_text_field( $_SERVER['REQUEST_URI'] ), 'cornerstone-endpoint' ) !== false ) { | |
| 309 | 241 | return true; |
| 310 | 242 | } |
| 311 | 243 | } |
| 312 | 244 | |
| @@ -338,9 +270,9 @@ | ||
| 338 | 270 | return true; |
| 339 | 271 | } |
| 340 | 272 | |
| 341 | 273 | // Elementor. |
| 342 | - if ( array_key_exists( 'action', $_REQUEST ) && sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ) === 'elementor' ) { | |
| 274 | + if ( array_key_exists( 'action', $_REQUEST ) && sanitize_text_field( $_REQUEST['action'] ) === 'elementor' ) { | |
| 343 | 275 | return true; |
| 344 | 276 | } |
| 345 | 277 | |
| 346 | 278 | // Kallyas. |
| @@ -368,9 +300,9 @@ | ||
| 368 | 300 | return true; |
| 369 | 301 | } |
| 370 | 302 | |
| 371 | 303 | // Zion Builder. |
| 372 | - if ( array_key_exists( 'action', $_REQUEST ) && sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ) === 'zion_builder_active' ) { | |
| 304 | + if ( array_key_exists( 'action', $_REQUEST ) && sanitize_text_field( $_REQUEST['action'] ) === 'zion_builder_active' ) { | |
| 373 | 305 | return true; |
| 374 | 306 | } |
| 375 | 307 | |
| 376 | 308 | // Assume we're not in the Administration interface. |
| @@ -422,9 +354,30 @@ | ||
| 422 | 354 | * @return bool Is WP CRON Request |
| 423 | 355 | */ |
| 424 | 356 | public function is_cron() { |
| 425 | 357 | |
| 426 | - return wp_doing_cron(); | |
| 358 | + if ( ! defined( 'DOING_CRON' ) ) { | |
| 359 | + return false; | |
| 360 | + } | |
| 361 | + if ( ! DOING_CRON ) { | |
| 362 | + return false; | |
| 363 | + } | |
| 364 | + | |
| 365 | + return true; | |
| 366 | + | |
| 367 | + } | |
| 368 | + | |
| 369 | + /** | |
| 370 | + * Loads the plugin's translated strings, if available. | |
| 371 | + * | |
| 372 | + * @since 1.0.0 | |
| 373 | + */ | |
| 374 | + public function load_language_files() { | |
| 375 | + | |
| 376 | + // If the .mo file for a given language is available in WP_LANG_DIR/convertkit | |
| 377 | + // i.e. it's available as a translation at https://translate.wordpress.org/projects/wp-plugins/convertkit/, | |
| 378 | + // it will be used instead of the .mo file in convertkit/languages. | |
| 379 | + load_plugin_textdomain( 'convertkit', false, 'convertkit/languages' ); | |
| 427 | 380 | |
| 428 | 381 | } |
| 429 | 382 | |
| 430 | 383 | /** |