: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* Handles Advanced Ads Inline CSS settings.
class Advanced_Ads_Inline_Css {
* Holds the state if inline css should be output or not.
protected $add_inline_css;
public function __construct() {
* Filters the state if inline css should be output or not.
* Ajax CB container could have added inline css already.
* Set to false if an addon output inline css before the main plugin.
* @param bool Contains the state.
$this->add_inline_css = apply_filters( 'advanced-ads-output-inline-css', true );
if ( ! $this->add_inline_css ) {
// Add inline css to the tcf container.
$this->check_tcf_option();
* @param array $wrapper Add wrapper array.
* @param string $css Custom inline css.
* @param bool|null $global_output Whether this ad is using cache-busting.
public function add_css( $wrapper, $css, $global_output ) {
$this->add_inline_css = $this->add_inline_css && $global_output !== false;
if ( ! $this->add_inline_css ) {
$styles = $this->get_styles_by_string( $css );
$wrapper['style'] = empty( $wrapper['style'] ) ? $styles : array_merge( $wrapper['style'], $styles );
$this->add_inline_css = false;
* Extend TCF output with a container containing inline css.
* @param string $output The output string.
* @param Advanced_Ads_Ad $ad The ad object.
public function add_tcf_container( $output, Advanced_Ads_Ad $ad ) {
$inline_css = $ad->options( 'inline-css' );
|| strpos( $output, '<div class="tcf-container"' ) === 0
'<div class="tcf-container" style="' . $inline_css . '">%s</div>',
* Reformat css styles string to array.
* @param string $string CSS-Style.
private function get_styles_by_string( string $string ): array {
$chunks = array_chunk( preg_split( '/[:;]/', $string ), 2 );
array_walk_recursive( $chunks, function( &$value ) {
$keys = array_filter( array_column( $chunks, 0 ) );
$values = array_filter( array_column( $chunks, 1 ) );
$length = min( count( $keys ), count( $values ) );
return array_combine( array_slice( $keys, 0, $length ), array_slice( $values, 0, $length ) );
* If TCF is active, i.e. there is a TCF container, add the options to this container.
private function check_tcf_option() {
if ( $privacy_options === null ) {
$privacy_options = Advanced_Ads_Privacy::get_instance()->options();
if ( ! empty( $privacy_options['enabled'] ) && $privacy_options['enabled'] === 'on' && $privacy_options['consent-method'] === 'iab_tcf_20' ) {
add_filter( 'advanced-ads-output-final', [ $this, 'add_tcf_container' ], 20, 2 );
$this->add_inline_css = false;