File: /www/wwwroot/healthyton.com/wp-content/plugins/advanced-ads/classes/ad_ajax_callbacks.php
<?php
/**
* Advanced Ads.
*
* @package Advanced_Ads
* @author Thomas Maier <[email protected]>
* @license GPL-2.0+
* @link https://wpadvancedads.com
* @copyright 2013-2018 Thomas Maier, Advanced Ads GmbH
*/
use AdvancedAds\Utilities\WordPress;
/**
* This class is used to bundle all ajax callbacks
*
* @package Advanced_Ads_Ajax_Callbacks
* @author Thomas Maier <[email protected]>
*/
class Advanced_Ads_Ad_Ajax_Callbacks {
/**
* Advanced_Ads_Ad_Ajax_Callbacks constructor.
*/
public function __construct() {
// admin only!
add_action( 'wp_ajax_load_ad_parameters_metabox', [ $this, 'load_ad_parameters_metabox' ] );
add_action( 'wp_ajax_load_visitor_conditions_metabox', [ $this, 'load_visitor_condition' ] );
add_action( 'wp_ajax_load_display_conditions_metabox', [ $this, 'load_display_condition' ] );
add_action( 'wp_ajax_advads-terms-search', [ $this, 'search_terms' ] );
add_action( 'wp_ajax_advads-authors-search', [ $this, 'search_authors' ] );
add_action( 'wp_ajax_advads-close-notice', [ $this, 'close_notice' ] );
add_action( 'wp_ajax_advads-hide-notice', [ $this, 'hide_notice' ] );
add_action( 'wp_ajax_advads-subscribe-notice', [ $this, 'subscribe' ] );
add_action( 'wp_ajax_advads-activate-license', [ $this, 'activate_license' ] );
add_action( 'wp_ajax_advads-deactivate-license', [ $this, 'deactivate_license' ] );
add_action( 'wp_ajax_advads-adblock-rebuild-assets', [ $this, 'adblock_rebuild_assets' ] );
add_action( 'wp_ajax_advads-post-search', [ $this, 'post_search' ] );
add_action( 'wp_ajax_advads-ad-injection-content', [ $this, 'inject_placement' ] );
add_action( 'wp_ajax_advads-save-hide-wizard-state', [ $this, 'save_wizard_state' ] );
add_action( 'wp_ajax_advads-adsense-enable-pla', [ $this, 'adsense_enable_pla' ] );
add_action( 'wp_ajax_advads-ad-health-notice-display', [ $this, 'ad_health_notice_display' ] );
add_action( 'wp_ajax_advads-ad-health-notice-push-adminui', [ $this, 'ad_health_notice_push' ] );
add_action( 'wp_ajax_advads-ad-health-notice-hide', [ $this, 'ad_health_notice_hide' ] );
add_action( 'wp_ajax_advads-ad-health-notice-unignore', [ $this, 'ad_health_notice_unignore' ] );
add_action( 'wp_ajax_advads-ad-health-notice-solved', [ $this, 'ad_health_notice_solved' ] );
add_action( 'wp_ajax_advads-update-frontend-element', [ $this, 'update_frontend_element' ] );
add_action( 'wp_ajax_advads-get-block-hints', [ $this, 'get_block_hints' ] );
add_action( 'wp_ajax_advads-placements-allowed-ads', [ $this, 'get_allowed_ads_for_placement_type' ] );
}
/**
* Load content of the ad parameter metabox
*
* @since 1.0.0
*/
public function load_ad_parameters_metabox() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_edit_ads' ) ) {
return;
}
$types = Advanced_Ads::get_instance()->ad_types;
$type_string = $_REQUEST['ad_type'];
$ad_id = absint( $_REQUEST['ad_id'] );
if ( empty( $ad_id ) ) {
die();
}
$ad = \Advanced_Ads\Ad_Repository::get( $ad_id );
if ( ! empty( $types[ $type_string ] ) && method_exists( $types[ $type_string ], 'render_parameters' ) ) {
$type = $types[ $type_string ];
$type->render_parameters( $ad );
$types_without_size = [ 'dummy' ];
$types_without_size = apply_filters( 'advanced-ads-types-without-size', $types_without_size );
if ( ! in_array( $type_string, $types_without_size ) ) {
include ADVADS_ABSPATH . 'admin/views/ad-parameters-size.php';
}
// set the ad type attribute if empty
if ( ! isset( $ad->type ) ) {
$ad->type = $type_string;
}
// extend the AJAX-loaded parameters form by ad type
if ( isset( $types[ $type_string ] ) ) {
do_action( "advanced-ads-ad-params-after-{$type_string}", $ad, $types );
}
}
die();
}
/**
* Load interface for single visitor condition
*
* @since 1.5.4
*/
public function load_visitor_condition() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_edit_ads' ) ) {
return;
}
// get visitor condition types.
$visitor_conditions = Advanced_Ads_Visitor_Conditions::get_instance()->conditions;
$condition = [];
$condition['type'] = isset( $_POST['type'] ) ? $_POST['type'] : '';
$index = isset( $_POST['index'] ) ? $_POST['index'] : 0;
$form_name = isset( $_POST['form_name'] ) ? $_POST['form_name'] : Advanced_Ads_Visitor_Conditions::FORM_NAME;
if ( isset( $visitor_conditions[ $condition['type'] ] ) ) {
$metabox = $visitor_conditions[ $condition['type'] ]['metabox'];
} else {
die();
}
if ( method_exists( $metabox[0], $metabox[1] ) ) {
call_user_func( [ $metabox[0], $metabox[1] ], $condition, $index, $form_name );
}
die();
}
/**
* Load interface for single display condition
*
* @since 1.7
*/
public function load_display_condition() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_edit_ads' ) ) {
return;
}
// get display condition types.
$conditions = Advanced_Ads_Display_Conditions::get_instance()->conditions;
$condition = [];
$condition['type'] = isset( $_POST['type'] ) ? $_POST['type'] : '';
$index = isset( $_POST['index'] ) ? $_POST['index'] : 0;
$form_name = isset( $_POST['form_name'] ) ? $_POST['form_name'] : Advanced_Ads_Display_Conditions::FORM_NAME;
if ( isset( $conditions[ $condition['type'] ] ) ) {
$metabox = $conditions[ $condition['type'] ]['metabox'];
} else {
die();
}
if ( method_exists( $metabox[0], $metabox[1] ) ) {
call_user_func( [ $metabox[0], $metabox[1] ], $condition, $index, $form_name );
}
die();
}
/**
* Search terms belonging to a specific taxonomy
*
* @since 1.4.7
*/
public function search_terms() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_edit_ads' ) ) {
return;
}
$args = [];
$taxonomy = $_POST['tax'];
$args = [
'hide_empty' => false,
'number' => 20,
];
if ( ! isset( $_POST['search'] ) || '' === $_POST['search'] ) {
die();
}
// if search is an id, search for the term id, else do a full text search.
if ( 0 !== absint( $_POST['search'] ) && strlen( $_POST['search'] ) === strlen( absint( $_POST['search'] ) ) ) {
$args['include'] = [ absint( $_POST['search'] ) ];
} else {
$args['search'] = $_POST['search'];
}
$results = get_terms( $taxonomy, $args );
echo wp_json_encode( $results );
echo "\n";
die();
}
/**
* Search authors
*
* @since 1.47.5
*/
public function search_authors() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_edit_ads' ) ) {
return;
}
$args = [];
$args['search_columns'] = [ 'ID', 'user_login', 'user_nicename', 'display_name' ];
if ( version_compare( get_bloginfo( 'version' ), '5.9' ) > -1 ) {
$args['capability'] = [ 'edit_posts' ];
} else {
$args['who'] = 'authors';
}
if ( ! isset( $_POST['search'] ) || '' === $_POST['search'] ) {
die();
}
$args['search'] = '*' . sanitize_text_field( wp_unslash( $_POST['search'] ) ) . '*';
$results = get_users( $args );
echo wp_json_encode( $results );
die();
}
/**
* Close a notice for good
*
* @since 1.5.3
*/
public function close_notice() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if (
! WordPress::user_can( 'advanced_ads_manage_options' )
|| empty( $_REQUEST['notice'] )
) {
die();
}
Advanced_Ads_Admin_Notices::get_instance()->remove_from_queue( $_REQUEST['notice'] );
if ( isset( $_REQUEST['redirect'] ) ) {
wp_safe_redirect( $_REQUEST['redirect'] );
exit();
}
die();
}
/**
* Hide a notice for some time (7 days right now)
*
* @since 1.8.17
*/
public function hide_notice() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_manage_options' )
|| empty( $_POST['notice'] )
) {
die();
}
Advanced_Ads_Admin_Notices::get_instance()->hide_notice( $_POST['notice'] );
die();
}
/**
* Subscribe to newsletter
*
* @since 1.5.3
*/
public function subscribe() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_see_interface' ) || empty( $_POST['notice'] )
) {
wp_send_json_error(
[
// translators: %s is a URL.
'message' => sprintf( __( 'An error occurred. Please use <a href="%s" target="_blank">this form</a> to sign up.', 'advanced-ads' ), 'http://eepurl.com/bk4z4P' ),
],
400
);
}
wp_send_json_success( [ 'message' => Advanced_Ads_Admin_Notices::get_instance()->subscribe( $_POST['notice'] ) ] );
}
/**
* Activate license of an add-on
*
* @since 1.5.7
*/
public function activate_license() {
if ( ! WordPress::user_can( 'advanced_ads_manage_options' ) ) {
return;
}
// check nonce.
check_ajax_referer( 'advads_ajax_license_nonce', 'security' );
if ( ! isset( $_POST['addon'] ) || '' === $_POST['addon'] ) {
die(); }
// phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
echo Advanced_Ads_Admin_Licenses::get_instance()->activate_license( $_POST['addon'], $_POST['pluginname'], $_POST['optionslug'], $_POST['license'] );
// phpcs:enable
die();
}
/**
* Deactivate license of an add-on
*
* @since 1.6.11
*/
public function deactivate_license() {
if ( ! WordPress::user_can( 'advanced_ads_manage_options' ) ) {
return;
}
// check nonce.
check_ajax_referer( 'advads_ajax_license_nonce', 'security' );
if ( ! isset( $_POST['addon'] ) || '' === $_POST['addon'] ) {
die(); }
// phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
echo Advanced_Ads_Admin_Licenses::get_instance()->deactivate_license( $_POST['addon'], $_POST['pluginname'], $_POST['optionslug'] );
// phpcs:enable
die();
}
/**
* Rebuild assets for ad-blocker module
*/
public function adblock_rebuild_assets() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_manage_options' ) ) {
return;
}
Advanced_Ads_Ad_Blocker_Admin::get_instance()->add_asset_rebuild_form();
die();
}
/**
* Post search (used in Display conditions)
*/
public function post_search() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_edit_ads' ) ) {
return;
}
add_filter( 'wp_link_query_args', [ 'Advanced_Ads_Display_Conditions', 'modify_post_search' ] );
add_filter( 'posts_search', [ 'Advanced_Ads_Display_Conditions', 'modify_post_search_sql' ] );
wp_ajax_wp_link_ajax();
}
/**
* Inject an ad and a placement
*
* @since 1.7.3
*/
public function inject_placement() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_edit_ads' ) ) {
die();
}
$ad_id = absint( $_REQUEST['ad_id'] );
if ( empty( $ad_id ) ) {
die(); }
// use existing placement.
if ( isset( $_REQUEST['placement_slug'] ) ) {
$xml_array[] = '<placements type="array">';
$xml_array[] = '<item key="0" type="array">';
$xml_array[] = '<item type="string">ad_' . $ad_id . '</item>';
$xml_array[] = '<key type="string">' . $_REQUEST['placement_slug'] . '</key>';
$xml_array[] = '<use_existing type="boolean">1</use_existing>';
$xml_array[] = '</item>';
$xml_array[] = '</placements>';
$xml = '<advads-export>' . implode( '', $xml_array ) . '</advads-export>';
Advanced_Ads_Import::get_instance()->import( $xml );
if ( count( Advanced_Ads_Import::get_instance()->imported_data['placements'] ) ) {
// if the ad was assigned.
echo esc_attr( $_REQUEST['placement_slug'] );
};
die();
}
// create new placement.
$placements = Advanced_Ads::get_instance()->get_model()->get_ad_placements_array();
$type = esc_attr( $_REQUEST['placement_type'] );
$item = 'ad_' . $ad_id;
$options = [];
// check type.
$placement_types = Advanced_Ads_Placements::get_placement_types();
if ( ! isset( $placement_types[ $type ] ) ) {
die();
}
$title = $placement_types[ $type ]['title'];
$new_placement = [
'type' => $type,
'item' => $item,
'name' => $title,
];
// set content specific options.
if ( 'post_content' === $type ) {
$index = isset( $_REQUEST['options']['index'] ) ? absint( $_REQUEST['options']['index'] ) : 1;
$new_placement['options'] = [
'position' => 'after',
'index' => $index,
'tag' => 'p',
];
}
$slug = Advanced_Ads_Placements::save_new_placement( $new_placement );
// return potential slug.
echo esc_attr( $slug );
die();
}
/**
* Save ad wizard state for each user individually
*
* @since 1.7.4
*/
public function save_wizard_state() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_edit_ads' ) ) {
return;
}
$state = ( isset( $_REQUEST['hide_wizard'] ) && 'true' === $_REQUEST['hide_wizard'] ) ? 'true' : 'false';
// get current user.
$user_id = get_current_user_id();
if ( ! $user_id ) {
die();
}
update_user_meta( $user_id, 'advanced-ads-hide-wizard', $state );
die();
}
/**
* Enable Adsense Auto ads, previously "Page-Level ads"
*/
public function adsense_enable_pla() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_manage_options' ) ) {
return;
}
$options = get_option( GADSENSE_OPT_NAME, [] );
$options['page-level-enabled'] = true;
update_option( GADSENSE_OPT_NAME, $options );
die();
}
/**
* Display list of Ad Health notices
*/
public function ad_health_notice_display() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_manage_options' ) ) {
return;
}
Advanced_Ads_Ad_Health_Notices::get_instance()->render_widget();
die();
}
/**
* Push an Ad Health notice to the queue
*/
public function ad_health_notice_push() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_manage_options' ) ) {
return;
}
$key = ( ! empty( $_REQUEST['key'] ) ) ? esc_attr( $_REQUEST['key'] ) : false;
$attr = ( ! empty( $_REQUEST['attr'] ) && is_array( $_REQUEST['attr'] ) ) ? $_REQUEST['attr'] : [];
// update or new entry?
if ( isset( $attr['mode'] ) && 'update' === $attr['mode'] ) {
Advanced_Ads_Ad_Health_Notices::get_instance()->update( $key, $attr );
} else {
Advanced_Ads_Ad_Health_Notices::get_instance()->add( $key, $attr );
}
die();
}
/**
* Hide Ad Health notice
*/
public function ad_health_notice_hide() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_manage_options' ) ) {
return;
}
$notice_key = ( ! empty( $_REQUEST['notice'] ) ) ? esc_attr( $_REQUEST['notice'] ) : false;
Advanced_Ads_Ad_Health_Notices::get_instance()->hide( $notice_key );
die();
}
/**
* Show all ignored notices of a given type
*/
public function ad_health_notice_unignore() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_manage_options' ) ) {
return;
}
Advanced_Ads_Ad_Health_Notices::get_instance()->unignore();
die();
}
/**
* After the user has selected a new frontend element, update the corresponding placement.
*/
public function update_frontend_element() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if ( ! WordPress::user_can( 'advanced_ads_manage_placements' ) ) {
return;
}
if ( isset( $_POST['advads']['placements'] ) ) {
Advanced_Ads_Placements::save_placements( $_POST['advads']['placements'] );
}
exit();
}
/**
* Get hints related to the Gutenberg block.
*/
public function get_block_hints() {
check_ajax_referer( 'advanced-ads-admin-ajax-nonce', 'nonce' );
if (
! isset( $_POST['itemID'] )
|| ! WordPress::user_can( 'advanced_ads_edit_ads' )
) {
die;
}
$item = explode( '_', $_POST['itemID'] );
if ( ! isset( $item[0] ) || $item[0] !== 'group' ) {
die;
}
$hints = Advanced_Ads_Group::get_hints( new Advanced_Ads_Group( (int) $item[1] ) );
wp_send_json_success( $hints );
}
/**
* Get allowed ads per placement.
*
* @return void
*/
public function get_allowed_ads_for_placement_type() {
check_ajax_referer( sanitize_text_field( $_POST['action'] ) );
wp_send_json_success( [
'items' => array_filter(
Advanced_Ads_Placements::get_items_for_placement( sanitize_text_field( $_POST['placement_type'] ) ),
static function( $items_group ) {
return ! empty( $items_group['items'] );
}
),
] );
}
}