PluginProbe
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages / 2.5.2
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages v2.5.2
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 2.3.2 All 195 releases
← All changes | includes/class-convertkit-setup.php +28 -432 3.3.92.5.2 View file →
@@ -22,32 +22,16 @@
22 22 */
23 23 public function activate() {
24 24
25 25 // Call any functions to e.g. schedule WordPress Cron events now.
26 - $this->schedule_cron_events();
26 + $posts = new ConvertKit_Resource_Posts( 'cron' );
27 + $posts->schedule_cron_event();
27 28
28 - // Install entries database table.
29 - $entries = new ConvertKit_Form_Entries();
30 - $entries->create_database_table();
31 -
32 29 }
33 30
34 31 /**
35 - * Runs routines on every Plugin request e.g.
36 - * ensuring WordPress Cron events are scheduled.
32 + * Runs routines when the Plugin version has been updated.
37 33 *
38 - * @since 2.6.6
39 - */
40 - public function initialize() {
41 -
42 - // Call any functions to e.g. schedule WordPress Cron events now.
43 - $this->schedule_cron_events();
44 -
45 - }
46 -
47 - /**
48 - * Runs routines if the Plugin version has been updated.
49 - *
50 34 * @since 1.9.7.4
51 35 */
52 36 public function update() {
53 37
@@ -60,52 +44,8 @@
60 44 return;
61 45 }
62 46
63 47 /**
64 - * 3.0.4: Add form_id to entries database table.
65 - */
66 - if ( version_compare( $current_version, '3.0.4', '<' ) ) {
67 - $this->add_form_id_column_and_key_to_form_entries_database_table();
68 - }
69 -
70 - /**
71 - * 3.0.0: Migrate reCAPTCHA settings from Restrict Content to General settings.
72 - * Install entries database table.
73 - */
74 - if ( version_compare( $current_version, '3.0.0', '<' ) ) {
75 - $this->migrate_recaptcha_settings();
76 -
77 - // Install entries database table.
78 - $entries = new ConvertKit_Form_Entries();
79 - $entries->create_database_table();
80 - }
81 -
82 - /**
83 - * 2.6.6: Migrate 'Default' Form value in _wp_convertkit_term_meta[form] from 0 to -1,
84 - * to match Posts.
85 - */
86 - if ( version_compare( $current_version, '2.6.6', '<' ) ) {
87 - $this->migrate_term_default_form_settings();
88 - }
89 -
90 - /**
91 - * 2.5.4: Migrate WishList Member to ConvertKit Form Mappings
92 - */
93 - if ( ! $current_version || version_compare( $current_version, '2.5.4', '<' ) ) {
94 - $this->migrate_wlm_none_setting();
95 - $this->migrate_wlm_form_tag_mapping_settings();
96 - }
97 -
98 - /**
99 - * 2.5.3: Migrate Third Party Form integrations' 'None' option values from `default` to blank.
100 - */
101 - if ( ! $current_version || version_compare( $current_version, '2.5.3', '<' ) ) {
102 - $this->migrate_contact_form_7_none_setting();
103 - $this->migrate_forminator_none_setting();
104 - $this->migrate_wlm_none_setting();
105 - }
106 -
107 - /**
108 48 * 2.5.2: Migrate Forminator to ConvertKit Form Mappings
109 49 */
110 50 if ( ! $current_version || version_compare( $current_version, '2.5.2', '<' ) ) {
111 51 $this->migrate_forminator_form_mapping_settings();
@@ -133,11 +73,19 @@
133 73 $this->migrate_term_form_settings();
134 74 }
135 75
136 76 /**
77 + * 1.6.1+: Refresh Forms, Landing Pages and Tags data stored in settings,
78 + * to get new Forms Builder Settings.
79 + */
80 + if ( version_compare( $current_version, '1.6.1', '<' ) ) {
81 + $this->refresh_resources();
82 + }
83 +
84 + /**
137 85 * 1.9.6+: Migrate _wp_convertkit_settings[default_form] to _wp_convertkit_settings[page_form] and
138 86 * _wp_convertkit_settings[post_form], now that each Post Type has its own Default Form setting
139 - * in Settings > Kit > General.
87 + * in Settings > ConvertKit > General.
140 88 */
141 89 if ( version_compare( $current_version, '1.9.6', '<' ) ) {
142 90 $this->migrate_default_form_settings();
143 91 }
@@ -150,13 +98,8 @@
150 98 $posts = new ConvertKit_Resource_Posts( 'cron' );
151 99 $posts->schedule_cron_event();
152 100 }
153 101
154 - // Actions that should run regardless of the version number
155 - // whenever the Plugin is updated.
156 - $this->remove_v3_api_secret_from_settings();
157 - $this->maybe_delete_old_cached_resource_structure();
158 -
159 102 // Update the installed version number in the options table.
160 103 update_option( 'convertkit_version', CONVERTKIT_PLUGIN_VERSION );
161 104
162 105 }
@@ -161,347 +104,8 @@
161 104
162 105 }
163 106
164 107 /**
165 - * Remove v3 API Secret from settings.
166 - *
167 - * @since 3.2.4
168 - */
169 - private function remove_v3_api_secret_from_settings() {
170 -
171 - $settings = new ConvertKit_Settings();
172 - $settings->save(
173 - array(
174 - 'api_secret' => '',
175 - )
176 - );
177 -
178 - }
179 -
180 - /**
181 - * Deletes any cached resources stored in the options table if they are a flat array
182 - * that originates from between 1.6.0 and 1.9.5.2 of the Plugin.
183 - * i.e. [id => name], rather than the expected [id => [id => '...', name => '...', ...]].
184 - *
185 - * This will permit the Resources classes to fetch and cache the Form resources correctly
186 - * from the API, and prevent fatal errors when a user activates the latest version of the Plugin
187 - * on a site that previously had a very old Plugin version installed.
188 - *
189 - * @since 3.2.5
190 - */
191 - private function maybe_delete_old_cached_resource_structure() {
192 -
193 - // Define the resource options to check.
194 - $resource_options = array(
195 - 'convertkit_forms',
196 - 'convertkit_landing_pages',
197 - 'convertkit_tags',
198 - );
199 -
200 - foreach ( $resource_options as $resource_option ) {
201 - // Get the resource option.
202 - $resource = get_option( $resource_option, false );
203 -
204 - // If the resource option does not exist, there's nothing to delete.
205 - if ( false === $resource ) {
206 - return;
207 - }
208 -
209 - // If the resource structure is correct e.g. [id => [name => '...']], there's nothing to delete.
210 - if ( is_array( reset( $resource ) ) ) {
211 - return;
212 - }
213 -
214 - // Delete the cached resource.
215 - delete_option( $resource_option );
216 - }
217 -
218 - }
219 -
220 - /**
221 - * Adds form_id column and key to form entries database table.
222 - *
223 - * @since 3.0.4
224 - */
225 - private function add_form_id_column_and_key_to_form_entries_database_table() {
226 -
227 - global $wpdb;
228 -
229 - // Check if the column exists.
230 - $exists = $wpdb->get_var(
231 - $wpdb->prepare(
232 - 'SELECT COLUMN_NAME
233 - FROM INFORMATION_SCHEMA.COLUMNS
234 - WHERE table_name = %s
235 - AND table_schema = %s
236 - AND column_name = %s',
237 - $wpdb->prefix . 'kit_form_entries',
238 - $wpdb->dbname,
239 - 'form_id'
240 - )
241 - );
242 -
243 - // If the column exists, don't add it again.
244 - if ( $exists === 'form_id' ) {
245 - return;
246 - }
247 -
248 - // Add the form_id column and key.
249 - $wpdb->query(
250 - $wpdb->prepare( 'ALTER TABLE %i ADD COLUMN `form_id` int(11) NOT NULL AFTER `custom_fields`', $wpdb->prefix . 'kit_form_entries' )
251 - );
252 - $wpdb->query(
253 - $wpdb->prepare( 'ALTER TABLE %i ADD KEY `form_id` (`form_id`)', $wpdb->prefix . 'kit_form_entries' )
254 - );
255 -
256 - }
257 -
258 - /**
259 - * 3.0.0: Migrate reCAPTCHA settings from Restrict Content settings to General settings.
260 - *
261 - * @since 3.0.0
262 - */
263 - private function migrate_recaptcha_settings() {
264 -
265 - // Read Restrict Content settings directly from options table,
266 - // as Convertkit_Settings_Restrict_Content won't have helper
267 - // methods to return the specific settings.
268 - $settings = get_option( '_wp_convertkit_settings_restrict_content' );
269 -
270 - // If no reCAPTCHA settings exist, bail.
271 - if ( ! isset( $settings['recaptcha_site_key'] ) || ! isset( $settings['recaptcha_secret_key'] ) || ! isset( $settings['recaptcha_minimum_score'] ) ) {
272 - return;
273 - }
274 -
275 - // Load settings class, saving the reCAPTCHA settings to the General settings.
276 - $convertkit_settings = new ConvertKit_Settings();
277 - $convertkit_settings->save(
278 - array(
279 - 'recaptcha_site_key' => $settings['recaptcha_site_key'],
280 - 'recaptcha_secret_key' => $settings['recaptcha_secret_key'],
281 - 'recaptcha_minimum_score' => $settings['recaptcha_minimum_score'],
282 - )
283 - );
284 -
285 - // Remove reCAPTCHA settings from Restrict Content settings.
286 - unset( $settings['recaptcha_site_key'] );
287 - unset( $settings['recaptcha_secret_key'] );
288 - unset( $settings['recaptcha_minimum_score'] );
289 - update_option( '_wp_convertkit_settings_restrict_content', $settings );
290 -
291 - }
292 -
293 - /**
294 - * Change the Default value of 0 to -1 in wp_convertkit_term_meta[form], to
295 - * match how the Default value is stored in Posts.
296 - *
297 - * @since 2.6.6
298 - */
299 - private function migrate_term_default_form_settings() {
300 -
301 - // Get all Terms that have ConvertKit settings defined.
302 - $query = new WP_Term_Query(
303 - array(
304 - 'taxonomy' => 'category',
305 - 'hide_empty' => false,
306 - 'fields' => 'ids',
307 - 'meta_query' => array(
308 - array(
309 - 'key' => '_wp_convertkit_term_meta',
310 - 'comparison' => 'EXISTS',
311 - ),
312 - ),
313 - )
314 - );
315 -
316 - // Bail if no Terms exist.
317 - if ( ! $query->terms ) {
318 - return;
319 - }
320 -
321 - // Iterate through Terms, mapping settings.
322 - foreach ( $query->terms as $term_id ) {
323 - $term_settings = new ConvertKit_Term( $term_id );
324 -
325 - // If the Form setting is Default i.e. it does not have a formchange it from 0 to -1.
326 - if ( ! $term_settings->has_form() ) {
327 - $term_settings->save(
328 - array(
329 - 'form' => -1,
330 - )
331 - );
332 - }
333 - }
334 -
335 - }
336 -
337 - /**
338 - * 2.5.4: Migrate WLM settings:
339 - * - Prefix any WishList Member to ConvertKit Form ID mappings with `form:`,
340 - * - Prefix any WishList Member to ConvertKit Tag ID mappings with `tag:`,
341 - * - Standardise the settings keys to the format {wlm_level_id}_subscribe
342 - * and {wlm_level_id}_unsubscribe.
343 - *
344 - * @since 2.5.4
345 - */
346 - private function migrate_wlm_form_tag_mapping_settings() {
347 -
348 - $convertkit_wlm_settings = new ConvertKit_Wishlist_Settings();
349 -
350 - // Bail if no settings exist.
351 - if ( ! $convertkit_wlm_settings->has_settings() ) {
352 - return;
353 - }
354 -
355 - // Define new array for settings.
356 - $settings = array();
357 -
358 - // Iterate through settings.
359 - foreach ( $convertkit_wlm_settings->get() as $key => $convertkit_form_or_tag_id ) {
360 - // Split the settings key.
361 - list( $wlm_level_id, $type ) = explode( '_', $key );
362 -
363 - switch ( $type ) {
364 - case 'form':
365 - // This is the action to perform when the user is added to the WLM Level.
366 - // Use a new name for the setting key to reflect this.
367 - // < 2.5.4, forms were the only option here, so prefix the resource ID with `form:`.
368 - $settings[ $wlm_level_id . '_add' ] = ( empty( $convertkit_form_or_tag_id ) ? '' : 'form:' . $convertkit_form_or_tag_id );
369 - break;
370 -
371 - case 'unsubscribe':
372 - // This is the action to perform when the user is removed from the WLM Level.
373 - // Use a new name for the setting key to reflect this.
374 - // < 2.5.4, tags were the only option here, so prefix the resource ID with `tag:`.
375 - $settings[ $wlm_level_id . '_remove' ] = ( empty( $convertkit_form_or_tag_id ) ? '' : 'tag:' . $convertkit_form_or_tag_id );
376 - break;
377 - }
378 - }
379 -
380 - // Update settings.
381 - update_option( $convertkit_wlm_settings::SETTINGS_NAME, $settings );
382 -
383 - }
384 -
385 - /**
386 - * 2.5.3: Migrate Third Party Form integrations' 'None' option values from `default` to blank.
387 - *
388 - * 2.4.9 changed the 'None' label's value from `default` to a blank string, as the v4 API's
389 - * `add_subscriber_to_form()` method introduces type declarations, which would result in
390 - * an uncaught TypeError when passing a non integer value.
391 - *
392 - * The PR for that (https://github.com/ConvertKit/convertkit-wordpress/pull/655) didn't include
393 - * any tests or upgrade/migration routines to change any existing saved settings where the 'None'
394 - * label's value was stored as `default`.
395 - */
396 - private function migrate_contact_form_7_none_setting() {
397 -
398 - $convertkit_contact_form_7_settings = new ConvertKit_ContactForm7_Settings();
399 -
400 - // Bail if no settings exist.
401 - if ( ! $convertkit_contact_form_7_settings->has_settings() ) {
402 - return;
403 - }
404 -
405 - // Get settings.
406 - $settings = $convertkit_contact_form_7_settings->get();
407 -
408 - // Iterate through settings.
409 - foreach ( $settings as $contact_form_7_form_id => $convertkit_form_id ) {
410 - // Skip keys that are non-numeric e.g. `creator_network_recommendations_*`.
411 - if ( ! is_numeric( $contact_form_7_form_id ) ) {
412 - continue;
413 - }
414 -
415 - // Change 'default' to a blank string.
416 - if ( $convertkit_form_id === 'default' ) {
417 - $settings[ $contact_form_7_form_id ] = '';
418 - }
419 - }
420 -
421 - // Update settings.
422 - update_option( $convertkit_contact_form_7_settings::SETTINGS_NAME, $settings );
423 -
424 - }
425 -
426 - /**
427 - * 2.5.3: Migrate Third Party Form integrations' 'None' option values from `default` to blank.
428 - *
429 - * 2.4.9 changed the 'None' label's value from `default` to a blank string, as the v4 API's
430 - * `add_subscriber_to_form()` method introduces type declarations, which would result in
431 - * an uncaught TypeError when passing a non integer value.
432 - *
433 - * The PR for that (https://github.com/ConvertKit/convertkit-wordpress/pull/655) didn't include
434 - * any tests or upgrade/migration routines to change any existing saved settings where the 'None'
435 - * label's value was stored as `default`.
436 - */
437 - private function migrate_forminator_none_setting() {
438 -
439 - $convertkit_forminator_settings = new ConvertKit_Forminator_Settings();
440 -
441 - // Bail if no settings exist.
442 - if ( ! $convertkit_forminator_settings->has_settings() ) {
443 - return;
444 - }
445 -
446 - // Get settings.
447 - $settings = $convertkit_forminator_settings->get();
448 -
449 - // Iterate through settings.
450 - foreach ( $settings as $forminator_form_id => $convertkit_form_id ) {
451 - // Skip keys that are non-numeric e.g. `creator_network_recommendations_*`.
452 - if ( ! is_numeric( $forminator_form_id ) ) {
453 - continue;
454 - }
455 -
456 - // Change 'default' to a blank string.
457 - if ( $convertkit_form_id === 'default' ) {
458 - $settings[ $forminator_form_id ] = '';
459 - }
460 - }
461 -
462 - // Update settings.
463 - update_option( $convertkit_forminator_settings::SETTINGS_NAME, $settings );
464 -
465 - }
466 -
467 - /**
468 - * 2.5.3: Migrate Third Party Form integrations' 'None' option values from `default` to blank.
469 - *
470 - * 2.4.9 changed the 'None' label's value from `default` to a blank string, as the v4 API's
471 - * `add_subscriber_to_form()` method introduces type declarations, which would result in
472 - * an uncaught TypeError when passing a non integer value.
473 - *
474 - * The PR for that (https://github.com/ConvertKit/convertkit-wordpress/pull/655) didn't include
475 - * any tests or upgrade/migration routines to change any existing saved settings where the 'None'
476 - * label's value was stored as `default`.
477 - */
478 - private function migrate_wlm_none_setting() {
479 -
480 - $convertkit_wlm_settings = new ConvertKit_Wishlist_Settings();
481 -
482 - // Bail if no settings exist.
483 - if ( ! $convertkit_wlm_settings->has_settings() ) {
484 - return;
485 - }
486 -
487 - // Get settings.
488 - $settings = $convertkit_wlm_settings->get();
489 -
490 - // Iterate through settings.
491 - foreach ( $settings as $wlm_level_id => $value ) {
492 - // Change 'default' to a blank string.
493 - if ( $value === 'default' ) {
494 - $settings[ $wlm_level_id ] = '';
495 - }
496 - }
497 -
498 - // Update settings.
499 - update_option( $convertkit_wlm_settings::SETTINGS_NAME, $settings );
500 -
501 - }
502 -
503 - /**
504 108 * 2.5.2: Prefix any Forminator to ConvertKit Form ID mappings with `form:`, now that
505 109 * the Plugin supports adding a subscriber to a Form, Tag or Sequence.
506 110 *
507 111 * @since 2.5.2
@@ -616,13 +220,12 @@
616 220 // Get Access Token by API Key and Secret.
617 221 $api = new ConvertKit_API_V4( CONVERTKIT_OAUTH_CLIENT_ID, CONVERTKIT_OAUTH_CLIENT_REDIRECT_URI );
618 222 $result = $api->get_access_token_by_api_key_and_secret(
619 223 $convertkit_settings->get_api_key(),
620 - $convertkit_settings->get_api_secret(),
621 - get_site_url()
224 + $convertkit_settings->get_api_secret()
622 225 );
623 226
624 - // Bail if an error occurred.
227 + // Bail if an error occured.
625 228 if ( is_wp_error( $result ) ) {
626 229 return;
627 230 }
628 231
@@ -685,9 +288,9 @@
685 288
686 289 /**
687 290 * 1.9.6+: Migrate _wp_convertkit_settings[default_form] to _wp_convertkit_settings[page_form] and
688 291 * _wp_convertkit_settings[post_form], now that each Post Type has its own Default Form setting
689 - * in Settings > Kit > General.
292 + * in Settings > ConvertKit > General.
690 293 */
691 294 private function migrate_default_form_settings() {
692 295
693 296 $convertkit_settings = new ConvertKit_Settings();
@@ -713,38 +316,31 @@
713 316
714 317 }
715 318
716 319 /**
717 - * Runs routines when the Plugin is deactivated.
718 - *
719 - * @since 1.9.7.4
320 + * 1.6.1: Refresh Forms, Landing Pages and Tags data stored in settings,
321 + * to get new Forms Builder Settings.
720 322 */
721 - public function deactivate() {
323 + private function refresh_resources() {
722 324
723 - // Call any functions to e.g. unschedule WordPress Cron events now.
724 - $this->unschedule_cron_events();
325 + $forms = new ConvertKit_Resource_Forms( 'setup' );
326 + $landing_pages = new ConvertKit_Resource_Landing_Pages( 'setup' );
327 + $tags = new ConvertKit_Resource_Tags( 'setup' );
725 328
726 - }
329 + $forms->refresh();
330 + $landing_pages->refresh();
331 + $tags->refresh();
727 332
728 - /**
729 - * Schedules any Plugin specific CRON events, if they do not already exist.
730 - *
731 - * @since 2.6.6
732 - */
733 - private function schedule_cron_events() {
734 -
735 - $posts = new ConvertKit_Resource_Posts( 'cron' );
736 - $posts->schedule_cron_event();
737 -
738 333 }
739 334
740 335 /**
741 - * Unschedules any Plugin specific CRON events, if they exist.
336 + * Runs routines when the Plugin is deactivated.
742 337 *
743 - * @since 2.6.6
338 + * @since 1.9.7.4
744 339 */
745 - private function unschedule_cron_events() {
340 + public function deactivate() {
746 341
342 + // Call any functions to e.g. unschedule WordPress Cron events now.
747 343 $posts = new ConvertKit_Resource_Posts( 'cron' );
748 344 $posts->unschedule_cron_event();
749 345
750 346 }