Files
roi-theme/wp-content/plugins/advanced-ads/admin/includes/class-ad-network.php
root a22573bf0b Commit inicial - WordPress Análisis de Precios Unitarios
- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 21:04:30 -06:00

469 lines
12 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php // phpcs:ignore WordPress.Files.FileName
/**
* This class represents an ad network. It is used to manage the settings and the ad units of an ad network.
*
* @package AdvancedAds
* @author Advanced Ads <info@wpadvancedads.com>
* @since 1.x.x
*/
use AdvancedAds\Abstracts\Ad;
use AdvancedAds\Utilities\Conditional;
use AdvancedAds\Framework\Utilities\Params;
/**
* Class Advanced_Ads_Ad_Network
*/
abstract class Advanced_Ads_Ad_Network {
/**
* The identifier will be used for generated ids, names etc.
*
* @var string
*/
protected $identifier;
/**
* The name of the ad network
*
* @var string
*/
protected $name;
/**
* The name of the hook for the advanced ads settings page
*
* @var string
*/
protected $settings_page_hook;
/**
* The WordPress nonce (retrieve with the get_nonce method)
*
* @var string
*/
protected $nonce;
/**
* The networks settings section ID
*
* @var string
*/
protected $settings_section_id;
/**
* The networks settings init hook.
*
* @var string
*/
private $settings_init_hook;
/**
* Advanced_Ads_Ad_Network constructor.
*
* @param string $identifier an identifier that will be used for hooks, settings, ids and much more - MAKE SURE IT IS UNIQUE.
* @param string $name - the (translateable) display name for this ad network.
*/
public function __construct( $identifier, $name ) {
$this->identifier = $identifier;
$this->name = $name;
$this->settings_page_hook = ADVADS_SLUG . '-' . $this->identifier . '-settings-page';
$this->settings_section_id = ADVADS_SLUG . '-' . $this->identifier . '-settings-section';
$this->settings_init_hook = ADVADS_SLUG . '-' . $this->identifier . '-settings-init';
}
/**
* The identifier for this network
*
* @return string
*/
public function get_identifier() {
return $this->identifier;
}
/**
* The display name for this network
*
* @return string
*/
public function get_display_name() {
return $this->name;
}
/**
* The display value for the settings tab
*
* @return string
*/
public function get_settings_tab_name() {
return $this->get_display_name();
}
/**
* URL for the settings page (admin)
*
* @return string
*/
public function get_settings_href() {
return admin_url( 'admin.php?page=advanced-ads-settings#top#' . $this->identifier );
}
/**
* The identifier / name for the javascript file that will be injected.
*
* @return string
*/
public function get_js_library_name() {
return 'advanced-ads-network' . $this->identifier;
}
/**
* Registers this ad network
*/
public function register() {
if ( is_admin() ) {
if ( wp_doing_ajax() ) {
// we need add all the actions for our ajax calls here.
// our ajax method that will trigger an update of the ad units of this network.
add_action( 'wp_ajax_advanced_ads_get_ad_units_' . $this->identifier, [ $this, 'update_external_ad_units' ] );
add_action( 'wp_ajax_advanced_ads_toggle_idle_ads_' . $this->identifier, [ $this, 'toggle_idle_ads' ] );
} else {
// find out if we need to register the settings. this is necessary
// 1) when viewing the settings (admin.php with page="advanced-ads-settings")
// 2) when posting the settings to options.php
// in all other cases, there is nothing to do.
global $pagenow;
$requires_settings = false;
$requires_javascript = false;
if ( 'admin.php' === $pagenow ) {
$page = Params::request( 'page', null );
switch ( $page ) {
case 'advanced-ads-settings':
$requires_settings = true;
$requires_javascript = true;
break;
case 'advanced-ads':
$requires_javascript = true;
break;
default:
break;
}
} elseif ( 'options.php' === $pagenow ) {
$requires_settings = true;
} elseif ( 'post.php' === $pagenow || 'post-new.php' === $pagenow ) {
add_action( 'advanced-ads-ad-pre-save', [ $this, 'sanitize_ad_settings' ], 10, 2 );
if ( 'edit' === Params::get( 'action' ) ) {
$requires_javascript = true;
} elseif ( 'advanced_ads' === Params::request( 'post_type', '' ) ) {
$requires_javascript = true;
}
}
if ( $requires_settings ) {
// register the settings.
add_action( 'advanced-ads-settings-init', [ $this, 'register_settings_callback' ] );
add_filter( 'advanced-ads-setting-tabs', [ $this, 'register_settings_tabs_callback' ] );
}
if ( $requires_javascript ) {
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts_callback' ] );
}
}
}
}
/**
* This method will be called for the wp action "advanced-ads-settings-init" and therefore has to be public.
*/
public function register_settings_callback() {
// register new settings.
register_setting(
ADVADS_SLUG . '-' . $this->identifier,
ADVADS_SLUG . '-' . $this->identifier,
[ $this, 'sanitize_settings_callback' ]
);
/**
* Allow Ad Admin to save AdSense options.
*
* @param array $settings Array with allowed options.
*
* @return array
*/
add_filter(
'advanced-ads-ad-admin-options',
function ( $options ) {
$options[] = ADVADS_SLUG . '-' . $this->identifier;
return $options;
}
);
// add a new section.
add_settings_section(
$this->settings_section_id,
'',
'__return_empty_string',
$this->settings_page_hook
);
// register all the custom settings.
$this->register_settings( $this->settings_page_hook, $this->settings_section_id );
do_action( $this->settings_init_hook, $this->settings_page_hook );
}
/**
* Create name of the object used for localized data
*
* @return string
*/
protected function get_localized_script_object_name() {
return $this->identifier . 'AdvancedAdsJS';
}
/**
* Engueue scripts
*/
public function enqueue_scripts_callback() {
if ( ! Conditional::is_screen_advanced_ads() ) {
return;
}
$js_path = $this->get_javascript_base_path();
if ( $js_path ) {
$id = $this->get_js_library_name();
wp_enqueue_script( $id, $js_path, [ 'jquery' ], '1.7.3' ); // phpcs:ignore
// next we have to pass the data.
$data = [
'nonce' => $this->get_nonce(),
];
$data = $this->append_javascript_data( $data );
wp_localize_script( $id, $this->get_localized_script_object_name(), $data );
}
}
/**
* Get a nonce
*
* @return string
*/
public function get_nonce() {
if ( ! $this->nonce ) {
$this->nonce = wp_create_nonce( $this->get_nonce_action() );
}
return $this->nonce;
}
/**
* Returns the action (name) of the nonce for this network
* in some cases you may want to override this method to faciliate
* integration with existing code
*
* @return string
*/
public function get_nonce_action() {
return 'advads-network-' . $this->identifier;
}
/**
* This method will be called for the wp action "advanced-ads-settings-tabs" and therefore has to be public.
* it simply adds a tab for this ad type. if you don't want that just override this method with an empty one.
*
* @param array $tabs tabs on Advanced Ads settings page.
*
* @return array
*/
public function register_settings_tabs_callback( $tabs ) {
$tab_id = $this->identifier;
$tabs[ $tab_id ] = [
'page' => $this->settings_page_hook,
'group' => ADVADS_SLUG . '-' . $this->identifier,
'tabid' => $tab_id,
'title' => $this->get_settings_tab_name(),
];
return $tabs;
}
/**
* Callback to sanitize settings
*
* @param array $options options to be sanitized.
*
* @return mixed
*/
public function sanitize_settings_callback( $options ) {
$options = $this->sanitize_settings( $options );
return $options;
}
/**
* Performs basic security checks for wp ajax requests (nonce, capabilities)
* dies, when a problem was detected
*/
protected function ajax_security_checks() {
if ( ! Conditional::user_can( 'advanced_ads_manage_options' ) ) {
$this->send_ajax_error_response_and_die( __( 'You don\'t have the permission to manage ads.', 'advanced-ads' ) );
}
$nonce = Params::request( 'nonce', '' );
if ( ! wp_verify_nonce( $nonce, $this->get_nonce_action() ) ) {
$this->send_ajax_error_response_and_die( __( 'You sent an invalid request.', 'advanced-ads' ) );
}
}
/**
* Send data via AJAX but dont react on it.
*
* @param bool $json_serializable_response true if data can be serialized.
*/
protected function send_ajax_response_and_die( $json_serializable_response = false ) {
if ( ! $json_serializable_response ) {
$json_serializable_response = new stdClass();
}
header( 'Content-Type: application/json' );
echo wp_json_encode( $json_serializable_response );
die();
}
/**
* Send message via AJAX but dont react on it.
*
* @param string $message message string.
*/
protected function send_ajax_error_response_and_die( $message ) {
header( 'Content-Type: application/json' );
$r = new stdClass();
$r->error = $message;
echo wp_json_encode( $r );
die();
}
/**
* Toggle ad IDs
*/
public function toggle_idle_ads() {
$this->ajax_security_checks();
global $external_ad_unit_id;
$hide_idle_ads = Params::post( 'hide' );
$external_ad_unit_id = Params::post( 'ad_unit_id', '' );
if ( ! $external_ad_unit_id ) {
$external_ad_unit_id = '';
}
ob_start();
$this->print_external_ads_list( $hide_idle_ads );
$ad_selector = ob_get_clean();
$response = [
'status' => true,
'html' => $ad_selector,
];
$this->send_ajax_response_and_die( $response );
}
/**
* When you need some kind of manual ad setup (meaning you can edit the custom inputs of this ad type)
* you should override this method to return true. this results in an additional link (Setup code manually)
*
* @return bool
*/
public function supports_manual_ad_setup() {
return false;
}
/**
* Print a list of ads.
*
* @param bool $hide_idle_ads true to hide idle ids.
*
* @return mixed
*/
abstract public function print_external_ads_list( $hide_idle_ads = true );
/**
* This method will be called via wp AJAX.
* it has to retrieve the list of ads from the ad network and store it as an option
* does not return ad units - use "get_external_ad_units" if you're looking for an array of ad units
*/
abstract public function update_external_ad_units();
/**
* Adds the custom wp settings to the tab for this ad unit
*
* @param string $hook hook for the settings page.
* @param string $section_id settings section ID.
*/
abstract protected function register_settings( $hook, $section_id );
/**
* Sanitize the network specific options
*
* @param array $options the options to sanitize.
*
* @return mixed the sanitizzed options
*/
abstract protected function sanitize_settings( $options );
/**
* Sanitize the settings for this ad network
*
* @param Ad $ad Ad instance.
* @param array $post_data Post data array.
*
* @return void
*/
abstract public function sanitize_ad_settings( Ad $ad, $post_data );
/**
* Get external ad units from the given network.
*
* @return array of ad units (Advanced_Ads_Ad_Network_Ad_Unit)
*/
abstract public function get_external_ad_units();
/**
* Checks if the ad_unit is supported by Advanced Ads.
* this determines wheter it can be imported or not.
*
* @param object $ad_unit ad unit.
*
* @return boolean
*/
abstract public function is_supported( $ad_unit );
/**
* There is no common way to connect to an external account. you will have to implement it somehow, just
* like the whole setup process (usually done in the settings tab of this network). this method provides
* a way to return this account connection
*
* @return boolean true, when an account was successfully connected
*/
abstract public function is_account_connected();
/**
* External ad networks rely on the same javascript base code. however you still have to provide
* a javascript class that inherits from the AdvancedAdsAdNetwork js class
* this has to point to that file, or return false,
* if you don't have to include it in another way (NOT RECOMMENDED!)
*
* @return string path to the javascript file containing the javascriot class for this ad type
*/
abstract public function get_javascript_base_path();
/**
* Our script might need translations or other variables (llike a nonce, which is included automatically)
* add anything you need in this method and return the array
*
* @param array $data holding the data.
*
* @return array the data, that will be passed to the base javascript file containing the AdvancedAdsAdNetwork class
*/
abstract public function append_javascript_data( &$data );
}