: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
if ( ! isset( $ad->args['frontend-check'] ) ) { return $content; }
if ( Advanced_Ads_Ad_Debug::is_https_and_http( $ad ) ) {
<script>advanced_ads_ready( function() {
var ad_id = '<?php echo $ad->id; ?>';
advanced_ads_frontend_checks.add_item_to_node( '.advanced_ads_ad_health_has_http', ad_id );
advanced_ads_frontend_checks.add_item_to_notices( 'ad_has_http', { append_key: ad_id, ad_id: ad_id } );
$content .= Advanced_Ads_Utils::get_inline_asset( ob_get_clean() );
if ( ! Advanced_Ads_Frontend_Checks::can_use_head_placement( $content, $ad ) ) {
<script>advanced_ads_ready( function() {
var ad_id = '<?php echo $ad->id; ?>';
advanced_ads_frontend_checks.add_item_to_node( '.advanced_ads_ad_health_incorrect_head', ad_id );
advanced_ads_frontend_checks.add_item_to_notices( 'ad_with_output_in_head', { append_key: ad_id, ad_id: ad_id } );
$content .= Advanced_Ads_Utils::get_inline_asset( ob_get_clean() );
$adsense_options = Advanced_Ads_AdSense_Data::get_instance()->get_options();
if ( 'adsense' === $ad->type
&& ! empty( $ad->args['cache_busting_elementid'] )
&& ! isset( $adsense_options['violation-warnings-disable'] )
<script>advanced_ads_ready( function() {
var ad_id = '<?php echo $ad->id; ?>';
var wrapper = '#<?php echo $ad->args['cache_busting_elementid']; ?>';
advanced_ads_frontend_checks.advads_highlight_hidden_adsense( wrapper );
$content .= Advanced_Ads_Utils::get_inline_asset( ob_get_clean() );
* Check if the 'Header Code' placement can be used to delived the ad.
* @param string $content Ad content.
* @param Advanced_Ads_Ad $ad Advanced_Ads_Ad.
public static function can_use_head_placement( $content, Advanced_Ads_Ad $ad ) {
if ( ! $ad->is_head_placement ) {
// strip linebreaks, because, a line break after a comment is identified as a text node.
$content = preg_replace( "/\r|\n/", "", $content );
if ( ! $dom = self::get_ad_dom( $content ) ) {
$body = $dom->getElementsByTagName( 'body' )->item( 0 );
$count = $body->childNodes->length;
for ( $i = 0; $i < $count; $i++ ) {
$node = $body->childNodes->item( $i );
if ( XML_TEXT_NODE === $node->nodeType ) {
if ( XML_ELEMENT_NODE === $node->nodeType
&& ! in_array( $node->nodeName, [ 'meta', 'link', 'title', 'style', 'script', 'noscript', 'base' ] ) ) {
* Convert ad content to a DOMDocument.
* @return DOMDocument|false
private static function get_ad_dom( $content ) {
if ( ! extension_loaded( 'dom' ) ) {
$libxml_previous_state = libxml_use_internal_errors( true );
$dom = new DOMDocument();
$result = $dom->loadHTML( '<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body>' . $content . '</body></html>' );
libxml_use_internal_errors( $libxml_previous_state );
* Check if at least one placement uses `the_content`.
* @return bool True/False.
private function has_the_content_placements() {
$placements = Advanced_Ads::get_ad_placements_array();
$placement_types = Advanced_Ads_Placements::get_placement_types();
// Find a placement that depends on 'the_content' filter.
foreach ( $placements as $placement ) {
if ( isset ( $placement['type'] )
&& ! empty( $placement_types[ $placement['type'] ]['options']['uses_the_content'] ) ) {
* Check if atleast one placement uses `adblocker item`.
* @return bool True/False.
private function has_adblocker_placements() {
$placements = Advanced_Ads::get_instance()->get_model()->get_ad_placements_array();
foreach ($placements as $placement) {
if (!empty($placement['options']['item_adblocker'])) {