/home/techb158/public_html/wp-content/plugins/optinmonster/OMAPI
NameSizeModeActions
EasyDigitalDownloads/-0755rm
Elementor/-0755rm
Integrations/-0755rm
MemberPress/-0755rm
Plugins/-0755rm
Promos/-0755rm
Rules/-0755rm
Shortcodes/-0755rm
WooCommerce/-0755rm
WPForms/-0755rm
Actions.php79700666editdlrm
Ajax.php14940666editdlrm
Api.php145070666editdlrm
ApiAuth.php24630666editdlrm
ApiKey.php52030666editdlrm
AssetLoader.php54890666editdlrm
BaseRestApi.php68890666editdlrm
Blocks.php131050666editdlrm
ClassicEditor.php70840666editdlrm
ConstantContact.php75910666editdlrm
Debug.php45920666editdlrm
EasyDigitalDownloads.php95530666editdlrm
Elementor.php54930666editdlrm
Inserter.php115710666editdlrm
InstallSkin.php13860666editdlrm
InstallSkinCompat.php13950666editdlrm
MailPoet.php139740666editdlrm
MemberPress.php42160666editdlrm
Menu.php173010666editdlrm
Notifications.php189100666editdlrm
OmuApi.php41220666editdlrm
Output.php258480666editdlrm
Pages.php180190666editdlrm
Partners.php55570666editdlrm
Plugins.php249230666editdlrm
Promos.php11310666editdlrm
Refresh.php65530666editdlrm
RestApi.php441900666editdlrm
RevenueAttribution.php30370666editdlrm
Review.php14820666editdlrm
Rules.php240000666editdlrm
Save.php119990666editdlrm
Shortcode.php36670666editdlrm
Sites.php85530666editdlrm
Support.php91920666editdlrm
Type.php37220666editdlrm
Urls.php89510666editdlrm
Utils.php75890666editdlrm
Validate.php92660666editdlrm
Welcome.php49290666editdlrm
Widget.php66620666editdlrm
WooCommerce.php200450666editdlrm
WpErrorException.php7140666editdlrm
WPForms.php26650666editdlrm
Edit: /home/techb158/public_html/wp-content/plugins/optinmonster/OMAPI/Output.php (25848B)
set(); add_filter( 'optinmonster_pre_campaign_should_output', array( $this, 'enqueue_helper_js_if_applicable' ), 999, 2 ); // If no credentials have been provided, do nothing. if ( ! $this->base->get_api_credentials() ) { return; } // Add the hook to allow OptinMonster to process. add_action( 'pre_get_posts', array( $this, 'load_optinmonster_inline' ), 9999 ); add_action( 'wp', array( $this, 'maybe_load_optinmonster' ), 9999 ); } /** * Sets our object instance and base class instance. * * @since 1.0.0 */ public function set() { self::$instance = $this; $this->base = OMAPI::get_instance(); $rules = new OMAPI_Rules(); if ( OMAPI_Debug::can_output_debug() ) { add_action( 'wp_footer', array( 'OMAPI_Debug', 'output_general' ), 99 ); } // Keep these around for back-compat. $this->fields = $rules->fields; // phpcs:disable WordPress.Security.NonceVerification.Recommended self::$live_preview = ! empty( $_GET['om-live-preview'] ) ? sanitize_text_field( wp_unslash( $_GET['om-live-preview'] ) ) : false; self::$live_rules_preview = ! empty( $_GET['om-live-rules-preview'] ) ? sanitize_text_field( wp_unslash( $_GET['om-live-rules-preview'] ) ) : false; self::$site_verification = ! empty( $_GET['om-verify-site'] ) ? sanitize_text_field( wp_unslash( $_GET['om-verify-site'] ) ) : false; // phpcs:enable } /** * Conditionally loads the OptinMonster optin based on the query filter detection. * * @since 1.0.0 */ public function maybe_load_optinmonster() { /** * Check if there are any campaigns for the site */ $optins = $this->base->get_optins(); if ( empty( $optins ) ) { return; } // Checking if AMP is enabled. if ( OMAPI_Utils::is_amp_enabled() ) { return; } // Load actions and filters. add_action( 'wp_enqueue_scripts', array( $this, 'api_script' ) ); add_action( 'wp_footer', array( $this, 'localize' ), 9999 ); add_action( 'wp_footer', array( $this, 'display_rules_data' ), 9999 ); add_action( 'wp_footer', array( $this, 'maybe_parse_shortcodes' ), 11 ); // Add the hook to allow OptinMonster to process. add_action( 'wp_footer', array( $this, 'load_optinmonster' ) ); if ( self::$live_preview || self::$live_rules_preview ) { add_filter( 'optin_monster_api_final_output', array( $this, 'load_previews' ), 10, 2 ); add_filter( 'optin_monster_api_empty_output', array( $this, 'load_previews' ), 10, 2 ); } if ( self::$live_preview || self::$site_verification ) { add_action( 'wp_footer', array( $this, 'load_global_optinmonster' ) ); } } /** * Enqueues the OptinMonster API script. * * @since 1.0.0 */ public function api_script() { // A hook to change the API location. Using this hook, we can force to load in header; default location is footer. $in_footer = apply_filters( 'optin_monster_api_loading_location', true ); wp_enqueue_script( $this->base->plugin_slug . '-api-script', OMAPI_Urls::om_api(), array(), $this->base->asset_version(), $in_footer ); add_filter( 'script_loader_tag', array( $this, 'filter_api_script' ), 10, 2 ); } /** * Filters the API script tag to output the JS version embed and to add a custom ID. * * @since 1.0.0 * * @param string $tag The HTML script output. * @param string $handle The script handle to target. * @return string $tag Amended HTML script with our ID attribute appended. */ public function filter_api_script( $tag, $handle ) { // If the handle is not ours, do nothing. if ( $this->base->plugin_slug . '-api-script' !== $handle ) { return $tag; } // Adjust the output to the JS version embed and to add our custom script ID. return self::om_script_tag( array( 'id' => 'omapi-script', ) ); } /** * Filters the API script tag to add a custom ID. * * @since 1.0.0 * @deprecated 2.17.0 Use `OMAPI_Output::filter_api_script()` instead. * * @param string $url The URL to filter. * @return string $url Amended URL with our ID attribute appended. */ public function filter_api_url( $url ) { _deprecated_function( __METHOD__, '{{next}}', 'OMAPI_Output::filter_api_script()' ); // If the handle is not ours, do nothing. if ( false === strpos( $url, str_replace( 'https://', '', OMAPI_Urls::om_api() ) ) ) { return $url; } // Adjust the URL to add our custom script ID. return "$url' async='async' id='omapi-script"; } /** * Loads an inline optin form (sidebar and after post) by checking against the current query. * * @since 1.0.0 * * @param object $query The current main WP query object. */ public function load_optinmonster_inline( $query ) { // If we are not on the main query or if in an rss feed, do nothing. if ( ! $query->is_main_query() || $query->is_feed() ) { return; } $priority = apply_filters( 'optin_monster_post_priority', 999 ); // Deprecated. $priority = apply_filters( 'optin_monster_api_post_priority', 999 ); add_filter( 'the_content', array( $this, 'load_optinmonster_inline_content' ), $priority ); } /** * Filters the content to output a campaign form. * * @since 1.0.0 * * @param string $content The current HTML string of main content. * @return string $content Amended content with possibly a campaign. */ public function load_optinmonster_inline_content( $content ) { global $post; // Checking if AMP is enabled. if ( OMAPI_Utils::is_amp_enabled() ) { return $content; } // If the global $post is not set or the post status is not published, return early. if ( empty( $post ) || ( isset( $post->ID ) && 'publish' !== get_post_status( $post->ID ) ) ) { return $content; } // Don't do anything for excerpts. // This prevents the optin accidentally being output when get_the_excerpt() or wp_trim_excerpt() is // called by a theme or plugin, and there is no excerpt, meaning they call the_content and break us. if ( doing_filter( 'get_the_excerpt' ) || doing_filter( 'wp_trim_excerpt' ) ) { return $content; } // Prepare variables. $post_id = self::current_id(); $optins = $this->base->get_optins(); // If no optins are found, return early. if ( empty( $optins ) ) { return $content; } // Loop through each optin and optionally output it on the site. foreach ( $optins as $optin ) { if ( OMAPI_Rules::check_inline( $optin, $post_id, true ) ) { $this->set_slug( $optin ); // Prepare the optin campaign. $prepared = $this->prepare_campaign( $optin ); $position = get_post_meta( $optin->ID, '_omapi_auto_location', true ); $inserter = new OMAPI_Inserter( $content, $prepared ); switch ( $position ) { case 'paragraphs': $paragraphs = get_post_meta( $optin->ID, '_omapi_auto_location_paragraphs', true ); $content = $inserter->after_paragraph( absint( $paragraphs ) ); break; case 'words': $words = get_post_meta( $optin->ID, '_omapi_auto_location_words', true ); $content = $inserter->after_words( absint( $words ) ); break; case 'above_post': $content = $inserter->prepend(); break; case 'below_post': default: $content = $inserter->append(); break; } } } // Return the content. return $content; } /** * Possibly loads a campaign on a page. * * @since 1.0.0 */ public function load_optinmonster() { /** * Check if there are any campaigns for the site */ $optins = $this->base->get_optins(); if ( empty( $optins ) ) { return; } $post_id = self::current_id(); $prevented = is_singular() && $post_id && get_post_meta( $post_id, 'om_disable_all_campaigns', true ); $prevented = apply_filters( 'optinmonster_prevent_all_campaigns', $prevented, $post_id ); if ( $prevented ) { add_action( 'wp_footer', array( $this, 'prevent_all_campaigns' ), 11 ); } $optins = $prevented ? array() : $optins; $campaigns = array(); if ( empty( $optins ) ) { // If no optins are found, send through filter to potentially add preview data. $campaigns = apply_filters( 'optin_monster_api_empty_output', $campaigns, $post_id ); } else { // Loop through each optin and optionally output it on the site. foreach ( $optins as $campaign ) { $rules = new OMAPI_Rules( $campaign, $post_id ); if ( $rules->should_output() ) { $this->set_slug( $campaign ); // Prepare the optin campaign. $campaigns[ $campaign->post_name ] = $this->prepare_campaign( $campaign ); continue; } $fields = $rules->field_values; // Allow devs to filter the final output for more granular control over optin targeting. // Devs should return the value for the slug key as false if the conditions are not met. $campaigns = apply_filters( 'optinmonster_output', $campaigns ); // Deprecated. $campaigns = apply_filters( 'optin_monster_output', $campaigns, $campaign, $fields, $post_id ); // Deprecated. $campaigns = apply_filters( 'optin_monster_api_output', $campaigns, $campaign, $fields, $post_id ); } // Run a final filter for all items. $campaigns = apply_filters( 'optin_monster_api_final_output', $campaigns, $post_id ); } // If the init code is empty, do nothing. if ( empty( $campaigns ) ) { return; } // Load the optins. foreach ( (array) $campaigns as $campaign ) { if ( $campaign ) { // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped, trusted data from post_content echo $campaign; } } $is_preview = apply_filters( 'optin_monster_should_set_campaigns_as_preview', is_preview() || is_customize_preview() ); if ( $is_preview ) { remove_action( 'wp_footer', array( $this, 'prevent_all_campaigns' ), 11 ); add_action( 'wp_footer', array( $this, 'set_campaigns_as_preview' ), 99 ); } } /** * Possibly loads a campaign preview on a page. * * @since 2.2.0 * * @param array $campaigns Array of campaign objects to output. * @param int $post_id The current post id. * * @return array Array of campaign objects to output. */ public function load_previews( $campaigns, $post_id ) { if ( self::$live_preview || self::$live_rules_preview ) { $campaign_id = sanitize_title_with_dashes( self::$live_preview ? self::$live_preview : self::$live_rules_preview ); $embed = self::om_script_tag( array( 'id' => 'omapi-script-preview-' . $campaign_id, 'campaignId' => $campaign_id, 'accountUserId' => $this->base->get_option( 'accountUserId' ), ) ); $embed = apply_filters( 'optin_monster_api_preview_output', $embed, $campaign_id, $post_id ); $this->set_preview_slug( $campaign_id ); $campaigns[ $campaign_id ] = $embed; } return $campaigns; } /** * Loads the global OM code on this page. * * @since 1.8.0 */ public function load_global_optinmonster() { $option = $this->base->get_option(); // If we don't have the data we need, return early. if ( empty( $option['accountUserId'] ) || empty( $option['accountId'] ) ) { return; } $option['id'] = 'omapi-script-global'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped, escaped function. echo self::om_script_tag( $option ); } /** * Sets the slug for possibly parsing shortcodes. * * @since 1.0.0 * * @param object $optin The optin object. */ public function set_slug( $optin ) { $slug = str_replace( '-', '_', $optin->post_name ); // Set the slug. $this->slugs[ $slug ] = array( 'slug' => $slug, 'mailpoet' => ! empty( $optin->ID ) && (bool) get_post_meta( $optin->ID, '_omapi_mailpoet', true ), ); // Maybe set shortcode. if ( ! empty( $optin->ID ) && get_post_meta( $optin->ID, '_omapi_shortcode', true ) ) { $this->shortcodes[] = get_post_meta( $optin->ID, '_omapi_shortcode_output', true ); } if ( ! empty( $this->slugs[ $slug ]['mailpoet'] ) ) { $this->wp_mailpoet(); } return $this; } /** * Sets the preview slug for possibly parsing shortcodes. * * @since 2.2.0 * * @param object $slug The campaign Id slug. */ public function set_preview_slug( $slug ) { $optin = $this->base->get_optin_by_slug( $slug ); if ( empty( $optin ) ) { $optin = (object) array( 'post_name' => $slug, 'ID' => 0, ); } $this->set_slug( $optin ); // Request the shortcodes from the campaign preview object. $user_id = $this->base->get_option( 'accountUserId' ); $route = "embed/{$user_id}/{$slug}/preview/shortcodes"; $body = OMAPI_Api::build( 'v2', $route, 'GET' )->request(); if ( ! empty( $body->{$slug} ) ) { $this->shortcodes[] = OMAPI_Save::get_shortcodes_string( $body->{$slug} ); } return $this; } /** * Maybe outputs the JS variables to parse shortcodes. * * @since 1.0.0 */ public function maybe_parse_shortcodes() { // If no slugs have been set, do nothing. if ( empty( $this->slugs ) ) { return; } // Loop through any shortcodes and output them. foreach ( $this->shortcodes as $shortcode_string ) { if ( empty( $shortcode_string ) ) { continue; } if ( strpos( $shortcode_string, '|||' ) !== false ) { $all_shortcode = explode( '|||', $shortcode_string ); } else { // Backwards compat. $all_shortcode = explode( ',', $shortcode_string ); } foreach ( $all_shortcode as $shortcode ) { if ( empty( $shortcode ) ) { continue; } $decoded = OMAPI_Save::decode_shortcode( $shortcode ); // Neutralize a stored `` so it can't close the raw-text // '; // ENT_COMPAT here is the wire format the external api.js consumer // expects, so it deliberately does not match the ENT_QUOTES decode // above. ENT_SUBSTITUTE keeps invalid UTF-8 from collapsing the whole // block to an empty string. // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo ''; } } // Output the JS variables to signify shortcode parsing is needed. ?> slugs ) ) { return; } // If already localized, do nothing. if ( $this->localized ) { return; } // Set flag to true. $this->localized = true; // Output JS variable. ?> base->is_mailpoet_active() ) { wp_enqueue_script( $this->base->plugin_slug . '-wp-mailpoet', $this->base->url . 'assets/js/mailpoet.js', array( 'jquery' ), $this->base->asset_version(), true ); } } /** * Enqueues the WP helper script for the API. * * @since 1.0.0 */ public function wp_helper() { wp_enqueue_script( $this->base->plugin_slug . '-wp-helper', $this->base->url . 'assets/dist/js/helper.min.js', array(), $this->base->asset_version(), true ); } /** * Outputs a JS variable, in the footer of the site, with information about * the current page, and the terms in use for the display rules. * * @since 1.6.5 * * @return void */ public function display_rules_data() { global $wp_query; /** * Check if there are any campaigns for the site */ $optins = $this->base->get_optins(); if ( empty( $optins ) ) { return; } // If already localized, do nothing. if ( $this->data_output ) { return; } // Set flag to true. $this->data_output = true; $tax_terms = array(); $object = get_queried_object(); $object_id = self::current_id(); $object_class = is_object( $object ) ? get_class( $object ) : ''; $object_type = ''; $object_key = ''; $post = null; if ( 'WP_Post' === $object_class ) { $post = $object; $object_type = 'post'; $object_key = $object->post_type; } elseif ( 'WP_Term' === $object_class ) { $object_type = 'term'; $object_key = $object->taxonomy; } // Get the current object's terms, if applicable. Defaults to public taxonomies only. if ( ( ! empty( $post->ID ) && is_singular() ) || $wp_query->is_category() || $wp_query->is_tag() || $wp_query->is_tax() ) { // Should we only check public taxonomies? $only_public = apply_filters( 'optinmonster_only_check_public_taxonomies', true, $post ); $taxonomies = get_object_taxonomies( $post, false ); if ( ! empty( $taxonomies ) && is_array( $taxonomies ) ) { foreach ( $taxonomies as $taxonomy ) { // Private ones should remain private and not output in the JSON blob. if ( $only_public && ! $taxonomy->public ) { continue; } $terms = get_the_terms( $post, $taxonomy->name ); if ( ! empty( $terms ) && is_array( $terms ) ) { $tax_terms = array_merge( $tax_terms, wp_list_pluck( $terms, 'term_id' ) ); } } $tax_terms = wp_parse_id_list( $tax_terms ); } } $output = array( 'object_id' => $object_id, 'object_key' => $object_key, 'object_type' => $object_type, 'term_ids' => $tax_terms, 'wp_json' => untrailingslashit( get_rest_url() ), 'wc_active' => OMAPI_WooCommerce::is_active(), 'edd_active' => OMAPI_EasyDigitalDownloads::is_active(), 'nonce' => wp_create_nonce( 'wp_rest' ), ); $output = apply_filters( 'optin_monster_display_rules_data_output', $output ); // Output JS variable. ?> base->validate_is_campaign_type( $optin ); // The API sends the campaign embed entity-encoded and OMAPI_Save stores it // that way, so this decode is what turns it back into real markup. // Without it the embed prints on the page as visible text and the // campaign never loads. Callers must only pass campaigns synced from the // API; write access to this post type is restricted in OMAPI_Type and // that restriction is what makes the decode here safe. $campaign_embed = ! empty( $optin->post_content ) ? trim( html_entity_decode( stripslashes( $optin->post_content ), ENT_QUOTES, 'UTF-8' ), '\'' ) : ''; return apply_filters( 'optin_monster_campaign_embed_output', $campaign_embed, $optin ); } /** * Enqueues the WP helper script if relevant optin fields are found. * * @since 1.5.0 * * @param bool $should_output Whether it should output. * @param OMAPI_Rules $rules OMAPI_Rules object. * * @return array */ public function enqueue_helper_js_if_applicable( $should_output, $rules ) { // Check to see if we need to load the WP API helper script. if ( $should_output ) { if ( ! $rules->field_empty( 'mailpoet' ) ) { $this->wp_mailpoet(); } $this->wp_helper(); } return $should_output; } /** * Get the current page/post's post id. * * @since 1.6.9 * * @return int */ public static function current_id() { $object = get_queried_object(); if ( is_object( $object ) && ! $object instanceof WP_Post ) { return 0; } $post_id = get_queried_object_id(); if ( ! $post_id ) { if ( 'page' === get_option( 'show_on_front' ) ) { $post_id = get_option( 'page_for_posts' ); } } return $post_id; } /** * AJAX callback for returning WooCommerce cart information. * * @since 1.7.0 * @since 2.8.0 All the logic was moved to OMAPI_WooCommerce class. * * @deprecated 2.8.0 Use `OMAPI_WooCommerce->get_cart()` instead. * * @return array An array of WooCommerce cart data. */ public function woocommerce_cart() { _deprecated_function( __FUNCTION__, '2.8.0', 'OMAPI_WooCommerce->get_cart()' ); return $this->base->woocommerce->get_cart(); } /** * Get the OptinMonster embed script JS. * * @since 1.9.8 * * @param array $args Array of arguments for the script, including * optional user id, account id, and script id. * * @return string The embed script JS. */ public static function om_script_tag( $args = array() ) { // Set up the script variables. $src = OMAPI_Urls::om_api(); $script_id = empty( $args['id'] ) ? '' : $args['id']; $account_id = empty( $args['accountId'] ) ? '' : $args['accountId']; $campaign_id = empty( $account_id ) && ! empty( $args['campaignId'] ) ? $args['campaignId'] : ''; $user_id = empty( $args['accountUserId'] ) ? '' : $args['accountUserId']; $api_cname = OMAPI::get_instance()->get_option( 'apiCname' ); $env = defined( 'OPTINMONSTER_ENV' ) ? OPTINMONSTER_ENV : ''; $tag = ''; $tag = sprintf( $tag, esc_url_raw( $src ), esc_attr( $script_id ), esc_attr( $account_id ), esc_attr( $campaign_id ), esc_attr( $user_id ), esc_attr( $api_cname ), esc_attr( $env ) ); return apply_filters( 'optin_monster_embed_script_tag', $tag, $args ); } }