Current File : /home/pacjaorg/public_html/cop29/wp-content/plugins/optinmonster/OMAPI/Blocks.php |
<?php
/**
* Gutenberg Blocks registration class.
*
* @since 1.9.10
*
* @package OMAPI
* @author Thomas Griffin
*/
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Gutenberg Blocks registration class.
*
* @since 1.9.10
*/
class OMAPI_Blocks {
/**
* Holds the class object.
*
* @since 1.9.10
*
* @var object
*/
public static $instance;
/**
* Path to the file.
*
* @since 1.9.10
*
* @var string
*/
public $file = __FILE__;
/**
* Holds the base class object.
*
* @since 1.9.10
*
* @var object
*/
public $base;
/**
* The data to be localized for JS.
*
* @since 2.2.0
*
* @var array
*/
protected $data_for_js = array();
/**
* The campaign options list array.
*
* @var null|array
*/
protected static $campaigns_list = null;
/**
* Primary class constructor.
*
* @since 1.9.10
*/
public function __construct() {
// Set our object.
$this->set();
if ( function_exists( 'register_block_type' ) ) {
// Register our blocks.
$this->register_blocks();
add_action( 'enqueue_block_editor_assets', array( $this, 'enqueue_block_editor_assets' ) );
// Register the global post campaign switch meta.
register_meta(
'post',
'om_disable_all_campaigns',
array(
'show_in_rest' => true,
'single' => true,
'type' => 'boolean',
)
);
}
}
/**
* Sets our object instance and base class instance.
*
* @since 1.9.10
*/
public function set() {
self::$instance = $this;
$this->base = OMAPI::get_instance();
}
/**
* Register OptinMonster Gutenberg blocks on the backend.
*
* @since 1.9.10
*/
public function register_blocks() {
$use_blocks_json = version_compare( $GLOBALS['wp_version'], '5.8', '>=' );
$block_type = plugin_dir_path( OMAPI_FILE ) . 'assets/js/';
$args = array(
'render_callback' => array( $this, 'get_output' ),
);
if ( ! $use_blocks_json ) {
$block_type = 'optinmonster/campaign-selector';
$args['attributes'] = array(
'slug' => array(
'type' => 'string',
),
'followrules' => array(
'type' => 'boolean',
),
);
}
register_block_type( $block_type, $args );
}
/**
* Load OptinMonster Gutenberg block scripts.
*
* @since 1.9.10
*/
public function enqueue_block_editor_assets() {
global $pagenow;
$version = $this->base->asset_version();
$css_handle = $this->base->plugin_slug . '-blocks-admin';
wp_enqueue_style( $css_handle, $this->base->url . 'assets/dist/css/blocks-admin.min.css', array(), $version );
if ( function_exists( 'wp_add_inline_style' ) ) {
$data = get_post_type()
? get_post_type_object( get_post_type() )
: array();
$css = $this->base->get_min_css_view_contents( 'disable-warning-css.php', (object) $data );
wp_add_inline_style( $css_handle, $css );
}
$campaign_selector_handle = $this->base->plugin_slug . '-gutenberg-campaign-selector';
wp_enqueue_script(
$campaign_selector_handle,
$this->base->url . 'assets/dist/js/campaign-selector.min.js',
array( 'wp-blocks', 'wp-i18n', 'wp-element' ),
$version,
true
);
OMAPI_Utils::add_inline_script( $campaign_selector_handle, 'OMAPI', $this->get_data_for_js() );
$is_widgets_page = 'widgets.php' === $pagenow;
// Prevent enqueueing sidebar settings on widgets screen...
if ( ! $is_widgets_page ) {
wp_enqueue_script(
$this->base->plugin_slug . '-gutenberg-sidebar-settings',
$this->base->url . 'assets/dist/js/om-settings.min.js',
array( $campaign_selector_handle, 'wp-plugins', 'wp-edit-post', 'wp-element' ),
$version
);
}
if ( version_compare( $GLOBALS['wp_version'], '5.3', '>=' ) ) {
wp_enqueue_script(
$this->base->plugin_slug . '-gutenberg-format-button',
$this->base->url . 'assets/dist/js/om-format.min.js',
array(
$campaign_selector_handle,
'wp-rich-text',
'wp-element',
$is_widgets_page && version_compare( $GLOBALS['wp_version'], '5.8.0', '>=' )
? 'wp-edit-widgets'
: 'wp-editor',
),
$version
);
}
}
/**
* Get OptinMonster data for Gutenberg JS.
*
* @since 2.2.0
*
* @param string $key The js data to get, by key.
*
* @return array Array of data for JS.
*/
public function get_data_for_js( $key = null ) {
if ( empty( $this->data_for_js ) ) {
// For translation of strings.
$i18n = array(
'title' => esc_html__( 'OptinMonster', 'optin-monster-api' ),
'description' => esc_html__( 'Select and display one of your OptinMonster inline campaigns.', 'optin-monster-api' ),
'campaign_select' => esc_html__( 'Select Campaign...', 'optin-monster-api' ),
'campaign_select_display' => esc_html__( 'Select and display your email marketing call-to-action campaigns from OptinMonster', 'optin-monster-api' ),
'create_new_popup' => esc_html__( 'Create New Popup Campaign', 'optin-monster-api' ),
'create_new_inline' => esc_html__( 'Create New Inline Campaign', 'optin-monster-api' ),
'block_settings' => esc_html__( 'OptinMonster Block Settings', 'optin-monster-api' ),
'settings' => esc_html__( 'OptinMonster Settings', 'optin-monster-api' ),
'campaign_selected' => esc_html__( 'Campaign', 'optin-monster-api' ),
'followrules_label' => esc_html__( 'Use Output Settings', 'optin-monster-api' ),
/* translators: %s - Output Settings (linked).*/
'followrules_help' => esc_html__( 'Ensure this campaign follows any conditions you\'ve selected in its %s', 'optin-monster-api' ),
'output_settings' => esc_html__( 'Output Settings', 'optin-monster-api' ),
'no_sites' => esc_html__( 'Please create a free account or connect an existing account to use an OptinMonster block.', 'optin-monster-api' ),
'no_sites_button_create_account' => esc_html__( 'Create a Free Account', 'optin-monster-api' ),
'no_sites_button_connect_account' => esc_html__( 'Connect an Existing Account', 'optin-monster-api' ),
'no_inline_campaigns' => esc_html__( 'You don’t have any inline campaigns yet!', 'optin-monster-api' ),
'no_campaigns_help' => esc_html__( 'Create an inline campaign to display in your posts and pages.', 'optin-monster-api' ),
'create_inline_campaign' => esc_html__( 'Create Your First Inline Campaign', 'optin-monster-api' ),
'create_popup_campaign' => esc_html__( 'Create Your First Popup', 'optin-monster-api' ),
'no_campaigns_button_help' => esc_html__( 'Learn how to create your first campaign', 'optin-monster-api' ),
'found_error' => esc_html__( 'An error was encountered', 'optin-monster-api' ),
'disable_all' => esc_html__( 'Disable all OptinMonster campaigns.', 'optin-monster-api' ),
'view_all' => esc_html__( 'View All Campaigns', 'optin-monster-api' ),
'not_connected' => esc_html__( 'You Have Not Connected with OptinMonster', 'optin-monster-api' ),
'no_campaigns_yet' => esc_html__( 'You don’t have any campaigns created yet.', 'optin-monster-api' ),
'update_selected_popup' => esc_html__( 'Update Selected OptinMonster Campaign', 'optin-monster-api' ),
'open_popup' => esc_html__( 'Open an OptinMonster Popup', 'optin-monster-api' ),
'remove_popup' => esc_html__( 'Remove Campaign Link', 'optin-monster-api' ),
'upgrade_monsterlink' => esc_html__( 'Unlock access to the OptinMonster click-to-load feature called MonsterLinks by upgrading your subscription.', 'optin-monster-api' ),
'upgrade' => esc_html__( 'Upgrade Now', 'optin-monster-api' ),
);
$i18n['description'] = html_entity_decode( $i18n['description'], ENT_COMPAT, 'UTF-8' );
$campaigns = $this->get_campaign_options();
$site_ids = $this->base->get_site_ids();
$post = get_post();
$this->data_for_js = array(
'logoUrl' => $this->base->url . 'assets/css/images/icons/archie-icon.svg',
'i18n' => $i18n,
'campaigns' => array(
'inline' => ! empty( $campaigns['inline'] ) ? $campaigns['inline'] : array(),
'other' => ! empty( $campaigns['other'] ) ? $campaigns['other'] : array(),
),
'site_ids' => ! empty( $site_ids ) ? $site_ids : array(),
'post' => $post,
'omEnv' => defined( 'OPTINMONSTER_ENV' ) ? OPTINMONSTER_ENV : '',
'canMonsterlink' => $this->base->has_rule_type( 'monster-link' ),
'templatesUri' => OMAPI_Urls::templates(),
'playbooksUri' => OMAPI_Urls::playbooks(),
'campaignsUri' => OMAPI_Urls::campaigns(),
'settingsUri' => OMAPI_Urls::settings(),
'wizardUri' => OMAPI_Urls::wizard(),
'upgradeUri' => OMAPI_Urls::upgrade( 'gutenberg', '--FEATURE--' ),
'apiUrl' => esc_url_raw( OPTINMONSTER_APIJS_URL ),
'omUserId' => $this->base->get_option( 'accountUserId' ),
'outputSettingsUrl' => OMAPI_Urls::campaign_output_settings( '%s' ),
'editUrl' => OMAPI_Urls::om_app(
'campaigns/--CAMPAIGN_SLUG--/edit/',
rawurlencode( OMAPI_Urls::campaign_output_settings( '--CAMPAIGN_SLUG--' ) )
),
'monsterlink' => esc_url_raw( OPTINMONSTER_SHAREABLE_LINK ) . '/c/',
'wpVersion' => $GLOBALS['wp_version'],
'customFieldsSupported' => post_type_supports( get_post_type( $post ), 'custom-fields' ),
);
}
if ( $key ) {
return isset( $this->data_for_js[ $key ] ) ? $this->data_for_js[ $key ] : null;
}
return $this->data_for_js;
}
/**
* Does the user have any associated OM sites registered?
*
* @since 2.2.0
*
* @return boolean
*/
public function has_sites() {
$site_ids = $this->base->get_site_ids();
return ! empty( $site_ids );
}
/**
* Get campaign options.
*
* @since 2.2.0
*
* @param boolean $titles_only Whether to include titles only, or separate data as array.
*
* @return array Array of campaign options.
*/
public function get_campaign_options( $titles_only = false ) {
if ( null === self::$campaigns_list ) {
$campaigns_list = array(
'inline' => array(),
'other' => array(),
);
if ( $this->has_sites() ) {
$campaigns = $this->base->get_campaigns();
if ( ! empty( $campaigns ) ) {
foreach ( $campaigns as $campaign ) {
$title = mb_strlen( $campaign->post_title, 'UTF-8' ) > 100
? mb_substr( $campaign->post_title, 0, 97, 'UTF-8' ) . '...'
: $campaign->post_title;
$title .= ' (' . $campaign->post_name . ')';
$type = 'inline' === $campaign->campaign_type ? 'inline' : 'other';
$campaigns_list[ $type ][ $campaign->post_name ] = array(
'title' => $title,
'pending' => empty( $campaign->enabled ),
);
}
}
}
self::$campaigns_list = $campaigns_list;
}
if ( $titles_only && ! empty( self::$campaigns_list ) ) {
$list = array();
foreach ( self::$campaigns_list as $type => $type_list ) {
foreach ( $type_list as $campaign_name => $args ) {
$list[ $type ][ $campaign_name ] = $args['title'] . ( $args['pending'] ? ' [Pending]' : '' );
}
}
return $list;
}
return self::$campaigns_list;
}
/**
* Get form HTML to display in a OptinMonster Gutenberg block.
*
* @param array $atts Attributes passed by OptinMonster Gutenberg block.
*
* @since 1.9.10
*
* @return string
*/
public function get_output( $atts ) {
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
$context = ! empty( $_REQUEST['context'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['context'] ) ) : '';
$is_rest = defined( 'REST_REQUEST' ) && REST_REQUEST;
$is_gutes = $is_rest && 'edit' === $context;
// Our Guten-block handles the embed output manually.
if ( $is_gutes ) {
return;
}
// Unslash and sanitize the shortcode attributes.
$atts = array_map( 'sanitize_text_field', wp_unslash( $atts ) );
// Gutenberg block shortcodes default to following the rules.
// See assets/js/campaign-selector.js, attributes.followrules.
if ( ! isset( $atts['followrules'] ) ) {
$atts['followrules'] = true;
}
$atts['followrules'] = wp_validate_boolean( $atts['followrules'] );
$output = $this->base->shortcode->shortcode( $atts );
if (
! empty( $output )
&& ! wp_script_is( $this->base->plugin_slug . '-api-script', 'enqueued' )
) {
// Need to enqueue the base api script.
$this->base->output->api_script();
}
// Just return the shortcode output to the frontend.
return $output;
}
}