PluginProbe
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages / 1.4.8
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages v1.4.8
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 | wp-convertkit.php +460 -164 3.3.31.4.8 View file →
@@ -1,186 +1,482 @@
1 1 <?php
2 2 /**
3 - * Kit (formerly ConvertKit) WordPress Plugin.
4 - *
5 - * @package ConvertKit
6 - * @author ConvertKit
7 - *
8 - * @wordpress-plugin
9 - * Plugin Name: Kit (formerly ConvertKit)
10 - * Plugin URI: https://kit.com/
11 - * Description: Display Kit (formerly ConvertKit) email subscription forms, landing pages, products, broadcasts and more.
12 - * Version: 3.3.3
13 - * Author: Kit
14 - * Author URI: https://kit.com/
3 + * Plugin Name: ConvertKit
4 + * Plugin URI: https://convertkit.com/
5 + * Description: Quickly and easily integrate ConvertKit forms into your site.
6 + * Version: 1.4.8
7 + * Author: ConvertKit
8 + * Author URI: https://convertkit.com/
15 9 * Text Domain: convertkit
16 - * License: GPLv3 or later
17 - * License URI: https://www.gnu.org/licenses/gpl-3.0.html
18 10 */
19 11
20 -// Bail if Kit is already loaded.
21 -if ( class_exists( 'WP_ConvertKit' ) ) {
22 - return;
23 -}
12 +require_once plugin_dir_path( __FILE__ ) . '/lib/class-convertkit-api.php';
13 +require_once plugin_dir_path( __FILE__ ) . '/lib/class-ck-widget-form.php';
14 +require_once plugin_dir_path( __FILE__ ) . '/lib/integration/class-convertkit-wishlist-integration.php';
15 +require_once plugin_dir_path( __FILE__ ) . '/lib/integration/class-convertkit-contactform7-integration.php';
24 16
25 -// Define Kit Plugin paths and version number.
26 -define( 'CONVERTKIT_PLUGIN_NAME', 'ConvertKit' ); // Used for user-agent in API class.
27 -define( 'CONVERTKIT_PLUGIN_FILE', plugin_basename( __FILE__ ) );
28 -define( 'CONVERTKIT_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
29 -define( 'CONVERTKIT_PLUGIN_PATH', __DIR__ );
30 -define( 'CONVERTKIT_PLUGIN_VERSION', '3.3.3' );
31 -define( 'CONVERTKIT_OAUTH_CLIENT_ID', 'HXZlOCj-K5r0ufuWCtyoyo3f688VmMAYSsKg1eGvw0Y' );
32 -define( 'CONVERTKIT_OAUTH_CLIENT_REDIRECT_URI', 'https://app.kit.com/wordpress/redirect' );
17 +if ( ! class_exists( 'WP_ConvertKit' ) ) {
18 + /**
19 + * Class WP_ConvertKit
20 + */
21 + class WP_ConvertKit {
33 22
34 -// Load shared classes, if they have not been included by another Kit Plugin.
35 -if ( ! trait_exists( 'ConvertKit_API_Traits' ) && ! trait_exists( 'ConvertKit_API\ConvertKit_API_Traits' ) ) {
36 - require_once CONVERTKIT_PLUGIN_PATH . '/vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-traits.php';
37 -}
38 -if ( ! class_exists( 'ConvertKit_API_V4' ) ) {
39 - require_once CONVERTKIT_PLUGIN_PATH . '/vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-api-v4.php';
40 -}
41 -if ( ! class_exists( 'ConvertKit_Log' ) ) {
42 - require_once CONVERTKIT_PLUGIN_PATH . '/vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-log.php';
43 -}
44 -if ( ! class_exists( 'ConvertKit_Resource_V4' ) ) {
45 - require_once CONVERTKIT_PLUGIN_PATH . '/vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-resource-v4.php';
46 -}
47 -if ( ! class_exists( 'ConvertKit_Review_Request' ) ) {
48 - require_once CONVERTKIT_PLUGIN_PATH . '/vendor/convertkit/convertkit-wordpress-libraries/src/class-convertkit-review-request.php';
49 -}
23 + const VERSION = '1.4.8';
50 24
51 -// Load plugin files that are always required.
52 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/cron-functions.php';
53 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/functions.php';
54 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-wp-convertkit.php';
55 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-admin-notices.php';
56 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-broadcasts-exporter.php';
57 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-broadcasts-importer.php';
58 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-cache-plugins.php';
59 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-cron.php';
60 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-form-entries.php';
61 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-gutenberg.php';
62 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-html-parser.php';
63 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-media-library.php';
64 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-output.php';
65 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-output-broadcasts.php';
66 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-output-restrict-content.php';
67 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-post.php';
68 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-preview-output.php';
69 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-recaptcha.php';
70 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-resource-creator-network-recommendations.php';
71 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-resource-custom-fields.php';
72 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-resource-forms.php';
73 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-resource-landing-pages.php';
74 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-resource-posts.php';
75 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-resource-products.php';
76 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-resource-sequences.php';
77 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-resource-tags.php';
78 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-settings.php';
79 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-settings-broadcasts.php';
80 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-settings-restrict-content.php';
81 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-setup.php';
82 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-shortcodes.php';
83 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-subscriber.php';
84 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-term.php';
85 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-user.php';
86 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/class-convertkit-widgets.php';
87 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/blocks/class-convertkit-block.php';
88 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/blocks/class-convertkit-block-broadcasts.php';
89 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/blocks/class-convertkit-block-content.php';
90 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/blocks/class-convertkit-block-form-trigger.php';
91 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/blocks/class-convertkit-block-form.php';
92 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/blocks/class-convertkit-block-form-builder.php';
93 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/blocks/class-convertkit-block-form-builder-field.php';
94 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/blocks/class-convertkit-block-form-builder-field-email.php';
95 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/blocks/class-convertkit-block-form-builder-field-name.php';
96 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/blocks/class-convertkit-block-form-builder-field-custom.php';
97 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/blocks/class-convertkit-block-product.php';
98 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/block-formatters/class-convertkit-block-formatter.php';
99 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/block-formatters/class-convertkit-block-formatter-form-link.php';
100 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/block-formatters/class-convertkit-block-formatter-product-link.php';
101 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/plugin-sidebars/class-convertkit-plugin-sidebar.php';
102 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/plugin-sidebars/class-convertkit-plugin-sidebar-post-settings.php';
103 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/pre-publish-actions/class-convertkit-pre-publish-action.php';
104 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/pre-publish-actions/class-convertkit-pre-publish-action-broadcast-export.php';
105 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/widgets/class-ck-widget-form.php';
25 + const POST_META_KEY = '_wp_convertkit_post_meta';
106 26
107 -// Admin classes.
108 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/class-convertkit-admin-bulk-edit.php';
109 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/class-convertkit-admin-quick-edit.php';
110 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/class-convertkit-admin-cache-plugins.php';
111 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/class-convertkit-admin-category.php';
112 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/class-convertkit-admin-landing-page.php';
113 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/class-convertkit-admin-post.php';
114 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/class-convertkit-admin-refresh-resources.php';
115 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/class-convertkit-admin-restrict-content.php';
116 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/class-convertkit-admin-settings.php';
117 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/class-convertkit-admin-tinymce.php';
118 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/class-convertkit-admin-setup-wizard.php';
119 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/class-convertkit-wp-list-table.php';
120 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/importers/class-convertkit-admin-importer.php';
121 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/importers/class-convertkit-admin-importer-activecampaign.php';
122 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/importers/class-convertkit-admin-importer-aweber.php';
123 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/importers/class-convertkit-admin-importer-campaignmonitor.php';
124 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/importers/class-convertkit-admin-importer-mc4wp.php';
125 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/importers/class-convertkit-admin-importer-mailpoet.php';
126 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/importers/class-convertkit-admin-importer-newsletter.php';
127 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/section/class-convertkit-admin-section-base.php';
128 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/section/class-convertkit-admin-section-broadcasts.php';
129 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/section/class-convertkit-admin-section-form-entries.php';
130 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/section/class-convertkit-admin-section-general.php';
131 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/section/class-convertkit-admin-section-oauth.php';
132 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/section/class-convertkit-admin-section-restrict-content.php';
133 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/section/class-convertkit-admin-section-tools.php';
134 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/setup-wizard/class-convertkit-admin-setup-wizard-plugin.php';
135 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/setup-wizard/class-convertkit-admin-setup-wizard-landing-page.php';
136 -require_once CONVERTKIT_PLUGIN_PATH . '/admin/setup-wizard/class-convertkit-admin-setup-wizard-restrict-content.php';
27 + const SETTINGS_NAME = '_wp_convertkit_settings';
137 28
138 -// Contact Form 7 Integration.
139 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/integrations/contactform7/class-convertkit-contactform7-admin-section.php';
140 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/integrations/contactform7/class-convertkit-contactform7.php';
141 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/integrations/contactform7/class-convertkit-contactform7-settings.php';
29 + const SETTINGS_PAGE_SLUG = '_wp_convertkit_settings';
142 30
143 -// Divi Integration.
144 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/integrations/divi/class-convertkit-divi.php';
31 + /**
32 + * @var ConvertKit_API
33 + */
34 + private static $api;
145 35
146 -// Elementor Integration.
147 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/integrations/elementor/class-convertkit-elementor.php';
36 + /**
37 + * @var int Data Caching
38 + */
39 + private static $cache_period = 0;
148 40
149 -// Forminator Integration.
150 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/integrations/forminator/class-convertkit-forminator-admin-section.php';
151 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/integrations/forminator/class-convertkit-forminator.php';
152 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/integrations/forminator/class-convertkit-forminator-settings.php';
41 + /**
42 + * @var null
43 + */
44 + private static $meta_defaults = null;
153 45
154 -// Impeka Integration.
155 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/integrations/class-convertkit-impeka.php';
46 + /**
47 + * @var array
48 + */
49 + private static $settings_defaults = array(
50 + 'api_key' => '',
51 + 'default_form' => 0,
52 + );
156 53
157 -// Uncode Integration.
158 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/integrations/class-convertkit-uncode.php';
54 + /**
55 + * @var array
56 + */
57 + private static $forms_markup = array();
159 58
160 -// WishList Member Integration.
161 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/integrations/wishlist/class-convertkit-wishlist-admin-section.php';
162 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/integrations/wishlist/class-convertkit-wishlist.php';
163 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/integrations/wishlist/class-convertkit-wishlist-settings.php';
59 + /** @var array */
60 + private static $landing_pages_markup = array();
164 61
165 -// WooCommerce Integration.
166 -require_once CONVERTKIT_PLUGIN_PATH . '/includes/integrations/woocommerce/class-convertkit-woocommerce-product-form.php';
62 + /** @var string */
63 + private static $forms_version = '6';
167 64
168 -// Register Plugin activation and deactivation functions.
169 -register_activation_hook( __FILE__, 'convertkit_plugin_activate' );
170 -add_action( 'wp_insert_site', 'convertkit_plugin_activate_new_site' );
171 -add_action( 'activate_blog', 'convertkit_plugin_activate_new_site' );
172 -register_deactivation_hook( __FILE__, 'convertkit_plugin_deactivate' );
65 + /**
66 + * Initialize the class
67 + */
68 + public static function init() {
69 + self::add_actions();
70 + self::add_filters();
71 + self::register_shortcodes();
173 72
174 -/**
175 - * Main function to return Plugin instance.
176 - *
177 - * @since 1.9.6
178 - */
179 -function WP_ConvertKit() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName
73 + self::$cache_period = MINUTE_IN_SECONDS * 10;
180 74
181 - return WP_ConvertKit::get_instance();
75 + self::_api_connect();
76 + }
182 77
183 -}
78 + /**
79 + * Add WP Actions
80 + */
81 + private static function add_actions() {
82 + add_action( 'plugins_loaded', array( __CLASS__, 'load_textdomain' ) );
83 + if ( is_admin() ) {
84 + add_action( 'add_meta_boxes_page', array( __CLASS__, 'add_meta_boxes' ) );
85 + add_action( 'add_meta_boxes_post', array( __CLASS__, 'add_meta_boxes' ) );
86 + } else {
87 + add_action( 'template_redirect', array( __CLASS__, 'page_takeover' ) );
88 + }
184 89
185 -// Finally, initialize the Plugin.
186 -WP_ConvertKit();
90 + add_action( 'widgets_init', array( __CLASS__, 'ck_register_widgets' ) );
91 +
92 + add_action( 'save_post', array( __CLASS__, 'save_post_meta' ), 10, 2 );
93 +
94 + add_action( 'init', array( __CLASS__, 'upgrade' ) , 10 );
95 + }
96 +
97 + /**
98 + * Load plugin textdomain
99 + */
100 + public static function load_textdomain() {
101 + load_plugin_textdomain( 'convertkit', false, basename( dirname( __FILE__ ) ) . '/languages/' );
102 + }
103 +
104 + /**
105 + * Add WP Filters
106 + */
107 + private static function add_filters() {
108 + if ( ! is_admin() ) {
109 + add_filter( 'the_content', array( __CLASS__, 'append_form' ) );
110 + }
111 +
112 + add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), array( __CLASS__, 'add_settings_page_link' ) );
113 + }
114 +
115 + /**
116 + * Register ConvertKit shortcodes
117 + */
118 + private static function register_shortcodes() {
119 + add_shortcode( 'convertkit', array( __CLASS__, 'shortcode' ) );
120 + }
121 +
122 + /**
123 + * Plugin action links callback
124 + *
125 + * @param $links
126 + * @return array
127 + */
128 + public static function add_settings_page_link( $links ) {
129 + $settings_link = sprintf( '<a href="%s">%s</a>', self::_get_settings_page_link(), __( 'Settings', 'convertkit' ) );
130 +
131 + return array(
132 + 'settings' => $settings_link,
133 + ) + $links;
134 + }
135 +
136 + /**
137 + * Add Meta Boxes callback
138 + *
139 + * @param WP_Post $post The current post.
140 + */
141 + public static function add_meta_boxes( $post ) {
142 + $forms = self::$api->get_resources( 'forms' );
143 + $landing_pages = self::$api->get_resources( 'landing_pages' );
144 +
145 + if ( ! empty( $forms ) || ( 'page' === $post->post_type && ! empty( $landing_pages ) ) ) {
146 + add_meta_box( 'wp-convertkit-meta-box', __( 'ConvertKit', 'convertkit' ), array( __CLASS__, 'display_meta_box' ), $post->post_type, 'normal' );
147 + }
148 + }
149 +
150 + /**
151 + * Metabox callback
152 + *
153 + * @param $post
154 + */
155 + public static function display_meta_box( $post ) {
156 + $forms = self::$api->get_resources( 'forms' );
157 + $landing_pages = self::$api->get_resources( 'landing_pages' );
158 +
159 + $meta = self::_get_meta( $post->ID );
160 + $settings_link = self::_get_settings_page_link();
161 +
162 + include( 'views/backend/meta-boxes/meta-box.php' );
163 + }
164 +
165 + /**
166 + * Save post meta callback
167 + *
168 + * @param int $post_id Post id.
169 + * @param WP_Post $post The post.
170 + */
171 + public static function save_post_meta( $post_id, $post ) {
172 + if ( wp_is_post_autosave( $post_id )
173 + || wp_is_post_revision( $post_id )
174 + || ! isset( $_POST['wp-convertkit-save-meta-nonce'] ) // WPCS input var okay.
175 + || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['wp-convertkit-save-meta-nonce'] ) ), 'wp-convertkit-save-meta' ) ) { // WPCS input var okay.
176 + return;
177 + }
178 + if ( isset( $_POST['wp-convertkit'] ) ) { // WPCS input var okay.
179 + $form = '';
180 + if ( isset( $_POST['wp-convertkit']['form'] ) ) { // WPCS input var okay.
181 + $form = sanitize_text_field( wp_unslash( $_POST['wp-convertkit']['form'] ) ); // WPCS input var okay.
182 + }
183 + $landing_page = '';
184 + if ( isset( $_POST['wp-convertkit']['landing_page'] ) ) { // WPCS input var okay.
185 + $landing_page = sanitize_text_field( wp_unslash( $_POST['wp-convertkit']['landing_page'] ) ); // WPCS input var okay.
186 + }
187 + $meta = array(
188 + 'form' => $form,
189 + 'landing_page' => $landing_page,
190 + );
191 + update_post_meta( $post_id, self::POST_META_KEY, $meta );
192 + }
193 + }
194 +
195 + /**
196 + * Page/Post display callback
197 + *
198 + * @param string $content The post content.
199 + * @return string
200 + */
201 + public static function append_form( $content ) {
202 +
203 + if ( is_singular( array( 'post' ) ) || is_page() ) {
204 +
205 + $attributes = self::_get_meta( get_the_ID() );
206 +
207 + $form_id = 0;
208 +
209 + if ( isset( $attributes['form'] ) && ( 0 < $attributes['form'] ) ) {
210 + $form_id = $attributes['form'];
211 + } else {
212 + if ( '-1' === $attributes['form'] ) {
213 + $form_id = self::_get_settings( 'default_form' );
214 + }
215 + }
216 +
217 + if ( 0 < $form_id ) {
218 + $url = add_query_arg( array(
219 + 'api_key' => self::_get_settings( 'api_key' ),
220 + 'v' => self::$forms_version,
221 + ),
222 + 'https://forms.convertkit.com/' . $form_id . '.html'
223 + );
224 +
225 + $form_markup = self::$api->get_resource( $url );
226 + $content .= $form_markup;
227 + }
228 + }
229 +
230 + return $content;
231 + }
232 +
233 + /**
234 + * Replace page content if a landing_page is set
235 + */
236 + public static function page_takeover() {
237 + $queried_object = get_queried_object();
238 + if ( isset( $queried_object->post_type )
239 + && 'page' === $queried_object->post_type ) {
240 +
241 + $landing_page_url = self::_get_meta( $queried_object->ID, 'landing_page' );
242 +
243 + $landing_page = self::$api->get_resource( $landing_page_url );
244 +
245 + if ( ! empty( $landing_page ) ) {
246 + echo $landing_page; // WPCS: XSS ok.
247 + exit;
248 + }
249 + }
250 +
251 + }
252 +
253 + /**
254 + * Register widget.
255 + */
256 + public static function ck_register_widgets() {
257 + register_widget( 'CK_Widget_Form' );
258 + }
259 +
260 + /**
261 + * Shortcode callback
262 + *
263 + * @param array $attributes Shortcode attributes.
264 + * @param null $content
265 + * @return mixed|void
266 + */
267 + public static function shortcode( $attributes, $content = null ) {
268 +
269 + if ( isset( $attributes['id'] ) ) {
270 + $form_id = $attributes['id'];
271 + $url = add_query_arg( array(
272 + 'api_key' => self::_get_settings( 'api_key' ),
273 + 'v' => self::$forms_version,
274 + ),
275 + 'https://forms.convertkit.com/' . $form_id . '.html'
276 + );
277 + } elseif ( isset( $attributes['form'] ) ) {
278 + $form_id = $attributes['form'];
279 + $url = add_query_arg( array(
280 + 'k' => self::_get_settings( 'api_key' ),
281 + 'v' => '2',
282 + ),
283 + 'https://api.convertkit.com/forms/' . $form_id . '/embed'
284 + );
285 + } else {
286 + $form_id = self::_get_settings( 'default_form' );
287 + $url = add_query_arg( array(
288 + 'api_key' => self::_get_settings( 'api_key' ),
289 + 'v' => self::$forms_version,
290 + ),
291 + 'https://forms.convertkit.com/' . $form_id . '.html'
292 + );
293 + }
294 +
295 + if ( 0 < $form_id ) {
296 + $form_markup = self::$api->get_resource( $url );
297 + } else {
298 + $form_markup = '';
299 + }
300 +
301 + return apply_filters( 'wp_convertkit_get_form_embed', $form_markup, $attributes );
302 + }
303 +
304 + /**
305 + * Retrieve meta
306 + *
307 + * @return array|null
308 + */
309 + private static function _get_meta_defaults() {
310 + if ( is_null( self::$meta_defaults ) ) {
311 + self::$meta_defaults = array(
312 + 'form' => -1,
313 + 'landing_page' => '',
314 + );
315 + }
316 +
317 + return self::$meta_defaults;
318 + }
319 +
320 + /**
321 + * Get selected post meta
322 + *
323 + * @param int $post_id Post ID.
324 + * @param null $meta_key Key string to get.
325 + *
326 + * @return array|bool
327 + */
328 + private static function _get_meta( $post_id, $meta_key = null ) {
329 + $post_id = empty( $post_id ) ? get_the_ID() : $post_id;
330 +
331 + $meta = get_post_meta( $post_id, self::POST_META_KEY, true );
332 + $meta_defaults = self::_get_meta_defaults();
333 +
334 + if ( empty( $meta ) ) {
335 + $meta = $meta_defaults;
336 +
337 + $old_value = intval( get_post_meta( $post_id, '_convertkit_convertkit_form', true ) );
338 + if ( 0 !== $old_value ) {
339 + $meta['form'] = $old_value;
340 + }
341 + }
342 +
343 + $meta = shortcode_atts( $meta_defaults, $meta );
344 +
345 + return is_null( $meta_key ) ? $meta : ( isset( $meta[ $meta_key ] ) ? $meta[ $meta_key ] : false );
346 + }
347 +
348 + /**
349 + * Get plugin settings
350 + *
351 + * @param null $settings_key
352 + * @return mixed|null|void
353 + */
354 + private static function _get_settings( $settings_key = null ) {
355 + $settings = get_option( self::SETTINGS_NAME, self::$settings_defaults );
356 +
357 + return is_null( $settings_key ) ? $settings : ( isset( $settings[ $settings_key ] ) ? $settings[ $settings_key ] : null);
358 + }
359 +
360 + /**
361 + * Get instance of ConvertKitAPI
362 + */
363 + private static function _api_connect() {
364 + $api_key = self::_get_settings( 'api_key' );
365 + $api_secret = self::_get_settings( 'api_secret' );
366 + $debug = self::_get_settings( 'debug' );
367 +
368 + self::$api = new ConvertKit_API( $api_key, $api_secret, $debug );
369 + }
370 +
371 + /**
372 + * Get instance of the CK API
373 + *
374 + * @return ConvertKit_API
375 + */
376 + public static function get_api() {
377 + return self::$api;
378 + }
379 +
380 + /**
381 + * Get ConvertKit API key
382 + *
383 + * @return mixed|null|void
384 + */
385 + public static function get_api_key() {
386 + return self::_get_settings( 'api_key' );
387 + }
388 +
389 + /**
390 + * @return string
391 + */
392 + public static function get_forms_version() {
393 + return self::$forms_version;
394 + }
395 +
396 + /**
397 + * Get link to the plugin settings page
398 + *
399 + * @param array $query_args Args to add to URL.
400 + * @return string
401 + */
402 + private static function _get_settings_page_link( $query_args = array() ) {
403 + $query_args = array(
404 + 'page' => self::SETTINGS_PAGE_SLUG,
405 + ) + $query_args;
406 +
407 + return add_query_arg( $query_args, admin_url( 'options-general.php' ) );
408 + }
409 +
410 + /**
411 + * Run version specific upgrade.
412 + */
413 + public static function upgrade() {
414 +
415 + $current_version = get_option( 'convertkit_version' );
416 +
417 + if ( ! $current_version ) {
418 + // Run 1.4.1 upgrade.
419 + $settings = self::_get_settings();
420 +
421 + if ( isset( $settings['api_key'] ) ) {
422 + // Get all posts and pages to track what has been updated.
423 + $posts = get_option( '_wp_convertkit_upgrade_posts' );
424 +
425 + if ( ! $posts ) {
426 +
427 + $args = array(
428 + 'post_type' => array( 'post', 'page' ),
429 + 'fields' => 'ids',
430 + );
431 +
432 + $result = new WP_Query( $args );
433 + if ( ! is_wp_error( $result ) ) {
434 + $posts = $result->posts;
435 + update_option( '_wp_convertkit_upgrade_posts', $posts );
436 + }
437 + }
438 +
439 + // Get form mappings.
440 + $mappings = self::$api->get_resources( 'subscription_forms' );
441 +
442 + // 1. Update global form. Set 'api_version' so this is only done once.
443 + if ( ! isset( $settings['api_version'] ) ) {
444 + $old_form_id = $settings['default_form'];
445 + $settings['default_form'] = isset( $mappings[ $old_form_id ] ) ? $mappings[ $old_form_id ] : 0;
446 + $settings['api_version'] = 'v3';
447 + update_option( self::SETTINGS_NAME, $settings );
448 + }
449 +
450 + // 2. Scan posts/pages for _wp_convertkit_post_meta and update IDs
451 + // Scan content for shortcode and update
452 + // Remove page_id from posts array after page is updated.
453 + foreach ( $posts as $key => $post_id ) {
454 + $post_settings = get_post_meta( $post_id, '_wp_convertkit_post_meta', true );
455 +
456 + if ( isset( $post_settings['form'] ) && ( 0 < $post_settings['form'] ) ) {
457 + $post_settings['form'] = isset( $mappings[ $post_settings['form'] ] ) ? $mappings[ $post_settings['form'] ] : 0;
458 + }
459 + if ( isset( $post_settings['landing_page'] ) && ( 0 < $post_settings['landing_page'] ) ) {
460 + $post_settings['landing_page'] = isset( $mappings[ $post_settings['landing_page'] ] ) ? $mappings[ $post_settings['landing_page'] ] : 0;
461 + }
462 + update_post_meta( $post_id, '_wp_convertkit_post_meta', $post_settings );
463 + unset( $posts[ $key ] );
464 + update_option( '_wp_convertkit_upgrade_posts', $posts );
465 + }
466 +
467 + // Done scanning posts, upgrade complete.
468 + if ( empty( $posts ) ) {
469 + update_option( 'convertkit_version', self::VERSION );
470 + delete_option( '_wp_convertkit_upgrade_posts' );
471 + }
472 + } else {
473 + update_option( 'convertkit_version', self::VERSION );
474 + } // End if().
475 + } // End if().
476 + }
477 + }
478 +
479 + WP_ConvertKit::init();
480 +} // End if().
481 +
482 +include 'admin/class-convertkit-settings.php';