PluginProbe
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages / 3.3.3
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages v3.3.3
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 2.3.3 All 194 releases
convertkit / includes / functions.php

functions.php in Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages 3.3.3, at includes/functions.php

886 lines 20.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * ConvertKit general plugin functions.
4 *
5 * @package ConvertKit
6 * @author ConvertKit
7 */
8
9 /**
10 * Runs the activation and update routines when the plugin is activated.
11 *
12 * @since 1.9.7.4
13 *
14 * @param bool $network_wide Is network wide activation.
15 */
16 function convertkit_plugin_activate( $network_wide ) {
17
18 // Initialise Plugin.
19 $convertkit = WP_ConvertKit();
20 $convertkit->initialize();
21
22 // Check if we are on a multisite install, activating network wide, or a single install.
23 if ( ! is_multisite() || ! $network_wide ) {
24 // Single Site activation.
25 $convertkit->get_class( 'setup' )->activate();
26
27 // Set a transient for 30 seconds to redirect to the setup screen on activation.
28 set_transient( 'convertkit-setup', true, 30 );
29 } else {
30 // Multisite network wide activation.
31 $sites = get_sites(
32 array(
33 'number' => 0,
34 )
35 );
36 foreach ( $sites as $site ) {
37 switch_to_blog( (int) $site->blog_id );
38 $convertkit->get_class( 'setup' )->activate();
39 restore_current_blog();
40 }
41 }
42
43 }
44
45 /**
46 * Runs the activation and update routines when the plugin is activated
47 * on a WordPress multisite setup.
48 *
49 * @since 1.9.7.4
50 *
51 * @param WP_Site|int $site_or_blog_id WP_Site or Blog ID.
52 */
53 function convertkit_plugin_activate_new_site( $site_or_blog_id ) {
54
55 // Check if $site_or_blog_id is a WP_Site or a blog ID.
56 if ( is_a( $site_or_blog_id, 'WP_Site' ) ) {
57 $site_or_blog_id = $site_or_blog_id->blog_id;
58 }
59
60 // Initialise Plugin.
61 $convertkit = WP_ConvertKit();
62 $convertkit->initialize();
63
64 // Run installation routine.
65 switch_to_blog( $site_or_blog_id );
66 $convertkit->get_class( 'setup' )->activate();
67 restore_current_blog();
68
69 }
70
71 /**
72 * Runs the deactivation routine when the plugin is deactivated.
73 *
74 * @since 1.9.7.4
75 *
76 * @param bool $network_wide Is network wide deactivation.
77 */
78 function convertkit_plugin_deactivate( $network_wide ) {
79
80 // Initialise Plugin.
81 $convertkit = WP_ConvertKit();
82 $convertkit->initialize();
83
84 // Check if we are on a multisite install, activating network wide, or a single install.
85 if ( ! is_multisite() || ! $network_wide ) {
86 // Single Site activation.
87 $convertkit->get_class( 'setup' )->deactivate();
88 } else {
89 // Multisite network wide activation.
90 $sites = get_sites(
91 array(
92 'number' => 0,
93 )
94 );
95 foreach ( $sites as $site ) {
96 switch_to_blog( (int) $site->blog_id );
97 $convertkit->get_class( 'setup' )->deactivate();
98 restore_current_blog();
99 }
100 }
101
102 }
103
104 /**
105 * Helper method to get supported Post Types.
106 *
107 * @since 1.9.6
108 *
109 * @return array Post Types
110 */
111 function convertkit_get_supported_post_types() {
112
113 // Define supported Post Types.
114 $post_types = array(
115 'page',
116 'post',
117 );
118
119 // If public Custom Post Types can be fetched, include them now.
120 if ( function_exists( 'get_post_types' ) ) {
121 // Get public Custom Post Types.
122 $custom_post_types = (array) get_post_types(
123 array(
124 'public' => true,
125
126 // Don't include WordPress' built in Post Types, such as attachment, revisino and nav_menu_item.
127 '_builtin' => false,
128 )
129 );
130
131 $post_types = array_merge(
132 $post_types,
133 array_keys( $custom_post_types )
134 );
135 }
136
137 /**
138 * Defines the Post Types that support ConvertKit Forms.
139 *
140 * @since 1.9.6
141 *
142 * @param array $post_types Post Types
143 */
144 $post_types = apply_filters( 'convertkit_get_supported_post_types', $post_types );
145
146 return $post_types;
147
148 }
149
150 /**
151 * Helper method to get supported Post Types for Restricted Content (Member's Content)
152 *
153 * @since 2.1.0
154 *
155 * @deprecated 2.4.3 No longer used by internal code and not recommended. Use `convertkit_get_supported_post_types` instead.
156 *
157 * @return array Post Types
158 */
159 function convertkit_get_supported_restrict_content_post_types() {
160
161 return convertkit_get_supported_post_types();
162
163 }
164
165 /**
166 * Helper method to get registered Shortcodes.
167 *
168 * @since 1.9.6.5
169 *
170 * @return array Shortcodes
171 */
172 function convertkit_get_shortcodes() {
173
174 $shortcodes = array();
175
176 /**
177 * Registers shortcodes for the ConvertKit Plugin.
178 *
179 * @since 1.9.6.5
180 *
181 * @param array $shortcodes Shortcodes
182 */
183 $shortcodes = apply_filters( 'convertkit_shortcodes', $shortcodes );
184
185 return $shortcodes;
186
187 }
188
189 /**
190 * Helper method to get registered Blocks.
191 *
192 * @since 1.9.6
193 *
194 * @return array Blocks
195 */
196 function convertkit_get_blocks() {
197
198 $blocks = array();
199
200 /**
201 * Registers blocks for the ConvertKit Plugin.
202 *
203 * @since 1.9.6
204 *
205 * @param array $blocks Blocks
206 */
207 $blocks = apply_filters( 'convertkit_blocks', $blocks );
208
209 return $blocks;
210
211 }
212
213 /**
214 * Helper method to get registered Block formatters for Gutenberg.
215 *
216 * @since 2.2.0
217 *
218 * @return array Block formatters
219 */
220 function convertkit_get_block_formatters() {
221
222 $block_formatters = array();
223
224 /**
225 * Registers block formatters in Gutenberg for the ConvertKit Plugin.
226 *
227 * @since 2.2.0
228 *
229 * @param array $block_formatters Block formatters.
230 */
231 $block_formatters = apply_filters( 'convertkit_get_block_formatters', $block_formatters );
232
233 return $block_formatters;
234
235 }
236
237 /**
238 * Helper method to get registered plugin sidebars.
239 *
240 * @since 3.3.0
241 *
242 * @return array Plugin sidebars
243 */
244 function convertkit_get_plugin_sidebars() {
245
246 $plugin_sidebars = array();
247
248 /**
249 * Registers plugin sidebars for the WordPress block editor.
250 *
251 * @since 3.3.0
252 *
253 * @param array $plugin_sidebars Plugin sidebars.
254 */
255 $plugin_sidebars = apply_filters( 'convertkit_plugin_sidebars', $plugin_sidebars );
256
257 return $plugin_sidebars;
258
259 }
260
261 /**
262 * Helper method to get registered pre-publish actions.
263 *
264 * @since 2.4.0
265 *
266 * @return array Pre-publish actions
267 */
268 function convertkit_get_pre_publish_actions() {
269
270 $pre_publish_actions = array();
271
272 /**
273 * Registers pre-publish actions for the ConvertKit Plugin.
274 *
275 * @since 2.4.0
276 *
277 * @param array $pre_publish_panels Pre-publish actions.
278 */
279 $pre_publish_actions = apply_filters( 'convertkit_get_pre_publish_actions', $pre_publish_actions );
280
281 return $pre_publish_actions;
282
283 }
284
285 /**
286 * Helper method to get registered importers that can replace third party
287 * form shortcodes and blocks with Kit form shortcodes and blocks.
288 *
289 * @since 3.1.7
290 *
291 * @return array Importers.
292 */
293 function convertkit_get_form_importers() {
294
295 $importers = array();
296
297 /**
298 * Registers form importers for the ConvertKit Plugin.
299 *
300 * @since 3.1.7
301 *
302 * @param array $importers Importers.
303 */
304 $importers = apply_filters( 'convertkit_get_form_importers', $importers );
305
306 return $importers;
307
308 }
309
310 /**
311 * Helper method to return the Plugin Settings Link
312 *
313 * @since 1.9.6
314 *
315 * @param array $query_args Optional Query Args.
316 * @return string Settings Link
317 */
318 function convertkit_get_settings_link( $query_args = array() ) {
319
320 $query_args = array_merge(
321 $query_args,
322 array(
323 'page' => '_wp_convertkit_settings',
324 )
325 );
326
327 return add_query_arg( $query_args, admin_url( 'options-general.php' ) );
328
329 }
330
331 /**
332 * Helper method to return the Plugin Settings Link
333 *
334 * @since 2.2.4
335 *
336 * @param array $query_args Optional Query Args.
337 * @return string Settings Link
338 */
339 function convertkit_get_setup_wizard_plugin_link( $query_args = array() ) {
340
341 $query_args = array_merge(
342 $query_args,
343 array(
344 'page' => 'convertkit-setup',
345 )
346 );
347
348 return add_query_arg( $query_args, admin_url( 'options.php' ) );
349
350 }
351
352 /**
353 * Helper method to return the URL the user needs to visit to register a ConvertKit account.
354 *
355 * @since 1.9.8.4
356 *
357 * @return string ConvertKit Registration URL.
358 */
359 function convertkit_get_registration_url() {
360
361 return add_query_arg(
362 array(
363 'utm_source' => 'wordpress',
364 'utm_term' => get_locale(),
365 'utm_content' => 'convertkit',
366 ),
367 'https://app.kit.com/users/signup'
368 );
369
370 }
371
372 /**
373 * Helper method to return the URL the user needs to visit to sign in to their ConvertKit account.
374 *
375 * @since 1.9.6.1
376 *
377 * @return string ConvertKit Login URL.
378 */
379 function convertkit_get_sign_in_url() {
380
381 return add_query_arg(
382 array(
383 'utm_source' => 'wordpress',
384 'utm_term' => get_locale(),
385 'utm_content' => 'convertkit',
386 ),
387 'https://app.kit.com/'
388 );
389
390 }
391
392 /**
393 * Helper method to return the URL the user needs to visit to manage thier billing.
394 *
395 * @since 2.2.7
396 *
397 * @return string ConvertKit Billing URL.
398 */
399 function convertkit_get_billing_url() {
400
401 return add_query_arg(
402 array(
403 'utm_source' => 'wordpress',
404 'utm_term' => get_locale(),
405 'utm_content' => 'convertkit',
406 ),
407 'https://app.kit.com/account_settings/billing/'
408 );
409
410 }
411
412 /**
413 * Helper method to return the URL the user needs to visit on the ConvertKit app to create a new Form or Landing Page.
414 *
415 * @since 2.2.3
416 *
417 * @return string ConvertKit App URL
418 */
419 function convertkit_get_new_form_url() {
420
421 return add_query_arg(
422 array(
423 'utm_source' => 'wordpress',
424 'utm_term' => get_locale(),
425 'utm_content' => 'convertkit',
426 ),
427 'https://app.kit.com/forms/new/'
428 );
429
430 }
431
432 /**
433 * Helper method to return the URL the user needs to visit to edit ConvertKit forms.
434 *
435 * @since 2.2.3
436 *
437 * @return string ConvertKit Form Editor URL.
438 */
439 function convertkit_get_form_editor_url() {
440
441 return add_query_arg(
442 array(
443 'utm_source' => 'wordpress',
444 'utm_term' => get_locale(),
445 'utm_content' => 'convertkit',
446 ),
447 'https://app.kit.com/forms'
448 );
449
450 }
451
452 /**
453 * Helper method to return the URL the user needs to visit on the ConvertKit app to create a new Landing Page.
454 *
455 * @since 2.5.5
456 *
457 * @return string ConvertKit App URL
458 */
459 function convertkit_get_new_landing_page_url() {
460
461 return add_query_arg(
462 array(
463 'utm_source' => 'wordpress',
464 'utm_term' => get_locale(),
465 'utm_content' => 'convertkit',
466 ),
467 'https://app.kit.com/pages/new/'
468 );
469
470 }
471
472 /**
473 * Helper method to return the URL the user needs to visit on the ConvertKit app to create a new Tag.
474 *
475 * @since 2.3.3
476 *
477 * @return string ConvertKit App URL.
478 */
479 function convertkit_get_new_tag_url() {
480
481 return add_query_arg(
482 array(
483 'utm_source' => 'wordpress',
484 'utm_term' => get_locale(),
485 'utm_content' => 'convertkit',
486 ),
487 'https://app.kit.com/subscribers/'
488 );
489
490 }
491
492 /**
493 * Helper method to return the URL the user needs to visit on the ConvertKit app to create a new Broadcast.
494 *
495 * @since 2.2.6
496 *
497 * @return string ConvertKit App URL.
498 */
499 function convertkit_get_new_broadcast_url() {
500
501 return add_query_arg(
502 array(
503 'utm_source' => 'wordpress',
504 'utm_term' => get_locale(),
505 'utm_content' => 'convertkit',
506 ),
507 'https://app.kit.com/campaigns/'
508 );
509
510 }
511
512 /**
513 * Helper method to return the URL the user needs to visit on the ConvertKit app to edit a draft Broadcast.
514 *
515 * @since 2.4.0
516 *
517 * @param int $broadcast_id ConvertKit Broadcast ID.
518 * @return string ConvertKit App URL.
519 */
520 function convertkit_get_edit_broadcast_url( $broadcast_id ) {
521
522 return add_query_arg(
523 array(
524 'utm_source' => 'wordpress',
525 'utm_term' => get_locale(),
526 'utm_content' => 'convertkit',
527 ),
528 sprintf(
529 'https://app.kit.com/campaigns/%s/draft',
530 $broadcast_id
531 )
532 );
533
534 }
535
536 /**
537 * Helper method to return the URL the user needs to visit on the ConvertKit app to create a new Product.
538 *
539 * @since 2.2.3
540 *
541 * @return string ConvertKit App URL.
542 */
543 function convertkit_get_new_product_url() {
544
545 return add_query_arg(
546 array(
547 'utm_source' => 'wordpress',
548 'utm_term' => get_locale(),
549 'utm_content' => 'convertkit',
550 ),
551 'https://app.kit.com/products/new/'
552 );
553
554 }
555
556 /**
557 * Helper method to enqueue the frontend CSS file.
558 *
559 * @since 3.2.0
560 */
561 function convertkit_enqueue_frontend_css() {
562
563 wp_enqueue_style( 'convertkit-frontend', CONVERTKIT_PLUGIN_URL . 'resources/frontend/css/frontend.css', array(), CONVERTKIT_PLUGIN_VERSION );
564
565 }
566
567 /**
568 * Helper method to enqueue the frontend JS file.
569 *
570 * @since 3.2.0
571 */
572 function convertkit_enqueue_frontend_js() {
573
574 wp_enqueue_script(
575 'convertkit-js',
576 CONVERTKIT_PLUGIN_URL . 'resources/frontend/js/dist/frontend.min.js',
577 array(),
578 CONVERTKIT_PLUGIN_VERSION,
579 true
580 );
581
582 }
583
584 /**
585 * Helper method to enqueue Select2 scripts for use within the ConvertKit Plugin.
586 *
587 * @since 1.9.6.4
588 */
589 function convertkit_select2_enqueue_scripts() {
590
591 wp_enqueue_script( 'convertkit-select2', 'https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js', array( 'jquery' ), CONVERTKIT_PLUGIN_VERSION, false );
592 wp_enqueue_script( 'convertkit-admin-select2', CONVERTKIT_PLUGIN_URL . 'resources/backend/js/select2.js', array( 'convertkit-select2' ), CONVERTKIT_PLUGIN_VERSION, false );
593
594 }
595
596 /**
597 * Helper method to enqueue Select2 stylesheets for use within the ConvertKit Plugin.
598 *
599 * @since 1.9.6.4
600 */
601 function convertkit_select2_enqueue_styles() {
602
603 wp_enqueue_style( 'convertkit-select2', 'https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css', array(), CONVERTKIT_PLUGIN_VERSION );
604 wp_enqueue_style( 'convertkit-admin-select2', CONVERTKIT_PLUGIN_URL . 'resources/backend/css/select2.css', array(), CONVERTKIT_PLUGIN_VERSION );
605
606 }
607
608 /**
609 * Return the contents of the given local file.
610 *
611 * @since 2.2.2
612 *
613 * @param string $local_file Local file, including path.
614 * @return string File contents.
615 */
616 function convertkit_get_file_contents( $local_file ) {
617
618 // Bail if the file doesn't exist.
619 if ( ! file_exists( $local_file ) ) {
620 return '';
621 }
622
623 // Read file.
624 $contents = file_get_contents( $local_file ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
625
626 // Return an empty string if the contents of the file could not be read.
627 if ( ! $contents ) {
628 return '';
629 }
630
631 // Return file's contents.
632 return $contents;
633
634 }
635
636 /**
637 * Returns a dropdown field commonly used for settings, comprising of:
638 * - Do not subscribe
639 * - Subscribe
640 * - Subscribe to Form
641 *
642 * @since 2.5.2
643 *
644 * @param string $name Field name.
645 * @param string $value Field value.
646 * @param string $id Field ID attribute.
647 * @param string $css_class Field CSS class(es).
648 * @param string $context Resource context.
649 * @param bool|array $additional_options Additional <option> key/value pairs.
650 */
651 function convertkit_get_subscription_dropdown_field( $name, $value, $id, $css_class = '', $context = '', $additional_options = false ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter
652
653 // Load resource classes.
654 $forms = new ConvertKit_Resource_Forms( $context );
655 $tags = new ConvertKit_Resource_Tags( $context );
656 $sequences = new ConvertKit_Resource_Sequences( $context );
657
658 ob_start();
659 include CONVERTKIT_PLUGIN_PATH . '/views/backend/subscription-dropdown-field.php';
660 $output = trim( ob_get_clean() );
661
662 // Return output.
663 return $output;
664
665 }
666
667 /**
668 * Helper method to safely call get_current_screen(), returning false
669 * if the function is not available or returns null.
670 *
671 * Otherwise returns the given WP_Screen property.
672 *
673 * @since 2.5.9
674 *
675 * @param string $property WP_Screen property to return.
676 * @return bool|string
677 */
678 function convertkit_get_current_screen( $property ) {
679
680 // Bail if we cannot determine the screen.
681 if ( ! function_exists( 'get_current_screen' ) ) {
682 return false;
683 }
684
685 // Get screen.
686 $screen = get_current_screen();
687
688 // Bail if the screen couldn't be determined.
689 if ( is_null( $screen ) ) {
690 return false;
691 }
692
693 // Return property.
694 return $screen->$property;
695
696 }
697
698 /**
699 * Outputs the Intercom help widget script.
700 *
701 * @since 2.7.2
702 */
703 function convertkit_output_intercom_messenger() {
704
705 ?>
706 <script>
707 const KIT_INTERCOM_APP_ID = 'e4n3xtxz';
708 window.intercomSettings = {
709 api_base: 'https://api-iam.intercom.io',
710 app_id: KIT_INTERCOM_APP_ID
711 };
712 </script>
713
714 <script>
715 (function(){var w=window;var ic=w.Intercom;if(typeof ic==="function"){ic('update',w.intercomSettings);}else{var d=document;var i=function(){i.c(arguments);};i.q=[];i.c=function(args){i.q.push(args);};w.Intercom=i;var l=function(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/' + KIT_INTERCOM_APP_ID;var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s, x);};if(document.readyState==='complete'){l();}else if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})();
716 </script>
717 <?php
718
719 }
720
721 /**
722 * Checks if the given Theme is active.
723 *
724 * @since 3.1.4
725 *
726 * @param string $theme_name Theme name.
727 * @return bool
728 */
729 function convertkit_is_theme_active( $theme_name ) {
730
731 // Assume Theme isn't active if we can't detect it.
732 if ( ! function_exists( 'wp_get_theme' ) ) {
733 return false;
734 }
735
736 // Check the Parent Theme if we're on a Child Theme.
737 if ( wp_get_theme()->parent() ) {
738 $theme = wp_get_theme()->parent();
739 } else {
740 $theme = wp_get_theme();
741 }
742
743 return strtolower( $theme->get( 'Name' ) ) === strtolower( $theme_name );
744
745 }
746
747 /**
748 * Returns permitted HTML output when using wp_kses( ..., convertkit_kses_allowed_html()).
749 *
750 * @since 2.8.5
751 */
752 function convertkit_kses_allowed_html() {
753
754 // Get WordPress' permitted HTML elements.
755 $elements = wp_kses_allowed_html( 'post' );
756
757 // Add form elements.
758 $form_elements = array(
759 'input' => array(
760 'type' => true,
761 'id' => true,
762 'name' => true,
763 'class' => true,
764 'value' => true,
765 'checked' => true,
766 'min' => true,
767 'max' => true,
768 'step' => true,
769 'data-*' => true,
770 ),
771 'select' => array(
772 'id' => true,
773 'name' => true,
774 'class' => true,
775 'size' => true,
776 'multiple' => true,
777 'data-*' => true,
778 ),
779 'option' => array(
780 'value' => true,
781 'selected' => true,
782 'data-*' => true,
783 ),
784 'optgroup' => array(
785 'label' => true,
786 'data-*' => true,
787 ),
788 'label' => array(
789 'for' => true,
790 ),
791 );
792
793 return array_merge( $elements, $form_elements );
794
795 }
796
797 /**
798 * Saves the new access token, refresh token and its expiry, and schedules
799 * a WordPress Cron event to refresh the token on expiry.
800 *
801 * @since 3.1.1
802 *
803 * @param array $result New Access Token, Refresh Token and Expiry.
804 * @param string $client_id OAuth Client ID used for the Access and Refresh Tokens.
805 */
806 function convertkit_maybe_update_credentials( $result, $client_id ) {
807
808 // Don't save these credentials if they're not for this Client ID.
809 // They're for another Kit Plugin that uses OAuth.
810 if ( $client_id !== CONVERTKIT_OAUTH_CLIENT_ID ) {
811 return;
812 }
813
814 $settings = new ConvertKit_Settings();
815 $settings->update_credentials( $result );
816
817 }
818
819 /**
820 * Deletes the stored access token, refresh token and its expiry from the Plugin settings,
821 * and clears any existing scheduled WordPress Cron event to refresh the token on expiry,
822 * when the user revokes the access token.
823 *
824 * @since 3.2.4
825 *
826 * @param string $client_id OAuth Client ID used for the Access and Refresh Tokens.
827 */
828 function convertkit_delete_credentials( $client_id ) {
829
830 // Don't delete these credentials if they're not for this Client ID.
831 // They're for another Kit Plugin that uses OAuth.
832 if ( $client_id !== CONVERTKIT_OAUTH_CLIENT_ID ) {
833 return;
834 }
835
836 // Delete Access and Refresh Tokens.
837 $settings = new ConvertKit_Settings();
838 $settings->delete_credentials();
839
840 }
841
842 /**
843 * Deletes the stored access token, refresh token and its expiry from the Plugin settings,
844 * and clears any existing scheduled WordPress Cron event to refresh the token on expiry,
845 * when either:
846 * - The access token is invalid
847 * - The access token expired, and refreshing failed
848 *
849 * @since 3.1.1
850 *
851 * @param WP_Error $result Error result.
852 * @param string $client_id OAuth Client ID used for the Access and Refresh Tokens.
853 */
854 function convertkit_maybe_delete_credentials( $result, $client_id ) {
855
856 // Don't save these credentials if they're not for this Client ID.
857 // They're for another Kit Plugin that uses OAuth.
858 if ( $client_id !== CONVERTKIT_OAUTH_CLIENT_ID ) {
859 return;
860 }
861
862 // If the error isn't a 401, don't delete credentials.
863 // This could be e.g. a temporary network error, rate limit or similar.
864 if ( $result->get_error_data( 'convertkit_api_error' ) !== 401 ) {
865 return;
866 }
867
868 // Persist an error notice in the WordPress Administration until the user fixes the problem.
869 WP_ConvertKit()->get_class( 'admin_notices' )->add( 'authorization_failed' );
870
871 $settings = new ConvertKit_Settings();
872 $settings->delete_credentials();
873
874 }
875
876 // Update Access Token when refreshed by the API class.
877 add_action( 'convertkit_api_get_access_token', 'convertkit_maybe_update_credentials', 10, 2 );
878 add_action( 'convertkit_api_refresh_token', 'convertkit_maybe_update_credentials', 10, 2 );
879
880 // Delete credentials when the user revokes the access and refresh tokens.
881 add_action( 'convertkit_api_revoke_tokens', 'convertkit_delete_credentials', 10, 1 );
882
883 // Delete credentials if the API class uses a invalid access token.
884 // This prevents the Plugin making repetitive API requests that will 401.
885 add_action( 'convertkit_api_access_token_invalid', 'convertkit_maybe_delete_credentials', 10, 2 );
886