274 lines
5.7 KiB
PHP
274 lines
5.7 KiB
PHP
<?php
|
|
/**
|
|
* Shortcode class.
|
|
*
|
|
* @since 2.6.9
|
|
*
|
|
* @package OMAPI
|
|
* @author Justin Sternberg
|
|
*/
|
|
|
|
// Exit if accessed directly.
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Shortcode class.
|
|
*
|
|
* @since 2.6.9
|
|
*/
|
|
class OMAPI_Shortcodes_Shortcode {
|
|
|
|
/**
|
|
* Holds the base class object.
|
|
*
|
|
* @since 2.6.9
|
|
*
|
|
* @var object
|
|
*/
|
|
public $base;
|
|
|
|
/**
|
|
* Shortcode attributes.
|
|
*
|
|
* @since 2.6.9
|
|
*
|
|
* @var array
|
|
*/
|
|
public $atts = array();
|
|
|
|
/**
|
|
* The shortcode campaign identifier, slug (or ID for legacy/back-compat).
|
|
*
|
|
* @since 2.6.9
|
|
*
|
|
* @var string|int
|
|
*/
|
|
public $identifier = '';
|
|
|
|
/**
|
|
* The global post object.
|
|
*
|
|
* @since 2.6.9
|
|
*
|
|
* @var WP_Post
|
|
*/
|
|
public $post = null;
|
|
|
|
/**
|
|
* The OM campaign post object.
|
|
*
|
|
* @since 2.6.9
|
|
*
|
|
* @var WP_Post
|
|
*/
|
|
public $campaign = null;
|
|
|
|
/**
|
|
* Class constructor.
|
|
*
|
|
* @param array $atts Array of shortcode attributes.
|
|
* @param object $post The post object to check against.
|
|
*
|
|
* @since 2.6.9
|
|
*/
|
|
public function __construct( $atts, $post ) {
|
|
$this->atts = $atts;
|
|
$this->post = $post;
|
|
$this->base = OMAPI::get_instance();
|
|
}
|
|
|
|
/**
|
|
* Sends the shortcode html.
|
|
*
|
|
* @uses wp_validate_boolean
|
|
*
|
|
* @since 2.6.9
|
|
*
|
|
* @return string The shortcode HTML output.
|
|
* @throws OMAPI_Shortcodes_Exception
|
|
*/
|
|
public function handle() {
|
|
return $this
|
|
->check_amp()
|
|
->set_atts(
|
|
array(
|
|
'slug' => '',
|
|
'followrules' => 'false',
|
|
// id attribute is deprecated.
|
|
'id' => '',
|
|
),
|
|
'optin-monster'
|
|
)
|
|
->set_identifier()
|
|
->set_campaign_object()
|
|
->validate_rules()
|
|
->get_campaign_html();
|
|
}
|
|
|
|
/**
|
|
* Sends the inline-campaign shortcode html.
|
|
*
|
|
* @since 2.6.9
|
|
*
|
|
* @return string The shortcode HTML output.
|
|
* @throws OMAPI_Shortcodes_Exception
|
|
*/
|
|
public function handle_inline() {
|
|
return $this
|
|
->check_amp()
|
|
->set_atts(
|
|
array(
|
|
'slug' => '',
|
|
),
|
|
'optin-monster-inline'
|
|
)
|
|
->set_identifier()
|
|
->set_campaign_object()
|
|
->validate_rules( true )
|
|
->get_campaign_html();
|
|
}
|
|
|
|
/**
|
|
* Checking if AMP is enabled.
|
|
*
|
|
* @since 2.6.9
|
|
*
|
|
* @return OMAPI_Shortcodes_Shortcode
|
|
* @throws OMAPI_Shortcodes_Exception
|
|
*/
|
|
public function check_amp() {
|
|
if ( OMAPI_Utils::is_amp_enabled() ) {
|
|
throw new OMAPI_Shortcodes_Exception( 'Amp enabled' );
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set the attributes array using shortcode_atts function.
|
|
*
|
|
* @since 2.6.9
|
|
*
|
|
* @uses shortcode_atts
|
|
*
|
|
* @param array $defaults Array of default attributes.
|
|
* @param string $shortcode_name The shortcode name.
|
|
*
|
|
* @return OMAPI_Shortcodes_Shortcode
|
|
*/
|
|
public function set_atts( $defaults, $shortcode_name ) {
|
|
|
|
// Merge default attributes with passed attributes.
|
|
$this->atts = shortcode_atts( $defaults, $this->atts, $shortcode_name );
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set the campaign identifier from the given attributes, either ID or slug.
|
|
*
|
|
* @since 2.6.9
|
|
*
|
|
* @return OMAPI_Shortcodes_Shortcode
|
|
* @throws OMAPI_Shortcodes_Exception
|
|
*/
|
|
public function set_identifier() {
|
|
$identifier = false;
|
|
|
|
if ( ! empty( $this->atts['slug'] ) ) {
|
|
$identifier = $this->atts['slug'];
|
|
}
|
|
|
|
if ( ! empty( $this->atts['id'] ) ) {
|
|
$identifier = $this->atts['id'];
|
|
}
|
|
|
|
if ( empty( $identifier ) ) {
|
|
// A custom attribute must have been passed. Allow it to be filtered to grab the campaign ID from a custom source.
|
|
$identifier = apply_filters( 'optin_monster_api_custom_optin_id', false, $this->atts, $this->post );
|
|
}
|
|
|
|
// Allow the campaign ID to be filtered before it is stored and used to create the campaign output.
|
|
$identifier = apply_filters( 'optin_monster_api_pre_optin_id', $identifier, $this->atts, $this->post );
|
|
|
|
// If there is no identifier, do nothing.
|
|
if ( empty( $identifier ) ) {
|
|
throw new OMAPI_Shortcodes_Exception( 'Missing identifier in attributes' );
|
|
}
|
|
|
|
$this->identifier = $identifier;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set the campaign object, from the ID/slug.
|
|
*
|
|
* @since 2.6.9
|
|
*
|
|
* @return OMAPI_Shortcodes_Shortcode
|
|
* @throws OMAPI_Shortcodes_Exception
|
|
*/
|
|
public function set_campaign_object() {
|
|
$campaign = ctype_digit( (string) $this->identifier )
|
|
? $this->base->get_optin( absint( $this->identifier ) )
|
|
: $this->base->get_optin_by_slug( sanitize_text_field( $this->identifier ) );
|
|
|
|
// If no campaign found, do nothing.
|
|
if ( empty( $campaign ) ) {
|
|
throw new OMAPI_Shortcodes_Exception( 'Could not find campaign object for identifier' );
|
|
}
|
|
|
|
$this->campaign = $campaign;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Checks the given campaign against the output settings rules.
|
|
*
|
|
* @since 2.6.9
|
|
*
|
|
* @return OMAPI_Shortcodes_Shortcode
|
|
* @throws OMAPI_Shortcodes_Exception
|
|
*/
|
|
public function validate_rules( $force = false ) {
|
|
$should_check = $force || wp_validate_boolean( $this->atts['followrules'] );
|
|
|
|
if (
|
|
$should_check
|
|
// Do OMAPI Output rules check.
|
|
&& ! OMAPI_Rules::check_shortcode( $this->campaign, $this->post->ID )
|
|
) {
|
|
throw new OMAPI_Shortcodes_Exception( 'Failed the WordPress rules' );
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Sends the campaign html, passed through optin_monster_shortcode_output filter.
|
|
*
|
|
* @since 2.6.9
|
|
*
|
|
* @return string Campaign html.
|
|
* @throws OMAPI_Shortcodes_Exception
|
|
*/
|
|
public function get_campaign_html() {
|
|
// Try to grab the stored HTML.
|
|
$html = $this->base->output->prepare_campaign( $this->campaign );
|
|
if ( ! $html ) {
|
|
throw new OMAPI_Shortcodes_Exception( 'Optin object missing campaign html in post_content' );
|
|
}
|
|
|
|
// Make sure to apply shortcode filtering.
|
|
$this->base->output->set_slug( $this->campaign );
|
|
|
|
// Return the HTML.
|
|
return apply_filters( 'optin_monster_shortcode_output', $html, $this->campaign, $this->atts );
|
|
}
|
|
|
|
}
|