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 +128 -72 2.2.93.4.3 View file →
@@ -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,21 +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_cache_plugins'] = new ConvertKit_Admin_Cache_Plugins();
69 - $this->classes['admin_category'] = new ConvertKit_Admin_Category();
70 - $this->classes['admin_notices'] = new ConvertKit_Admin_Notices();
71 - $this->classes['admin_post'] = new ConvertKit_Admin_Post();
72 - $this->classes['admin_quick_edit'] = new ConvertKit_Admin_Quick_Edit();
73 - $this->classes['admin_refresh_resources'] = new ConvertKit_Admin_Refresh_Resources();
74 - $this->classes['admin_restrict_content'] = new ConvertKit_Admin_Restrict_Content();
75 - $this->classes['admin_settings'] = new ConvertKit_Admin_Settings();
76 - $this->classes['admin_setup_wizard_plugin'] = new ConvertKit_Admin_Setup_Wizard_Plugin();
77 - $this->classes['admin_setup_wizard_restrict_content'] = new ConvertKit_Admin_Setup_Wizard_Restrict_Content();
78 - $this->classes['admin_tinymce'] = new ConvertKit_Admin_TinyMCE();
79 - $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();
80 102
81 103 /**
82 104 * Initialize integration classes for the WordPress Administration interface.
83 105 *
@@ -140,10 +162,11 @@
140 162 if ( is_admin() ) {
141 163 return;
142 164 }
143 165
144 - $this->classes['output'] = new ConvertKit_Output();
145 - $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();
146 169
147 170 /**
148 171 * Initialize integration classes for the frontend web site.
149 172 *
@@ -160,31 +183,38 @@
160 183 * @since 1.9.6
161 184 */
162 185 private function initialize_global() {
163 186
164 - $this->classes['ajax'] = new ConvertKit_AJAX();
165 - $this->classes['blocks_convertkit_broadcasts'] = new ConvertKit_Block_Broadcasts();
166 - $this->classes['blocks_convertkit_content'] = new ConvertKit_Block_Content();
167 - $this->classes['blocks_convertkit_formtrigger'] = new ConvertKit_Block_Form_Trigger();
168 - $this->classes['blocks_convertkit_form'] = new ConvertKit_Block_Form();
169 - $this->classes['blocks_convertkit_product'] = new ConvertKit_Block_Product();
170 - $this->classes['block_formatter_form_link'] = new ConvertKit_Block_Formatter_Form_Link();
171 - $this->classes['block_formatter_product_link'] = new ConvertKit_Block_Formatter_Product_Link();
172 - $this->classes['broadcasts_importer'] = new ConvertKit_Broadcasts_Importer();
173 - $this->classes['elementor'] = new ConvertKit_Elementor();
174 - $this->classes['gutenberg'] = new ConvertKit_Gutenberg();
175 - $this->classes['media_library'] = new ConvertKit_Media_Library();
176 - $this->classes['review_request'] = new ConvertKit_Review_Request( 'ConvertKit', 'convertkit', CONVERTKIT_PLUGIN_PATH );
177 - $this->classes['preview_output'] = new ConvertKit_Preview_Output();
178 - $this->classes['setup'] = new ConvertKit_Setup();
179 - $this->classes['shortcodes'] = new ConvertKit_Shortcodes();
180 - $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();
181 216
182 - // Run the setup's update process on WordPress' init hook.
183 - // Doing this sooner may result in errors with WordPress functions that are not yet
184 - // available to the update routine.
185 - add_action( 'init', array( $this, 'update' ) );
186 -
187 217 /**
188 218 * Initialize integration classes for the frontend web site.
189 219 *
190 220 * @since 1.9.6
@@ -193,16 +223,63 @@
193 223
194 224 }
195 225
196 226 /**
197 - * 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
198 274 * the Plugin has just been updated to a newer version,
199 275 * and if so runs any specific processes that might be needed.
200 276 *
201 277 * @since 1.9.7.4
202 278 */
203 - public function update() {
279 + public function setup() {
204 280
281 + $this->get_class( 'setup' )->initialize();
205 282 $this->get_class( 'setup' )->update();
206 283
207 284 }
208 285
@@ -222,15 +299,15 @@
222 299 }
223 300
224 301 // Pro.
225 302 if ( array_key_exists( 'REQUEST_URI', $_SERVER ) ) {
226 - if ( strpos( sanitize_text_field( $_SERVER['REQUEST_URI'] ), '/pro/' ) !== false ) {
303 + if ( strpos( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ), '/pro/' ) !== false ) {
227 304 return true;
228 305 }
229 - if ( strpos( sanitize_text_field( $_SERVER['REQUEST_URI'] ), '/x/' ) !== false ) {
306 + if ( strpos( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ), '/x/' ) !== false ) {
230 307 return true;
231 308 }
232 - 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 ) {
233 310 return true;
234 311 }
235 312 }
236 313
@@ -262,9 +339,9 @@
262 339 return true;
263 340 }
264 341
265 342 // Elementor.
266 - 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' ) {
267 344 return true;
268 345 }
269 346
270 347 // Kallyas.
@@ -292,9 +369,9 @@
292 369 return true;
293 370 }
294 371
295 372 // Zion Builder.
296 - 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' ) {
297 374 return true;
298 375 }
299 376
300 377 // Assume we're not in the Administration interface.
@@ -346,34 +423,13 @@
346 423 * @return bool Is WP CRON Request
347 424 */
348 425 public function is_cron() {
349 426
350 - if ( ! defined( 'DOING_CRON' ) ) {
351 - return false;
352 - }
353 - if ( ! DOING_CRON ) {
354 - return false;
355 - }
427 + return wp_doing_cron();
356 428
357 - return true;
358 -
359 429 }
360 430
361 431 /**
362 - * Loads the plugin's translated strings, if available.
363 - *
364 - * @since 1.0.0
365 - */
366 - public function load_language_files() {
367 -
368 - // If the .mo file for a given language is available in WP_LANG_DIR/convertkit
369 - // i.e. it's available as a translation at https://translate.wordpress.org/projects/wp-plugins/convertkit/,
370 - // it will be used instead of the .mo file in convertkit/languages.
371 - load_plugin_textdomain( 'convertkit', false, 'convertkit/languages' );
372 -
373 - }
374 -
375 - /**
376 432 * Returns the given class
377 433 *
378 434 * @since 1.9.6
379 435 *
@@ -389,9 +445,9 @@
389 445 $error = new WP_Error(
390 446 'convertkit_get_class',
391 447 sprintf(
392 448 /* translators: %1$s: PHP class name */
393 - __( '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' ),
394 450 $name
395 451 )
396 452 );
397 453
@@ -399,9 +455,9 @@
399 455 // Admin UI.
400 456 if ( is_admin() ) {
401 457 wp_die(
402 458 esc_attr( $error->get_error_message() ),
403 - esc_html__( 'ConvertKit Error', 'convertkit' ),
459 + esc_html__( 'Kit Error', 'convertkit' ),
404 460 array(
405 461 'back_link' => true,
406 462 )
407 463 );