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.4 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 All 197 releases
← All changes | includes/class-convertkit-resource-forms.php +25 -341 3.4.22.5.2 View file →
@@ -49,74 +49,14 @@
49 49 $context
50 50 );
51 51 }
52 52
53 - // Get last query time and existing resources.
54 - $this->last_queried = get_option( $this->settings_name . '_last_queried' );
55 - $this->resources = get_option( $this->settings_name );
53 + // Call parent initialization function.
54 + parent::init();
56 55
57 56 }
58 57
59 58 /**
60 - * Fetches resources (forms, landing pages or tags) from the API, storing them in the options table
61 - * with a last queried timestamp.
62 - *
63 - * If the refresh results in a 401, removes the access and refresh tokens from the settings.
64 - *
65 - * @since 3.1.2
66 - *
67 - * @return WP_Error|array
68 - */
69 - public function refresh() {
70 -
71 - // Call parent refresh method.
72 - $result = parent::refresh();
73 -
74 - // If an error occurred, maybe delete credentials from the Plugin's settings
75 - // if the error is a 401 unauthorized.
76 - if ( is_wp_error( $result ) ) {
77 - convertkit_maybe_delete_credentials( $result, CONVERTKIT_OAUTH_CLIENT_ID );
78 - }
79 -
80 - return $result;
81 -
82 - }
83 -
84 - /**
85 - * Returns all inline forms based on the sort order.
86 - *
87 - * @since 2.7.3
88 - *
89 - * @return bool|array
90 - */
91 - public function get_inline() {
92 -
93 - // If the ConvertKit WordPress Libraries are < 1.3.6 (e.g. loaded by an outdated
94 - // addon), or a WordPress site updates this Plugin before other ConvertKit Plugins,
95 - // get_by() won't be available and will cause an E_ERROR, crashing the site.
96 - // @see https://wordpress.org/support/topic/error-1795/.
97 - if ( ! method_exists( $this, 'get_by' ) ) { // @phpstan-ignore-line Older WordPress Libraries won't have this function.
98 - return false;
99 - }
100 -
101 - return $this->get_by( 'format', array( 'inline' ) );
102 -
103 - }
104 -
105 - /**
106 - * Returns whether any inline forms exist in the options table.
107 - *
108 - * @since 2.7.3
109 - *
110 - * @return bool
111 - */
112 - public function inline_exist() {
113 -
114 - return (bool) $this->get_inline();
115 -
116 - }
117 -
118 - /**
119 59 * Returns all non-inline forms based on the sort order.
120 60 *
121 61 * @since 2.2.4
122 62 *
@@ -127,9 +67,9 @@
127 67 // If the ConvertKit WordPress Libraries are < 1.3.6 (e.g. loaded by an outdated
128 68 // addon), or a WordPress site updates this Plugin before other ConvertKit Plugins,
129 69 // get_by() won't be available and will cause an E_ERROR, crashing the site.
130 70 // @see https://wordpress.org/support/topic/error-1795/.
131 - if ( ! method_exists( $this, 'get_by' ) ) { // @phpstan-ignore-line Older WordPress Libraries won't have this function.
71 + if ( ! method_exists( $this, 'get_by' ) ) {
132 72 return false;
133 73 }
134 74
135 75 return $this->get_by( 'format', array( 'modal', 'slide in', 'sticky bar' ) );
@@ -135,8 +75,9 @@
135 75 return $this->get_by( 'format', array( 'modal', 'slide in', 'sticky bar' ) );
136 76
137 77 }
138 78
79 +
139 80 /**
140 81 * Returns whether any non-inline forms exist in the options table.
141 82 *
142 83 * @since 2.2.4
@@ -153,44 +94,8 @@
153 94
154 95 }
155 96
156 97 /**
157 - * Returns all non-legacy forms (any v4 format: inline, modal, slide in
158 - * or sticky bar) based on the sort order. Legacy forms lack a `format`
159 - * key and are therefore excluded.
160 - *
161 - * @since 3.3.7
162 - *
163 - * @return bool|array
164 - */
165 - public function get_non_legacy() {
166 -
167 - // If the ConvertKit WordPress Libraries are < 1.3.6 (e.g. loaded by an outdated
168 - // addon), or a WordPress site updates this Plugin before other ConvertKit Plugins,
169 - // get_by() won't be available and will cause an E_ERROR, crashing the site.
170 - // @see https://wordpress.org/support/topic/error-1795/.
171 - if ( ! method_exists( $this, 'get_by' ) ) { // @phpstan-ignore-line Older WordPress Libraries won't have this function.
172 - return false;
173 - }
174 -
175 - return $this->get_by( 'format', array( 'inline', 'modal', 'slide in', 'sticky bar' ) );
176 -
177 - }
178 -
179 - /**
180 - * Returns whether any non-legacy forms exist in the options table.
181 - *
182 - * @since 3.3.7
183 - *
184 - * @return bool
185 - */
186 - public function non_legacy_exist() {
187 -
188 - return (bool) $this->get_non_legacy();
189 -
190 - }
191 -
192 - /**
193 98 * Determines if the given Form ID is a legacy Form or Landing Page.
194 99 *
195 100 * @since 2.5.0
196 101 *
@@ -231,9 +136,9 @@
231 136 */
232 137 public function get_select_field_all( $name, $id, $css_classes, $selected_option, $prepend_options = false, $attributes = false, $description = false ) {
233 138
234 139 return $this->get_select_field(
235 - $this->get_forms_for_select_field( $selected_option ),
140 + $this->get(),
236 141 $name,
237 142 $id,
238 143 $css_classes,
239 144 $selected_option,
@@ -244,11 +149,11 @@
244 149
245 150 }
246 151
247 152 /**
248 - * Outputs a <select> field populated with all forms, based on the given parameters.
153 + * Returns a <select> field populated with all non-inline forms, based on the given parameters.
249 154 *
250 - * @since 2.8.5
155 + * @since 2.3.9
251 156 *
252 157 * @param string $name Name.
253 158 * @param string $id ID.
254 159 * @param bool|array $css_classes <select> CSS class(es).
@@ -255,13 +160,14 @@
255 160 * @param string $selected_option <option> value to mark as selected.
256 161 * @param bool|array $prepend_options <option> elements to prepend before resources.
257 162 * @param bool|array $attributes <select> attributes.
258 163 * @param bool|string|array $description Description.
164 + * @return string HTML Select Field
259 165 */
260 - public function output_select_field_all( $name, $id, $css_classes, $selected_option, $prepend_options = false, $attributes = false, $description = false ) {
166 + public function get_select_field_non_inline( $name, $id, $css_classes, $selected_option, $prepend_options = false, $attributes = false, $description = false ) {
261 167
262 - $this->output_select_field(
263 - $this->get_forms_for_select_field( $selected_option ),
168 + return $this->get_select_field(
169 + $this->get_non_inline(),
264 170 $name,
265 171 $id,
266 172 $css_classes,
267 173 $selected_option,
@@ -272,98 +178,8 @@
272 178
273 179 }
274 180
275 181 /**
276 - * Returns the array of forms to display in an "all forms" dropdown: every
277 - * non-legacy form, plus the currently-selected legacy form (if any) so
278 - * existing saved legacy assignments continue to render as selected in the
279 - * UI without exposing other legacy forms as new selection options.
280 - *
281 - * @since 3.3.7
282 - *
283 - * @param string|int $selected_option Currently-selected form ID.
284 - * @return array
285 - */
286 - private function get_forms_for_select_field( $selected_option ) {
287 -
288 - $forms = $this->get_non_legacy();
289 - if ( ! is_array( $forms ) ) {
290 - $forms = array();
291 - }
292 -
293 - // If the currently-selected form is a legacy form, append it so the
294 - // dropdown shows the saved value as selected.
295 - if ( $selected_option && $this->is_legacy( $selected_option ) ) {
296 - $legacy_form = $this->get_by_id( (int) $selected_option );
297 - if ( $legacy_form ) {
298 - $forms[] = $legacy_form;
299 - }
300 - }
301 -
302 - return $forms;
303 -
304 - }
305 -
306 - /**
307 - * Returns a <select> field populated with all non-inline forms, based on the given parameters.
308 - *
309 - * @since 2.3.9
310 - *
311 - * @param string $name Name.
312 - * @param string $id ID.
313 - * @param bool|array $css_classes <select> CSS class(es).
314 - * @param array $selected_options <option> values to mark as selected.
315 - * @param bool|array $prepend_options <option> elements to prepend before resources.
316 - * @param bool|array $attributes <select> attributes.
317 - * @param bool|string|array $description Description.
318 - * @return string HTML Select Field
319 - */
320 - public function get_select_field_non_inline( $name, $id, $css_classes, $selected_options, $prepend_options = false, $attributes = false, $description = false ) {
321 -
322 - return $this->get_multi_select_field(
323 - $this->get_non_inline(),
324 - $name,
325 - $id,
326 - $css_classes,
327 - $selected_options,
328 - $prepend_options,
329 - $attributes,
330 - $description
331 - );
332 -
333 - }
334 -
335 - /**
336 - * Outputs a <select> field populated with all non-inline forms, based on the given parameters.
337 - *
338 - * @since 2.3.9
339 - *
340 - * @param string $name Name.
341 - * @param string $id ID.
342 - * @param bool|array $css_classes <select> CSS class(es).
343 - * @param array $selected_options <option> values to mark as selected.
344 - * @param bool|array $prepend_options <option> elements to prepend before resources.
345 - * @param bool|array $attributes <select> attributes.
346 - * @param bool|string|array $description Description.
347 - */
348 - public function output_select_field_non_inline( $name, $id, $css_classes, $selected_options, $prepend_options = false, $attributes = false, $description = false ) {
349 -
350 - echo wp_kses(
351 - $this->get_select_field_non_inline(
352 - $name,
353 - $id,
354 - $css_classes,
355 - $selected_options,
356 - $prepend_options,
357 - $attributes,
358 - $description
359 - ),
360 - convertkit_kses_allowed_html()
361 - );
362 -
363 - }
364 -
365 - /**
366 182 * Returns a <select> field populated with the resources, based on the given parameters.
367 183 *
368 184 * @since 2.3.9
369 185 *
@@ -444,123 +260,8 @@
444 260
445 261 }
446 262
447 263 /**
448 - * Outputs a <select> field populated with the resources, based on the given parameters.
449 - *
450 - * @since 2.8.5
451 - *
452 - * @param array $forms Forms.
453 - * @param string $name Name.
454 - * @param string $id ID.
455 - * @param bool|array $css_classes <select> CSS class(es).
456 - * @param string $selected_option <option> value to mark as selected.
457 - * @param bool|array $prepend_options <option> elements to prepend before resources.
458 - * @param bool|array $attributes <select> attributes.
459 - * @param bool|string|array $description Description.
460 - */
461 - private function output_select_field( $forms, $name, $id, $css_classes, $selected_option, $prepend_options = false, $attributes = false, $description = false ) {
462 -
463 - echo wp_kses(
464 - $this->get_select_field(
465 - $forms,
466 - $name,
467 - $id,
468 - $css_classes,
469 - $selected_option,
470 - $prepend_options,
471 - $attributes,
472 - $description
473 - ),
474 - convertkit_kses_allowed_html()
475 - );
476 -
477 - }
478 -
479 - /**
480 - * Returns a <select> field populated with the resources, based on the given parameters,
481 - * that supports multiple selection.
482 - *
483 - * @since 2.6.9
484 - *
485 - * @param array $forms Forms.
486 - * @param string $name Name.
487 - * @param string $id ID.
488 - * @param bool|array $css_classes <select> CSS class(es).
489 - * @param array $selected_options <option> values to mark as selected.
490 - * @param bool|array $prepend_options <option> elements to prepend before resources.
491 - * @param bool|array $attributes <select> attributes.
492 - * @param bool|string|array $description Description.
493 - * @return string HTML Select Field
494 - */
495 - private function get_multi_select_field( $forms, $name, $id, $css_classes, $selected_options = array(), $prepend_options = false, $attributes = false, $description = false ) {
496 -
497 - $html = sprintf(
498 - '<select name="%s[]" id="%s" class="%s" multiple',
499 - esc_attr( $name ),
500 - esc_attr( $id ),
501 - esc_attr( ( is_array( $css_classes ) ? implode( ' ', $css_classes ) : '' ) )
502 - );
503 -
504 - // Append any attributes.
505 - if ( $attributes ) {
506 - foreach ( $attributes as $key => $value ) {
507 - $html .= sprintf(
508 - ' %s="%s"',
509 - esc_attr( $key ),
510 - esc_attr( $value )
511 - );
512 - }
513 - }
514 -
515 - // Close select tag.
516 - $html .= '>';
517 -
518 - // If any prepended options exist, add them now.
519 - if ( $prepend_options ) {
520 - foreach ( $prepend_options as $value => $label ) {
521 - $html .= sprintf(
522 - '<option value="%s" data-preserve-on-refresh="1"%s>%s</option>',
523 - esc_attr( $value ),
524 - ( in_array( $value, $selected_options, true ) ? ' selected' : '' ),
525 - esc_attr( $label )
526 - );
527 - }
528 - }
529 -
530 - // Iterate through resources, if they exist, building <option> elements.
531 - if ( $forms ) {
532 - foreach ( $forms as $form ) {
533 - // Legacy forms don't include a `format` key, so define them as inline.
534 - $html .= sprintf(
535 - '<option value="%s"%s>%s [%s]</option>',
536 - esc_attr( $form['id'] ),
537 - ( in_array( $form['id'], $selected_options, true ) ? ' selected' : '' ),
538 - esc_attr( $form['name'] ),
539 - ( ! empty( $form['format'] ) ? esc_attr( $form['format'] ) : 'inline' )
540 - );
541 - }
542 - }
543 -
544 - // Close select.
545 - $html .= '</select>';
546 -
547 - // If no description is provided, return the select field now.
548 - if ( ! $description ) {
549 - return $html;
550 - }
551 -
552 - // Append description before returning field.
553 - if ( ! is_array( $description ) ) {
554 - return $html . '<p class="description">' . $description . '</p>';
555 - }
556 -
557 - // Return description lines in a paragraph, using breaklines for each description entry in the array.
558 - return $html . '<p class="description">' . implode( '<br />', $description ) . '</p>';
559 -
560 - }
561 -
562 - /**
563 264 * Returns the HTML/JS markup for the given Form ID.
564 265 *
565 266 * Legacy Forms will return HTML.
566 267 * Current Forms will return a <script> embed string.
@@ -566,13 +267,12 @@
566 267 * Current Forms will return a <script> embed string.
567 268 *
568 269 * @since 1.9.6
569 270 *
570 - * @param int $id Form ID.
571 - * @param int $post_id Post ID that requested the Form.
271 + * @param int $id Form ID.
572 272 * @return WP_Error|string
573 273 */
574 - public function get_html( $id, $post_id = 0 ) {
274 + public function get_html( $id ) {
575 275
576 276 // Cast ID to integer.
577 277 $id = absint( $id );
578 278
@@ -586,26 +286,25 @@
586 286 return new WP_Error(
587 287 'convertkit_resource_forms_get_html',
588 288 sprintf(
589 289 /* translators: ConvertKit Form ID */
590 - __( 'Kit Form ID %s does not exist on Kit.', 'convertkit' ),
290 + __( 'ConvertKit Form ID %s does not exist on ConvertKit.', 'convertkit' ),
591 291 $id
592 - ),
593 - 404
292 + )
594 293 );
595 294 }
596 295
597 - // Initialize Settings.
598 - $settings = new ConvertKit_Settings();
599 -
600 296 // If no uid is present in the Form API data, this is a legacy form that's served by directly fetching the HTML
601 - // from forms.kit.com.
297 + // from forms.convertkit.com.
602 298 if ( ! isset( $this->resources[ $id ]['uid'] ) ) {
299 + // Initialize Settings.
300 + $settings = new ConvertKit_Settings();
301 +
603 302 // Bail if no Access Token is specified in the Plugin Settings.
604 303 if ( ! $settings->has_access_token() ) {
605 304 return new WP_Error(
606 305 'convertkit_resource_forms_get_html',
607 - __( 'Kit Legacy Form could not be fetched as no Access Token specified in Plugin Settings', 'convertkit' )
306 + __( 'ConvertKit Legacy Form could not be fetched as no Access Token specified in Plugin Settings', 'convertkit' )
608 307 );
609 308 }
610 309
611 310 // Initialize the API.
@@ -630,26 +329,16 @@
630 329 // displaying twice.
631 330 if ( $this->resources[ $id ]['format'] !== 'inline' ) {
632 331 add_filter(
633 332 'convertkit_output_scripts_footer',
634 - function ( $scripts ) use ( $id, $post_id, $settings ) {
333 + function ( $scripts ) use ( $id ) {
635 334
636 - // Build script.
637 - $script = array(
638 - 'async' => true,
639 - 'data-uid' => $this->resources[ $id ]['uid'],
640 - 'src' => $this->resources[ $id ]['embed_js'],
641 - 'data-kit-limit-per-session' => $settings->non_inline_form_limit_per_session() ? '1' : '0',
335 + $scripts[] = array(
336 + 'async' => true,
337 + 'data-uid' => $this->resources[ $id ]['uid'],
338 + 'src' => $this->resources[ $id ]['embed_js'],
642 339 );
643 340
644 - // If debugging is enabled, add the post ID to the script.
645 - if ( $settings->debug_enabled() ) {
646 - $script['data-kit-source-post-id'] = $post_id;
647 - }
648 -
649 - // Add the script to the scripts array.
650 - $scripts[] = $script;
651 -
652 341 return $scripts;
653 342
654 343 }
655 344 );
@@ -678,13 +367,8 @@
678 367 'async' => true,
679 368 'data-uid' => $this->resources[ $id ]['uid'],
680 369 'src' => $this->resources[ $id ]['embed_js'],
681 370 );
682 -
683 - // If debugging is enabled, add the post ID to the script.
684 - if ( $settings->debug_enabled() ) {
685 - $script['data-kit-source-post-id'] = $post_id;
686 - }
687 371
688 372 /**
689 373 * Filter the form <script> key/value pairs immediately before the script is output.
690 374 *