PluginProbe
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages / 3.4.3
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages v3.4.3
3.4.3 3.4.2 3.4.1 3.4.0 3.3.9 3.3.8 3.3.7 3.3.6 3.3.5 3.3.4 3.3.3 3.3.2 3.3.1 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.2.7 2.2.8 2.2.9 2.3.0 2.3.1 All 196 releases
← All changes | includes/class-wp-convertkit.php +130 -68 2.2.13.4.3 View file →
@@ -20,9 +20,9 @@
20 20 * @since 1.9.6
21 21 *
22 22 * @var object
23 23 */
24 - public static $instance;
24 + private static $instance;
25 25
26 26 /**
27 27 * Holds singleton initialized classes that include
28 28 * action and filter hooks.
@@ -39,18 +39,34 @@
39 39 * @since 1.9.6
40 40 */
41 41 public function __construct() {
42 42
43 - // Initialize class(es) to register hooks.
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 +
44 62 $this->initialize_admin();
45 63 $this->initialize_admin_or_frontend_editor();
46 64 $this->initialize_cli_cron();
47 65 $this->initialize_frontend();
48 66 $this->initialize_global();
67 + $this->initialize_mcp();
49 68
50 - // Load language files.
51 - add_action( 'init', array( $this, 'load_language_files' ) );
52 -
53 69 }
54 70
55 71 /**
56 72 * Initialize classes for the WordPress Administration interface
@@ -63,20 +79,27 @@
63 79 if ( ! is_admin() ) {
64 80 return;
65 81 }
66 82
67 - $this->classes['admin_bulk_edit'] = new ConvertKit_Admin_Bulk_Edit();
68 - $this->classes['admin_category'] = new ConvertKit_Admin_Category();
69 - $this->classes['admin_notices'] = new ConvertKit_Admin_Notices();
70 - $this->classes['admin_post'] = new ConvertKit_Admin_Post();
71 - $this->classes['admin_quick_edit'] = new ConvertKit_Admin_Quick_Edit();
72 - $this->classes['admin_refresh_resources'] = new ConvertKit_Admin_Refresh_Resources();
73 - $this->classes['admin_restrict_content'] = new ConvertKit_Admin_Restrict_Content();
74 - $this->classes['admin_settings'] = new ConvertKit_Admin_Settings();
75 - $this->classes['admin_setup_wizard_plugin'] = new ConvertKit_Admin_Setup_Wizard_Plugin();
76 - $this->classes['admin_setup_wizard_restrict_content'] = new ConvertKit_Admin_Setup_Wizard_Restrict_Content();
77 - $this->classes['admin_tinymce'] = new ConvertKit_Admin_TinyMCE();
78 - $this->classes['admin_user'] = new ConvertKit_Admin_User();
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();
79 102
80 103 /**
81 104 * Initialize integration classes for the WordPress Administration interface.
82 105 *
@@ -139,10 +162,11 @@
139 162 if ( is_admin() ) {
140 163 return;
141 164 }
142 165
143 - $this->classes['output'] = new ConvertKit_Output();
144 - $this->classes['output_restrict_content'] = new ConvertKit_Output_Restrict_Content();
166 + $this->classes['cache_plugins'] = new ConvertKit_Cache_Plugins();
167 + $this->classes['output'] = new ConvertKit_Output();
168 + $this->classes['output_broadcasts'] = new ConvertKit_Output_Broadcasts();
145 169
146 170 /**
147 171 * Initialize integration classes for the frontend web site.
148 172 *
@@ -159,29 +183,38 @@
159 183 * @since 1.9.6
160 184 */
161 185 private function initialize_global() {
162 186
163 - $this->classes['ajax'] = new ConvertKit_AJAX();
164 - $this->classes['blocks_convertkit_broadcasts'] = new ConvertKit_Block_Broadcasts();
165 - $this->classes['blocks_convertkit_content'] = new ConvertKit_Block_Content();
166 - $this->classes['blocks_convertkit_form_trigger'] = new ConvertKit_Block_Form_Trigger();
167 - $this->classes['blocks_convertkit_form'] = new ConvertKit_Block_Form();
168 - $this->classes['blocks_convertkit_product'] = new ConvertKit_Block_Product();
169 - $this->classes['block_formatter_form_link'] = new ConvertKit_Block_Formatter_Form_Link();
170 - $this->classes['block_formatter_product_link'] = new ConvertKit_Block_Formatter_Product_Link();
171 - $this->classes['elementor'] = new ConvertKit_Elementor();
172 - $this->classes['gutenberg'] = new ConvertKit_Gutenberg();
173 - $this->classes['review_request'] = new ConvertKit_Review_Request( 'ConvertKit', 'convertkit', CONVERTKIT_PLUGIN_PATH );
174 - $this->classes['preview_output'] = new ConvertKit_Preview_Output();
175 - $this->classes['setup'] = new ConvertKit_Setup();
176 - $this->classes['shortcodes'] = new ConvertKit_Shortcodes();
177 - $this->classes['widgets'] = new ConvertKit_Widgets();
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_member_content_login'] = new ConvertKit_Block_Member_Content_Login();
199 + $this->classes['blocks_convertkit_product'] = new ConvertKit_Block_Product();
200 + $this->classes['block_formatter_form_link'] = new ConvertKit_Block_Formatter_Form_Link();
201 + $this->classes['block_formatter_product_link'] = new ConvertKit_Block_Formatter_Product_Link();
202 + $this->classes['pre_publish_action_broadcast_export'] = new ConvertKit_Pre_Publish_Action_Broadcast_Export();
203 + $this->classes['plugin_sidebar_post_settings'] = new ConvertKit_Plugin_Sidebar_Post_Settings();
204 + $this->classes['broadcasts_exporter'] = new ConvertKit_Broadcasts_Exporter();
205 + $this->classes['broadcasts_importer'] = new ConvertKit_Broadcasts_Importer();
206 + $this->classes['elementor'] = new ConvertKit_Elementor();
207 + $this->classes['gutenberg'] = new ConvertKit_Gutenberg();
208 + $this->classes['mcp'] = new ConvertKit_MCP();
209 + $this->classes['media_library'] = new ConvertKit_Media_Library();
210 + $this->classes['output_restrict_content'] = new ConvertKit_Output_Restrict_Content();
211 + $this->classes['restrict_content_cache'] = new ConvertKit_Restrict_Content_Cache();
212 + $this->classes['review_request'] = new ConvertKit_Review_Request( 'Kit', 'convertkit', CONVERTKIT_PLUGIN_PATH );
213 + $this->classes['preview_output'] = new ConvertKit_Preview_Output();
214 + $this->classes['setup'] = new ConvertKit_Setup();
215 + $this->classes['shortcodes'] = new ConvertKit_Shortcodes();
178 216
179 - // Run the setup's update process on WordPress' init hook.
180 - // Doing this sooner may result in errors with WordPress functions that are not yet
181 - // available to the update routine.
182 - add_action( 'init', array( $this, 'update' ) );
183 -
184 217 /**
185 218 * Initialize integration classes for the frontend web site.
186 219 *
187 220 * @since 1.9.6
@@ -190,16 +223,63 @@
190 223
191 224 }
192 225
193 226 /**
194 - * Runs the Plugin's update routine, which checks if
227 + * Initializes the MCP server if enabled in the Plugin's settings.
228 + *
229 + * @since 3.4.0
230 + */
231 + public function initialize_mcp() {
232 +
233 + // Bail if the MCP server is not enabled.
234 + $settings = new ConvertKit_Settings_MCP();
235 + if ( ! $settings->enabled() ) {
236 + return;
237 + }
238 +
239 + // Bail if the Abilities API is unavailable (WordPress < 6.9).
240 + if ( ! function_exists( 'wp_register_ability' ) ) {
241 + return;
242 + }
243 +
244 + // Bail if PHP 7.4+ is not installed, as this is required for the MCP Adapter classes.
245 + if ( version_compare( PHP_VERSION, '7.4', '<' ) ) {
246 + return;
247 + }
248 +
249 + // Load MCP Adapter if another Plugin hasn't already loaded it.
250 + if ( ! class_exists( 'WP\\MCP\\Core\\McpAdapter' ) ) {
251 + // Bail if the WordPress MCP Adapter autoloader is missing.
252 + if ( ! file_exists( CONVERTKIT_PLUGIN_PATH . '/vendor/autoload.php' ) ) {
253 + return;
254 + }
255 +
256 + // Load MCP Adapter.
257 + require_once CONVERTKIT_PLUGIN_PATH . '/vendor/autoload.php';
258 +
259 + // Bail if the MCP Adapter class doesn't exist - something went wrong with the autoloader.
260 + if ( ! class_exists( 'WP\\MCP\\Core\\McpAdapter' ) ) { // @phpstan-ignore-line
261 + return;
262 + }
263 + }
264 +
265 + // Bootstrap the MCP Adapter, per WordPress/mcp-adapter's recommended
266 + // integration pattern.
267 + // @see https://github.com/WordPress/mcp-adapter#using-mcp-adapter-in-your-plugin.
268 + \WP\MCP\Core\McpAdapter::instance();
269 +
270 + }
271 +
272 + /**
273 + * Runs the Plugin's initialization and update routines, which checks if
195 274 * the Plugin has just been updated to a newer version,
196 275 * and if so runs any specific processes that might be needed.
197 276 *
198 277 * @since 1.9.7.4
199 278 */
200 - public function update() {
279 + public function setup() {
201 280
281 + $this->get_class( 'setup' )->initialize();
202 282 $this->get_class( 'setup' )->update();
203 283
204 284 }
205 285
@@ -219,15 +299,15 @@
219 299 }
220 300
221 301 // Pro.
222 302 if ( array_key_exists( 'REQUEST_URI', $_SERVER ) ) {
223 - if ( strpos( sanitize_text_field( $_SERVER['REQUEST_URI'] ), '/pro/' ) !== false ) {
303 + if ( strpos( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ), '/pro/' ) !== false ) {
224 304 return true;
225 305 }
226 - if ( strpos( sanitize_text_field( $_SERVER['REQUEST_URI'] ), '/x/' ) !== false ) {
306 + if ( strpos( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ), '/x/' ) !== false ) {
227 307 return true;
228 308 }
229 - if ( strpos( sanitize_text_field( $_SERVER['REQUEST_URI'] ), 'cornerstone-endpoint' ) !== false ) {
309 + if ( strpos( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ), 'cornerstone-endpoint' ) !== false ) {
230 310 return true;
231 311 }
232 312 }
233 313
@@ -259,9 +339,9 @@
259 339 return true;
260 340 }
261 341
262 342 // Elementor.
263 - if ( array_key_exists( 'action', $_REQUEST ) && sanitize_text_field( $_REQUEST['action'] ) === 'elementor' ) {
343 + if ( array_key_exists( 'action', $_REQUEST ) && sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ) === 'elementor' ) {
264 344 return true;
265 345 }
266 346
267 347 // Kallyas.
@@ -289,9 +369,9 @@
289 369 return true;
290 370 }
291 371
292 372 // Zion Builder.
293 - if ( array_key_exists( 'action', $_REQUEST ) && sanitize_text_field( $_REQUEST['action'] ) === 'zion_builder_active' ) {
373 + if ( array_key_exists( 'action', $_REQUEST ) && sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ) === 'zion_builder_active' ) {
294 374 return true;
295 375 }
296 376
297 377 // Assume we're not in the Administration interface.
@@ -343,31 +423,13 @@
343 423 * @return bool Is WP CRON Request
344 424 */
345 425 public function is_cron() {
346 426
347 - if ( ! defined( 'DOING_CRON' ) ) {
348 - return false;
349 - }
350 - if ( ! DOING_CRON ) {
351 - return false;
352 - }
427 + return wp_doing_cron();
353 428
354 - return true;
355 -
356 429 }
357 430
358 431 /**
359 - * Loads plugin textdomain
360 - *
361 - * @since 1.0.0
362 - */
363 - public function load_language_files() {
364 -
365 - load_plugin_textdomain( 'convertkit', false, basename( dirname( CONVERTKIT_PLUGIN_FILE ) ) . '/languages/' ); // @phpstan-ignore-line.
366 -
367 - }
368 -
369 - /**
370 432 * Returns the given class
371 433 *
372 434 * @since 1.9.6
373 435 *
@@ -383,9 +445,9 @@
383 445 $error = new WP_Error(
384 446 'convertkit_get_class',
385 447 sprintf(
386 448 /* translators: %1$s: PHP class name */
387 - __( 'ConvertKit Error: Could not load Plugin class <strong>%1$s</strong>', 'convertkit' ),
449 + __( 'Kit Error: Could not load Plugin class <strong>%1$s</strong>', 'convertkit' ),
388 450 $name
389 451 )
390 452 );
391 453
@@ -393,9 +455,9 @@
393 455 // Admin UI.
394 456 if ( is_admin() ) {
395 457 wp_die(
396 458 esc_attr( $error->get_error_message() ),
397 - esc_html__( 'ConvertKit Error', 'convertkit' ),
459 + esc_html__( 'Kit Error', 'convertkit' ),
398 460 array(
399 461 'back_link' => true,
400 462 )
401 463 );
@@ -418,9 +480,9 @@
418 480 * @return object Class.
419 481 */
420 482 public static function get_instance() {
421 483
422 - if ( ! isset( self::$instance ) && ! ( self::$instance instanceof self ) ) { // @phpstan-ignore-line.
484 + if ( null === self::$instance ) {
423 485 self::$instance = new self();
424 486 }
425 487
426 488 return self::$instance;