'',
'default_form' => 0,
);
/**
* @var array
*/
private static $forms_markup = array();
/** @var array */
private static $landing_pages_markup = array();
/** @var string */
private static $forms_version = '6';
/**
* Initialize the class
*/
public static function init() {
self::add_actions();
self::add_filters();
self::register_shortcodes();
self::$cache_period = MINUTE_IN_SECONDS * 10;
self::_api_connect();
}
/**
* Add WP Actions
*/
private static function add_actions() {
add_action( 'plugins_loaded', array( __CLASS__, 'load_textdomain' ) );
if ( is_admin() ) {
add_action( 'add_meta_boxes_page', array( __CLASS__, 'add_meta_boxes' ) );
add_action( 'add_meta_boxes_post', array( __CLASS__, 'add_meta_boxes' ) );
} else {
add_action( 'template_redirect', array( __CLASS__, 'page_takeover' ) );
add_action( 'wp_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) );
}
add_action( 'widgets_init', array( __CLASS__, 'ck_register_widgets' ) );
add_action( 'save_post', array( __CLASS__, 'save_post_meta' ), 10, 2 );
add_action( 'init', array( __CLASS__, 'upgrade' ) , 10 );
}
/**
* Load plugin textdomain
*/
public static function load_textdomain() {
load_plugin_textdomain( 'convertkit', false, basename( dirname( __FILE__ ) ) . '/languages/' );
}
/**
* Add WP Filters
*/
private static function add_filters() {
if ( ! is_admin() ) {
add_filter( 'the_content', array( __CLASS__, 'append_form' ) );
}
add_filter( 'plugin_action_links_' . CONVERTKIT_PLUGIN_FILE, array( __CLASS__, 'add_settings_page_link' ) );
}
/**
* Register ConvertKit shortcodes
*/
private static function register_shortcodes() {
add_shortcode( 'convertkit', array( __CLASS__, 'shortcode' ) );
}
/**
* Plugin action links callback
*
* @param $links
* @return array
*/
public static function add_settings_page_link( $links ) {
$settings_link = sprintf( '%s', self::_get_settings_page_link(), __( 'Settings', 'convertkit' ) );
return array(
'settings' => $settings_link,
) + $links;
}
/**
* Add Meta Boxes callback
*
* @param WP_Post $post The current post.
*/
public static function add_meta_boxes( $post ) {
add_meta_box( 'wp-convertkit-meta-box', __( 'ConvertKit', 'convertkit' ), array( __CLASS__, 'display_meta_box' ), $post->post_type, 'normal' );
}
/**
* Metabox callback
*
* @param $post
*/
public static function display_meta_box( $post ) {
$forms = get_option( 'convertkit_forms' );
$landing_pages = get_option( 'convertkit_landing_pages' );
$tags = get_option( 'convertkit_tags' );
$meta = self::_get_meta( $post->ID );
$settings_link = self::_get_settings_page_link();
include( CONVERTKIT_PLUGIN_PATH . '/views/backend/meta-boxes/meta-box.php' );
}
/**
* Save post meta callback
*
* @param int $post_id Post id.
* @param WP_Post $post The post.
*/
public static function save_post_meta( $post_id, $post ) {
if ( wp_is_post_autosave( $post_id )
|| wp_is_post_revision( $post_id )
|| ! isset( $_POST['wp-convertkit-save-meta-nonce'] ) // WPCS input var okay.
|| ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['wp-convertkit-save-meta-nonce'] ) ), 'wp-convertkit-save-meta' ) ) { // WPCS input var okay.
return;
}
if ( isset( $_POST['wp-convertkit'] ) ) { // WPCS input var okay.
$form = '';
if ( isset( $_POST['wp-convertkit']['form'] ) ) { // WPCS input var okay.
$form = sanitize_text_field( wp_unslash( $_POST['wp-convertkit']['form'] ) ); // WPCS input var okay.
}
$landing_page = '';
if ( isset( $_POST['wp-convertkit']['landing_page'] ) ) { // WPCS input var okay.
$landing_page = sanitize_text_field( wp_unslash( $_POST['wp-convertkit']['landing_page'] ) ); // WPCS input var okay.
}
$tag = '';
if ( isset( $_POST['wp-convertkit']['tag'] ) ) { // WPCS input var okay.
$tag = sanitize_text_field( wp_unslash( $_POST['wp-convertkit']['tag'] ) ); // WPCS input var okay.
}
$meta = array(
'form' => $form,
'landing_page' => $landing_page,
'tag' => $tag,
);
update_post_meta( $post_id, self::POST_META_KEY, $meta );
}
}
/**
* Page/Post display callback
*
* @param string $content The post content.
* @return string
*/
public static function append_form( $content ) {
if ( is_singular( array( 'post' ) ) || is_page() ) {
$attributes = self::_get_meta( get_the_ID() );
// Get post/page form setting
if ( isset( $attributes['form'] ) && ( 0 < $attributes['form'] ) ) {
$form_id = $attributes['form'];
} else {
// Get category form
$form_id = self::get_category_form( get_the_ID() );
if ( 0 === $form_id ) {
// Get global default form
if ( '-1' === $attributes['form'] ) {
$form_id = self::_get_settings( 'default_form' );
}
}
}
if ( 0 < $form_id ) {
$forms = get_option( 'convertkit_forms' );
if ( isset( $forms[ $form_id ]['uid'] ) ) {
// new form
$tag = '';
$content .= $tag;
} else {
// old form
$url = add_query_arg(
array(
'api_key' => self::_get_settings( 'api_key' ),
'v' => self::$forms_version,
),
'https://forms.convertkit.com/' . $form_id . '.html'
);
$form_markup = self::$api->get_resource( $url );
$content .= $form_markup;
}
}
}
return $content;
}
/**
* Replace page content if a landing_page is set
*/
public static function page_takeover() {
$queried_object = get_queried_object();
if ( isset( $queried_object->post_type )
&& 'page' === $queried_object->post_type ) {
$landing_page_id = self::_get_meta( $queried_object->ID, 'landing_page' );
if ( '0' === $landing_page_id ) {
// Set to None
return;
}
if ( strstr( $landing_page_id, 'http') ) {
// Old landing page
$landing_page = self::$api->get_resource( $landing_page_id );
if ( ! empty( $landing_page ) ) {
$script = WP_ConvertKit::get_ck_script();
$script .= "";
$landing_page = str_replace( '', $script, $landing_page );
echo $landing_page; // WPCS: XSS ok.
exit;
}
} else {
// New landing page
$landing_pages = get_option( 'convertkit_landing_pages' );
$landing_page = self::$api->get_resource( $landing_pages[$landing_page_id]['embed_url'] );
if ( ! empty( $landing_page ) ) {
$script = WP_ConvertKit::get_ck_script( true );
$script .= "";
$landing_page = str_replace( '', $script, $landing_page );
echo $landing_page; // WPCS: XSS ok.
exit;
}
}
}
}
/**
* Generate HTML for including ConvertKit JS in a landing page.
*
* During the landing page takeover the normal WordPress enqueue routine is not run so we need to add these
* javascript if we want subscribers tagged correctly.
*
* @since 1.5.2
* @param bool $include_jquery
* @return string
*/
public static function get_ck_script( $include_jquery = false) {
$script = '';
if ( $include_jquery ) {
$scripts = new WP_Scripts();
$script .= "";
}
$script .= "";
$script .= "";
$script .= "';
return $script;
}
/**
* Enqueue scripts
*/
public static function enqueue_scripts() {
wp_enqueue_script( 'jquery-cookie', CONVERTKIT_PLUGIN_URL . 'resources/frontend/jquery.cookie.min.js', array( 'jquery' ), '1.4.0' );
wp_register_script( 'convertkit-js', CONVERTKIT_PLUGIN_URL . 'resources/frontend/wp-convertkit.js', array( 'jquery-cookie' ), CONVERTKIT_PLUGIN_VERSION );
wp_localize_script( 'convertkit-js', 'ck_data', array(
'ajaxurl' => admin_url( 'admin-ajax.php' ),
) );
wp_enqueue_script( 'convertkit-js' );
}
/**
* Register widget.
*/
public static function ck_register_widgets() {
register_widget( 'CK_Widget_Form' );
}
/**
* Shortcode callback
*
* @param array $attributes Shortcode attributes.
* @param null $content
* @return mixed|void
*/
public static function shortcode( $attributes, $content = null ) {
if ( isset( $attributes['id'] ) ) {
$form_id = $attributes['id'];
$forms = get_option( 'convertkit_forms' );
if ( isset( $forms[ $form_id ]['uid'] ) ) {
// new form
$form_markup = '';
return apply_filters( 'wp_convertkit_get_form_embed', $form_markup, $attributes );
} else {
// old form
$url = add_query_arg(
array(
'api_key' => self::_get_settings( 'api_key' ),
'v' => self::$forms_version,
),
'https://forms.convertkit.com/' . $form_id . '.html'
);
}
} elseif ( isset( $attributes['form'] ) ) {
$form_id = $attributes['form'];
$forms = get_option( 'convertkit_forms' );
if ( isset( $forms[ $form_id ]['uid'] ) ) {
// new form
$form_markup = '';
return apply_filters( 'wp_convertkit_get_form_embed', $form_markup, $attributes );
} else {
$url = add_query_arg(
array(
'k' => self::_get_settings( 'api_key' ),
'v' => '2',
),
'https://api.convertkit.com/forms/' . $form_id . '/embed'
);
}
} else {
$form_id = self::_get_settings( 'default_form' );
$url = add_query_arg(
array(
'api_key' => self::_get_settings( 'api_key' ),
'v' => self::$forms_version,
),
'https://forms.convertkit.com/' . $form_id . '.html'
);
}
if ( 0 < $form_id ) {
$form_markup = self::$api->get_resource( $url );
} else {
$form_markup = '';
}
return apply_filters( 'wp_convertkit_get_form_embed', $form_markup, $attributes );
}
/**
* Retrieve meta
*
* @return array|null
*/
private static function _get_meta_defaults() {
if ( is_null( self::$meta_defaults ) ) {
self::$meta_defaults = array(
'form' => '-1',
'landing_page' => '',
'tag' => '',
);
}
return self::$meta_defaults;
}
/**
* Get selected post meta
*
* @param int $post_id Post ID.
* @param null $meta_key Key string to get.
*
* @return array|bool
*/
private static function _get_meta( $post_id, $meta_key = null ) {
$post_id = empty( $post_id ) ? get_the_ID() : $post_id;
$meta = get_post_meta( $post_id, self::POST_META_KEY, true );
$meta_defaults = self::_get_meta_defaults();
if ( empty( $meta ) ) {
$meta = $meta_defaults;
$old_value = intval( get_post_meta( $post_id, '_convertkit_convertkit_form', true ) );
if ( 0 !== $old_value ) {
$meta['form'] = $old_value;
}
}
$meta = shortcode_atts( $meta_defaults, $meta );
return is_null( $meta_key ) ? $meta : ( isset( $meta[ $meta_key ] ) ? $meta[ $meta_key ] : false );
}
/**
* Get plugin settings
*
* @param null $settings_key
* @return mixed|null|void
*/
public static function _get_settings( $settings_key = null ) {
$settings = get_option( self::SETTINGS_NAME, self::$settings_defaults );
return is_null( $settings_key ) ? $settings : ( isset( $settings[ $settings_key ] ) ? $settings[ $settings_key ] : null);
}
/**
* Get instance of ConvertKitAPI
*/
private static function _api_connect() {
$api_key = self::_get_settings( 'api_key' );
$api_secret = self::_get_settings( 'api_secret' );
$debug = self::_get_settings( 'debug' );
self::$api = new ConvertKit_API( $api_key, $api_secret, $debug );
}
/**
* Get instance of the CK API
*
* @return ConvertKit_API
*/
public static function get_api() {
return self::$api;
}
/**
* Get ConvertKit API key
*
* @return mixed|null|void
*/
public static function get_api_key() {
return self::_get_settings( 'api_key' );
}
/**
* Get ConvertKit API secret
*
* @return mixed|null|void
*/
public static function get_api_secret() {
return self::_get_settings( 'api_secret' );
}
/**
* @return string
*/
public static function get_forms_version() {
return self::$forms_version;
}
/**
* Get link to the plugin settings page
*
* @param array $query_args Args to add to URL.
* @return string
*/
private static function _get_settings_page_link( $query_args = array() ) {
$query_args = array(
'page' => self::SETTINGS_PAGE_SLUG,
) + $query_args;
return add_query_arg( $query_args, admin_url( 'options-general.php' ) );
}
/**
* Get default form for the post's categories.
* If there are multiple set the last one found will be returned.
*
* @param int $id
* @return int $form_id
*/
private static function get_category_form( $id ) {
$categories = wp_get_post_categories( $id );
$form_id = 0;
foreach ( $categories as $category ) {
$id = get_term_meta( $category, 'ck_default_form', true );
if ( $id ) {
$form_id = $id;
}
}
return $form_id;
}
/**
* Output data to log file
*
* @param string $message String to add to log.
*/
static function log( $message ) {
if ( 'on' === self::_get_settings( 'debug' ) ) {
$dir = CONVERTKIT_PLUGIN_PATH;
$handle = fopen( trailingslashit( $dir ) . 'log.txt', 'a' );
if ( $handle ) {
$time = date_i18n( 'm-d-Y @ H:i:s -' );
fwrite( $handle, $time . ' ' . $message . "\n" );
fclose( $handle );
}
}
}
/**
* Run version specific upgrade.
*/
public static function upgrade() {
$current_version = get_option( 'convertkit_version' );
$convertkit_user_history_table = get_option( 'convertkit_user_history_table' );
if ( ! $current_version ) {
// Run 1.4.1 upgrade.
$settings = self::_get_settings();
if ( isset( $settings['api_key'] ) ) {
// Get all posts and pages to track what has been updated.
$posts = get_option( '_wp_convertkit_upgrade_posts' );
if ( ! $posts ) {
$args = array(
'post_type' => array( 'post', 'page' ),
'fields' => 'ids',
);
$result = new WP_Query( $args );
if ( ! is_wp_error( $result ) ) {
$posts = $result->posts;
update_option( '_wp_convertkit_upgrade_posts', $posts );
}
}
// Get form mappings.
$mappings = self::$api->get_resources( 'subscription_forms' );
// 1. Update global form. Set 'api_version' so this is only done once.
if ( ! isset( $settings['api_version'] ) ) {
$old_form_id = $settings['default_form'];
$settings['default_form'] = isset( $mappings[ $old_form_id ] ) ? $mappings[ $old_form_id ] : 0;
$settings['api_version'] = 'v3';
update_option( self::SETTINGS_NAME, $settings );
}
// 2. Scan posts/pages for _wp_convertkit_post_meta and update IDs
// Scan content for shortcode and update
// Remove page_id from posts array after page is updated.
foreach ( $posts as $key => $post_id ) {
$post_settings = get_post_meta( $post_id, '_wp_convertkit_post_meta', true );
if ( isset( $post_settings['form'] ) && ( 0 < $post_settings['form'] ) ) {
$post_settings['form'] = isset( $mappings[ $post_settings['form'] ] ) ? $mappings[ $post_settings['form'] ] : 0;
}
if ( isset( $post_settings['landing_page'] ) && ( 0 < $post_settings['landing_page'] ) ) {
$post_settings['landing_page'] = isset( $mappings[ $post_settings['landing_page'] ] ) ? $mappings[ $post_settings['landing_page'] ] : 0;
}
update_post_meta( $post_id, '_wp_convertkit_post_meta', $post_settings );
unset( $posts[ $key ] );
update_option( '_wp_convertkit_upgrade_posts', $posts );
}
// Done scanning posts, upgrade complete.
if ( empty( $posts ) ) {
update_option( 'convertkit_version', CONVERTKIT_PLUGIN_VERSION );
delete_option( '_wp_convertkit_upgrade_posts' );
}
} else {
update_option( 'convertkit_version', CONVERTKIT_PLUGIN_VERSION );
} // End if().
} elseif ( version_compare( $current_version, '1.5.0', '<' ) || ! $convertkit_user_history_table ) {
// Create User History table
ConvertKit_Custom_Content::create_table();
update_option( 'convertkit_version', CONVERTKIT_PLUGIN_VERSION );
} elseif ( version_compare( $current_version, '1.6.1', '<' ) ) {
// Refresh the forms meta to get new forms builder settings
$api_key = self::_get_settings( 'api_key' );
if ( ! empty( $api_key ) ) {
self::$api->update_resources( $api_key );
}
update_option( 'convertkit_version', CONVERTKIT_PLUGIN_VERSION );
}// End if().
}
}