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

264 lines
6.6 KiB
PHP
Executable File

<?php
/**
* Compatibility Compatibility.
*
* @package AdvancedAds
* @author Advanced Ads <info@wpadvancedads.com>
* @since 1.48.2
*/
namespace AdvancedAds\Compatibility;
use Exception;
use ReflectionClass;
use AdvancedAds\Utilities\Data;
use AdvancedAds\Framework\Utilities\Str;
use AdvancedAds\Framework\Interfaces\Integration_Interface;
defined( 'ABSPATH' ) || exit;
/**
* Compatibility Compatibility.
*/
class Compatibility implements Integration_Interface {
/**
* Hook into WordPress.
*
* @return void
*/
public function hooks(): void {
if ( is_admin() ) {
( new Admin_Compatibility() )->hooks();
}
add_filter( 'wpseo_sitemap_entry', [ $this, 'wpseo_noindex_ad_attachments' ], 10, 3 );
add_filter( 'mailpoet_newsletter_shortcode', [ $this, 'mailpoet_ad_shortcode' ] );
if ( defined( 'ELEMENTOR_VERSION' ) ) {
add_filter( 'advanced-ads-placement-content-injection-xpath', [ $this, 'elementor_content_injection' ] );
}
if ( defined( 'BORLABS_COOKIE_VERSION' ) ) {
add_filter( 'advanced-ads-can-display-ads-in-header', [ $this, 'borlabs_cookie_can_add_auto_ads' ], 10 );
}
}
/**
* WordPress SEO: remove attachments attached to ads from `/attachment-sitemap.xml`.
*
* @param array $url Array of URL parts.
* @param string $type URL type.
* @param object $post WP_Post object of attachment.
*
* @return array|bool Unmodified array of URL parts or false to remove URL.
*/
public function wpseo_noindex_ad_attachments( $url, $type, $post ) {
if ( 'post' !== $type ) {
return $url;
}
$ad_ids = Data::get_ads_ids();
if ( isset( $post->post_parent ) && in_array( $post->post_parent, $ad_ids, true ) ) {
return false;
}
return $url;
}
/**
* Display an ad or ad group in a newsletter created by MailPoet.
*
* Usage:
* [custom:ad:123] to display ad with the ID 123
* [custom:ad_group:345] to display ad group with the ID 345
*
* @param string $shortcode Shortcode that placed the ad.
*
* @return string
*/
public function mailpoet_ad_shortcode( $shortcode ): string {
// Display an ad group.
if ( sscanf( $shortcode, '[custom:ad_group:%d]', $id ) === 1 ) {
$ad_group = wp_advads_get_group( $id );
return ( $ad_group && $ad_group->is_type( [ 'default', 'ordered' ] ) )
? get_the_group( $ad_group )
: '';
}
// Display individual ad.
if ( sscanf( $shortcode, '[custom:ad:%d]', $id ) === 1 ) {
$ad = wp_advads_get_ad( $id );
if ( $ad && $ad->is_type( [ 'plain', 'image' ] ) ) {
$ad_content = get_the_ad( $ad );
// Add responsive styles for email compatibility.
if ( $ad->is_type( 'image' ) ) {
return str_replace(
'<img',
'<img style="max-width: 100%; height: auto; display: block;"',
$ad_content
);
}
return $ad_content;
}
return '';
}
return $shortcode;
}
/**
* Modify xPath expression for Elementor plugin.
* The plugin does not wrap newly created text in 'p' tags.
*
* @param string $tag Xpath tag.
*
* @return string
*/
public function elementor_content_injection( $tag ): string {
// 'p' or 'div.elementor-widget-text-editor' without nested 'p'
if ( 'p' === $tag ) {
$tag = "*[self::p or self::div[@class and contains(concat(' ', normalize-space(@class), ' '), ' elementor-widget-text-editor ') and not(descendant::p)]]";
}
return $tag;
}
/**
* Check if Adsense Auto ads code can be added to the header.
*
* @param bool $can_display If the ad can be displayed.
*
* @return bool
*/
public function borlabs_cookie_can_add_auto_ads( $can_display ): bool {
if ( ! $can_display ) {
return false;
}
return ! self::borlabs_cookie_adsense_auto_ads_code_exists();
}
/**
* Thrive Theme Builder Check if placements of type other than `header` can be injected during `wp_head` action.
*/
public static function can_inject_during_wp_head() {
if ( did_action( 'before_theme_builder_template_render' ) && ! did_action( 'after_theme_builder_template_render' ) ) {
return true;
}
return false;
}
/**
* Check if Adsense Auto ads code is added by the Borlabs Cookie plugin.
*
* This allows to prevent the "Only one 'enable_page_level_ads' allowed per page" error
* that makes impossible to close the "Privacy Preference" window created by the "Borlabs Cookie" plugin.
*
* @return bool
*/
public static function borlabs_cookie_adsense_auto_ads_code_exists(): bool {
static $result = null;
if ( null !== $result ) {
return $result;
}
$all_cookies = self::borlabs_get_cookies();
if ( empty( $all_cookies ) ) {
$result = false;
return $result;
}
foreach ( $all_cookies as $cookie_group_data ) {
if ( self::is_marketing_cookie( $cookie_group_data ) ) {
foreach ( $cookie_group_data->cookies as $cookie_data ) {
if ( self::is_adsense_cookie( $cookie_data ) ) {
$opt_in_js = $cookie_data->opt_in_js;
}
}
}
}
if ( empty( $opt_in_js ) ) {
$result = false;
return $result;
}
$result = preg_match( '/<script[^>]+data-ad-client/', $opt_in_js ) || false !== strpos( $opt_in_js, 'enable_page_level_ads:' );
return $result;
}
/**
* Get cookies from borlabs plugin
*
* @return bool|array
*/
private static function borlabs_get_cookies() {
// Early bail!!
if ( ! class_exists( '\BorlabsCookie\Cookie\Frontend\Cookies' ) ) {
return false;
}
$all_cookies = [];
try {
$refl_cookies = new ReflectionClass( '\BorlabsCookie\Cookie\Frontend\Cookies' );
if ( $refl_cookies->hasMethod( 'getInstance' ) && $refl_cookies->hasMethod( 'getAllCookieGroups' ) ) {
$instance = $refl_cookies->getMethod( 'getInstance' );
$cookie_groups = $refl_cookies->getMethod( 'getAllCookieGroups' );
if ( $instance->isPublic() && $instance->isStatic() && $cookie_groups->isPublic() ) {
$all_cookies = \BorlabsCookie\Cookie\Frontend\Cookies::getInstance()->getAllCookieGroups();
}
}
} catch ( Exception $e ) {
return false;
}
return $all_cookies;
}
/**
* Is cookie is of marketing and has data
*
* @param mixed $cookie Cookie to check.
*
* @return bool
*/
private static function is_marketing_cookie( $cookie ): bool {
if (
! empty( $cookie->group_id ) &&
'marketing' === $cookie->group_id &&
! empty( $cookie->cookies )
) {
return true;
}
return false;
}
/**
* Is cookie is of marketing and has data
*
* @param mixed $cookie Cookie to check.
*
* @return bool
*/
private static function is_adsense_cookie( $cookie ): bool {
if (
! empty( $cookie->cookie_id ) &&
'google-adsense' === $cookie->cookie_id &&
! empty( $cookie->opt_in_js )
) {
return true;
}
return false;
}
}