Files
roi-theme/wp-content/plugins/advanced-ads/modules/gadsense/includes/class-network-adsense.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

574 lines
18 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:ignoreFile
use AdvancedAds\Abstracts\Ad;
use AdvancedAds\Utilities\WordPress;
use AdvancedAds\Utilities\Conditional;
use AdvancedAds\Compatibility\Compatibility;
/**
* Class Advanced_Ads_Network_Adsense
*/
class Advanced_Ads_Network_Adsense extends Advanced_Ads_Ad_Network {
/**
* An array containing all the AdSense status codes that flag an {$link Advanced_Ads_Ad_Network_Ad_Unit} ad unit as active
* for downward compatibility with PHP < 5.6 the const had to be changed to static field. you can revert to const when PHP5 support is FINALLY dropped
*
* @var array
*/
private static $status_codes_active = [ 'ACTIVE', 'NEW' ];
/**
* A globally usable instance, that will be created when calling {$link Advanced_Ads_Ad_Network#get_instance) for the first time
*
* @var Advanced_Ads_Ad_Type_Adsense
*/
private static $instance;
/**
* AdSense options handling class.
*
* @var Advanced_Ads_AdSense_Data
*/
private $data;
/**
* The AdSense networks settings section ID
*
* @var string
*/
protected $settings_section_id;
/**
* Instance of Advanced_Ads_Network_Adsense
*
* @return Advanced_Ads_Ad_Type_Adsense|Advanced_Ads_Network_Adsense
*/
final public static function get_instance() {
if ( ! self::$instance ) {
self::$instance = new Advanced_Ads_Network_Adsense();
}
return self::$instance;
}
/**
* Advanced_Ads_Network_Adsense constructor.
*/
public function __construct() {
parent::__construct( 'adsense', 'AdSense' );
$this->data = Advanced_Ads_AdSense_Data::get_instance();
// Adsense does not use the default generated settings section id. overwrite it with the old value.
$this->settings_section_id = 'advanced_ads_adsense_setting_section';
add_action( 'advanced_ads_settings_before_form', [ $this, 'render_before_form' ], 10, 2 );
}
/**
* Render before form.
*
* @param string $tab_id the ID of the current tab.
* @param array $tab the current tab.
*/
public function render_before_form( $tab_id, $tab ) {
if ( 'adsense' === $tab_id && ! empty( $this->data->get_adsense_id() ) ) {
$_notice = 'adsense_subscribe';
if ( Advanced_Ads_Admin_Notices::get_instance()->can_display( $_notice ) && Conditional::user_can_subscribe( 'nl_first_steps' ) ) {
$text = sprintf(
/* translators: %s: number of add-ons. */
__( 'Subscribe to our free email course for Google AdSense, receive our newsletter for periodic tutorials, and get %s for Advanced Ads.', 'advanced-ads' ),
'<strong>' . __( '2 free add-ons', 'advanced-ads' ) . '</strong>'
);
include ADVADS_ABSPATH . '/admin/views/notices/inline.php';
}
}
}
/**
* Register settings to Advanced Ads > Settings > AdSense
*
* @param string $hook settings page hook.
* @param string $section_id settings section id.
*/
protected function register_settings( $hook, $section_id ) {
// Add setting field to disable ads.
add_settings_field(
'adsense-id',
__( 'AdSense account', 'advanced-ads' ),
[ $this, 'render_settings_adsense_id' ],
$hook,
$section_id
);
// Activate AdSense verification code and Auto ads (previously Page-Level ads).
add_settings_field(
'adsense-page-level',
__( 'Auto ads', 'advanced-ads' ),
[ $this, 'render_settings_adsense_page_level' ],
$hook,
$section_id
);
// AdSense anchor ad on top of pages.
// Only show this field if selected, otherwise use new auto ads code.
if ( isset( $this->data->get_options()['top-anchor-ad'] ) ) {
add_settings_field(
'top_anchor_ad',
__( 'Auto ads', 'advanced-ads' ) . ':&nbsp;' . __( 'Disable top anchor ad', 'advanced-ads' ),
[ $this, 'render_settings_adsense_top_anchor_ad' ],
$hook,
$section_id
);
}
// Hide AdSense stats in the backend.
add_settings_field(
'hide_stats',
__( 'Disable stats', 'advanced-ads' ),
[ $this, 'render_settings_adsense_hide_stats' ],
$hook,
$section_id
);
// Disable AdSense violation warnings.
add_settings_field(
'adsense-warnings-disable',
__( 'Disable violation warnings', 'advanced-ads' ),
[ $this, 'render_settings_adsense_warnings_disable' ],
$hook,
$section_id
);
// Show AdSense widget on WP Dashboard.
add_settings_field(
'adsense_wp_dashboard',
__( 'Show AdSense Earnings', 'advanced-ads' ),
[ $this, 'render_settings_adsense_wp_dashboard' ],
$hook,
$section_id
);
add_settings_field(
'adsense-background',
__( 'Transparent background', 'advanced-ads' ),
[ $this, 'render_settings_adsense_background' ],
$hook,
$section_id
);
add_settings_field(
'adsense-full-width',
__( 'Full width responsive ads on mobile', 'advanced-ads' ),
[ $this, 'render_settings_adsense_fullwidth' ],
$hook,
'advanced_ads_adsense_setting_section'
);
}
/**
* Render AdSense settings section
*/
public function render_settings_section_callback() {
// For whatever purpose there might come.
}
/**
* Render AdSense management api setting
*/
public function render_settings_management_api() {
require_once GADSENSE_BASE_PATH . 'admin/views/mapi-settings.php';
}
/**
* Render AdSense id setting
*/
public function render_settings_adsense_id() {
require_once GADSENSE_BASE_PATH . 'admin/views/adsense-account.php';
}
/**
* Render top anchor ad setting
*/
public function render_settings_adsense_top_anchor_ad() {
$options = $this->data->get_options();
$anchor_ad = isset( $options['top-anchor-ad'] ) ? $options['top-anchor-ad'] : '';
?>
<label>
<input type="checkbox" name="<?php echo esc_attr( GADSENSE_OPT_NAME ); ?>[top-anchor-ad]" value="1" <?php checked( $anchor_ad ); ?> />
<?php esc_html_e( 'Enable this box if you dont want Google Auto ads to place anchor ads at the top of your page.', 'advanced-ads' ); ?>
<?php WordPress::show_deprecated_notice('top Anchor Ad'); ?>
</label>
<?php
}
/**
* Render setting to hide AdSense stats showing in the backend
*/
public function render_settings_adsense_hide_stats() {
$options = $this->data->get_options();
$hide_stats = isset( $options['hide-stats'] );
?>
<label>
<input type="checkbox" name="<?php echo esc_attr( GADSENSE_OPT_NAME ); ?>[hide-stats]" value="1" <?php checked( $hide_stats ); ?> />
<?php esc_html_e( 'Enable this option to stop loading stats from AdSense into your WordPress backend.', 'advanced-ads' ); ?>
</label>
<?php
}
/**
* Render setting to hide AdSense stats showing in the backend
*/
public function render_settings_adsense_wp_dashboard() {
$options = $this->data->get_options();
$show_widget = isset( $options['adsense-wp-widget'] );
?>
<label>
<input type="checkbox" name="<?php echo esc_attr( GADSENSE_OPT_NAME ); ?>[adsense-wp-widget]" value="1" <?php checked( $show_widget ); ?> />
<?php esc_html_e( 'Show Earnings widget on the WordPress dashboard.', 'advanced-ads' ); ?>
</label>
<?php
}
/**
* Render page-level ads setting
*
* @since 1.6.9
*/
public function render_settings_adsense_page_level() {
$options = $this->data->get_options();
$page_level = $options['page-level-enabled'];
?>
<label><input type="checkbox" name="<?php echo esc_attr( GADSENSE_OPT_NAME ); ?>[page-level-enabled]" value="1" <?php checked( $page_level ); ?> />
<?php esc_attr_e( 'Insert the AdSense header code to enable Auto ads and verify your website.', 'advanced-ads' ); ?>
</label>
<ul>
<li><a href="https://wpadvancedads.com/adsense-auto-ads-wordpress/?utm_source=advanced-ads&utm_medium=link&utm_campaign=settings-adsense-specific-pages#Display_AdSense_Auto_Ads_only_on_specific_pages" target="_blank"><?php esc_attr_e( 'Display Auto ads only on specific pages', 'advanced-ads' ); ?></a></li>
<li><a href="https://wpadvancedads.com/adsense-in-random-positions-auto-ads/?utm_source=advanced-ads&utm_medium=link&utm_campaign=backend-autoads-ads" target="_blank"><?php esc_attr_e( 'Why are ads appearing in random positions?', 'advanced-ads' ); ?></a></li>
<?php
if ( ! empty( $options['adsense-id'] ) ) :
?>
<li><a href="https://www.google.com/adsense/new/u/0/<?php echo esc_attr( $options['adsense-id'] ); ?>/myads/auto-ads" target="_blank">
<?php
/* translators: this is the text for a link to a sub-page in an AdSense account */
esc_attr_e( 'Adjust Auto ads options', 'advanced-ads' );
?>
</a></li>
<?php
endif;
?>
</ul>
<?php if ( Compatibility::borlabs_cookie_adsense_auto_ads_code_exists() ) : ?>
<p class="advads-notice-inline advads-error">
<?php require GADSENSE_BASE_PATH . 'admin/views/borlabs-cookie-auto-ads-warning.php'; ?>
</p>
<?php endif; ?>
<?php
self::render_settings_adsense_amp();
do_action( 'advanced-ads-settings-adsense-below-auto-ads-option' );
}
/**
* Render Adsense AMP setting fields.
*/
public function render_settings_adsense_amp() {
// AMP Auto ads was removed from Responsive add-on version 1.10.0
if ( defined( 'AAR_VERSION' ) && 1 === version_compare( '1.10.0', AAR_VERSION ) ) {
return;
}
$adsense_options = Advanced_Ads_AdSense_Data::get_instance()->get_options();
$auto_ads_enabled = ! empty( $adsense_options['amp']['auto_ads_enabled'] );
$option_name = GADSENSE_OPT_NAME . '[amp]';
include GADSENSE_BASE_PATH . 'admin/views/settings/amp-auto-ads.php';
}
/**
* Render AdSense violation warnings setting
*
* @since 1.6.9
*/
public function render_settings_adsense_warnings_disable() {
$options = $this->data->get_options();
$disable_violation_warnings = isset( $options['violation-warnings-disable'] ) ? 1 : 0;
?>
<label><input type="checkbox" name="<?php echo esc_attr( GADSENSE_OPT_NAME ); ?>[violation-warnings-disable]" value="1" <?php checked( 1, $disable_violation_warnings ); ?> />
<?php esc_html_e( 'Disable warnings about potential violations of the AdSense terms.', 'advanced-ads' ); ?></label>
<p class="description">
<?php
printf(
wp_kses(
/* translators: %s is a URL. */
__( 'Our <a href="%s" target="_blank">Ad Health</a> feature monitors if AdSense is implemented correctly on your site. It also considers ads not managed with Advanced Ads. Enable this option to remove these checks', 'advanced-ads' ),
[
'a' => [
'href' => true,
'target' => true,
],
]
),
'https://wpadvancedads.com/manual/ad-health/?utm_source=advanced-ads&utm_medium=link&utm_campaign=backend-autoads-ads'
);
?>
</p>
<?php
}
/**
* Render transparent background setting.
*/
public function render_settings_adsense_background() {
$options = $this->data->get_options();
$background = $options['background'];
?>
<label>
<input type="checkbox" name="<?php echo esc_attr( GADSENSE_OPT_NAME ); ?>[background]" value="1" <?php checked( $background ); ?> />
<?php esc_html_e( 'Enable this option in case your theme adds an unfortunate background color to AdSense ads.', 'advanced-ads' ); ?>
</label>
<?php
}
/**
* Render full width ads setting.
*/
public function render_settings_adsense_fullwidth() {
$options = $this->data->get_options();
$fw = ! empty( $options['fullwidth-ads'] ) ? $options['fullwidth-ads'] : 'default';
?>
<select name="<?php echo esc_attr( GADSENSE_OPT_NAME ); ?>[fullwidth-ads]">
<option value="default" <?php selected( $fw, 'default' ); ?>><?php esc_html_e( 'default', 'advanced-ads' ); ?></option>
<option value="enable" <?php selected( $fw, 'enable' ); ?>><?php esc_html_e( 'enable', 'advanced-ads' ); ?></option>
<option value="disable" <?php selected( $fw, 'disable' ); ?>><?php esc_html_e( 'disable', 'advanced-ads' ); ?></option>
</select>
<p class="description">
<?php
echo wp_kses(
sprintf(
/* translators: %s is a URL. */
__( "Whether your responsive ad unit may expand to <a href='%s' target='blank'>use the full width</a> of your visitor's mobile device screen", 'advanced-ads' ),
esc_url( 'https://support.google.com/adsense/answer/7445870' )
),
[
'a' => [
'href' => true,
'target' => true,
],
]
);
?>
</p>
<?php
}
/**
* Sanitize AdSense settings
*
* @param array $options all the options.
*/
protected function sanitize_settings( $options ) {
// Sanitize whatever option one wants to sanitize.
if ( isset( $options['adsense-id'] ) && '' !== $options['adsense-id'] ) {
// Remove "ca-" prefix if it was added by the user.
if ( 0 === strpos( $options['adsense-id'], 'ca-' ) ) {
$options['adsense-id'] = str_replace( 'ca-', '', $options['adsense-id'] );
}
// Trim publisher id.
$options['adsense-id'] = trim( $options['adsense-id'] );
}
return $options;
}
/**
* Save publisher id from new ad unit if not given in main options
*
* @param Ad $ad Ad instance.
* @param array $post_data Post data array.
*
* @return void
*/
public function sanitize_ad_settings( Ad $ad, $post_data ): void {
if ( ! $ad->is_type( 'adsense' ) ) {
return;
}
// Save AdSense publisher ID if there is no one stored yet.
if ( ! empty( $post_data['adsense-pub-id'] ) ) {
$adsense_options = get_option( 'advanced-ads-adsense', [] );
if ( empty( $adsense_options['adsense-id'] ) ) {
$adsense_options['adsense-id'] = $post_data['adsense-pub-id'];
update_option( 'advanced-ads-adsense', $adsense_options );
}
}
$ad->unset_prop( 'adsense-pub-id' );
}
/**
* Return ad units loaded through the API.
*
* @return array
*/
public function get_external_ad_units() {
$db = Advanced_Ads_AdSense_Data::get_instance();
$adsense_id = trim( $db->get_adsense_id() );
$units = [];
$mapi_options = Advanced_Ads_AdSense_MAPI::get_option();
if (
isset( $mapi_options['ad_codes'] )
&& isset( $mapi_options['accounts'] )
&& isset( $mapi_options['accounts'][ $adsense_id ] )
&& isset( $mapi_options['accounts'][ $adsense_id ]['ad_units'] )
) {
$ad_codes = $mapi_options['ad_codes'];
foreach ( $mapi_options['accounts'][ $adsense_id ]['ad_units'] as $id => $raw ) {
$ad_unit = new Advanced_Ads_Ad_Network_Ad_Unit( $raw );
$ad_unit->id = $id;
$ad_unit->slot_id = isset( $raw['code'] ) ? $raw['code'] : '-';
$ad_unit->name = isset( $raw['name'] ) ? $raw['name'] : '-';
// phpcs:ignore
$ad_unit->active = isset( $raw['status'] ) && in_array( $raw['status'], self::$status_codes_active );
if ( isset( $ad_codes[ $id ] ) ) {
$ad_unit->code = $ad_codes[ $id ];
}
if ( isset( $raw['contentAdsSettings'] ) ) {
if ( isset( $raw['contentAdsSettings']['type'] ) ) {
$ad_unit->display_type = $raw['contentAdsSettings']['type'];
$ad_unit->display_type = Advanced_Ads_AdSense_MAPI::format_ad_data( $ad_unit, 'type' );
}
if ( isset( $raw['contentAdsSettings']['size'] ) ) {
$ad_unit->display_size = $raw['contentAdsSettings']['size'];
$ad_unit->display_size = Advanced_Ads_AdSense_MAPI::format_ad_data( $ad_unit, 'size' );
}
}
$units[] = $ad_unit;
}
}
return $units;
}
/**
* Render the list of ads loaded through the API.
*
* @param bool $hide_idle_ads true to hide inactive ads.
* @param null $ad_unit_id ID of the ad unit.
*
* @return mixed|void
*/
public function print_external_ads_list( $hide_idle_ads = true, $ad_unit_id = null ) {
Advanced_Ads_AdSense_Admin::get_mapi_ad_selector( $hide_idle_ads );
}
/**
* Whether the loaded AdSense ad is supported through the API.
* at the time we wrote this, native ad formats like In-article, In-feed and Matched Content are not supported.
*
* @param object $ad_unit ad unit object.
*
* @return bool
*/
public function is_supported( $ad_unit ) {
$mapi_options = Advanced_Ads_AdSense_MAPI::get_option();
$supported = ! array_key_exists( $ad_unit->id, $mapi_options['unsupported_units'] );
if ( ! $supported ) {
$supported = array_key_exists( $ad_unit->id, $mapi_options['ad_codes'] );
}
return $supported;
}
/**
* Update the list of external ad units.
*/
public function update_external_ad_units() {
Advanced_Ads_AdSense_MAPI::get_instance()->ajax_get_adUnits();
}
/**
* If the AdSense account is connected.
*
* @return bool
*/
public function is_account_connected() {
return Advanced_Ads_AdSense_Data::get_instance()->is_setup();
}
/**
* Return path to module-specific JavaScript.
*
* @return string
*/
public function get_javascript_base_path() {
return GADSENSE_BASE_URL . 'admin/assets/js/adsense.js';
}
/**
* JavaScript data to print in the source code.
*
* @inheritDoc
*
* @param array $data data to be printed.
* @return array
*/
public function append_javascript_data( &$data ) {
$pub_id = Advanced_Ads_AdSense_Data::get_instance()->get_adsense_id();
$data['pubId'] = $pub_id;
$data['connected'] = $this->is_account_connected();
$data['ad_types'] = [
'matched_content' => _x( 'Multiplex', 'AdSense ad type', 'advanced-ads' ),
'in_article' => _x( 'In-article', 'AdSense ad type', 'advanced-ads' ),
'in_feed' => _x( 'In-feed', 'AdSense ad type', 'advanced-ads' ),
'display' => _x( 'Display', 'AdSense ad type', 'advanced-ads' ),
'link' => _x( 'Link', 'AdSense ad type', 'advanced-ads' ),
];
return $data;
}
/**
* If the ad also has a manual ad setup option.
*
* @return bool
*/
public function supports_manual_ad_setup() {
return true;
}
/**
* Get the ad unit associated with a given ad ID.
*
* @param int $ad_id The ID of the ad.
* @return object|null The ad unit object associated with the given ad ID, or null if not found.
*/
function get_ad_unit( $ad_id ){
$adense_ad = wp_advads_get_ad( $ad_id );
// Early bail!!
if ( ! $adense_ad || ! $adense_ad->is_type( 'adsense' ) || empty( $adense_ad->get_content() ) ) {
return null;
}
$ad_units = $this->get_external_ad_units();
if ( empty( $ad_units ) ) {
return null;
}
$json_content = json_decode( $adense_ad->get_content() );
$unit_code = $json_content->slotId ?? null;
foreach( $ad_units as $ad_unit ) {
if( $ad_unit->slot_id === $unit_code){
return $ad_unit;
}
}
return null;
}
}