: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
use AdvancedAds\Utilities\WordPress;
* Class Advanced_Ads_Admin_Settings
class Advanced_Ads_Admin_Settings {
* Instance of this class.
protected static $instance = null;
* Advanced_Ads_Admin_Settings constructor.
private function __construct() {
add_action( 'admin_init', [ $this, 'settings_init' ] );
// add ad admin capabilities for settings.
add_action( 'admin_init', [ $this, 'settings_capabilities' ], 20 );
* Return an instance of this class.
* @return object A single instance of this class.
public static function get_instance() {
// If the single instance hasn't been set, set it now.
if ( null === self::$instance ) {
self::$instance = new self();
public function settings_init() {
// get settings page hook.
$hook = Advanced_Ads_Admin::get_instance()->plugin_screen_hook_suffix;
register_setting( ADVADS_SLUG, ADVADS_SLUG, [ $this, 'sanitize_settings' ] );
// "Management" settings section.
'advanced_ads_setting_section',
__( 'Admin', 'advanced-ads' ),
[ $this, 'render_settings_section_callback' ],
// "Disable ads" settings section.
'advanced_ads_setting_section_disable_ads',
__( 'Disable ads', 'advanced-ads' ),
[ $this, 'render_settings_section_disable_ads_callback' ],
// "Layout / Output" settings section.
'advanced_ads_setting_section_output',
__( 'Layout / Output', 'advanced-ads' ),
[ $this, 'render_settings_section_output_callback' ],
// "Content injection" settings section.
'advanced_ads_setting_section_injection',
__( 'Content injection', 'advanced-ads' ),
[ $this, 'render_settings_section_injection_callback' ],
if ( ! defined( 'AAP_VERSION' ) ) {
'advanced_ads_settings_pro_pitch_section',
[ $this, 'render_settings_pro_pitch_section_callback' ],
'advanced-ads-settings-pro-pitch-page'
add_filter( 'advanced-ads-setting-tabs', [ $this, 'pro_pitch_tab' ] );
// Tracking pitch section.
if ( ! defined( 'AAT_VERSION' ) ) {
'advanced_ads_settings_tracking_pitch_section',
[ $this, 'render_settings_tracking_pitch_section_callback' ],
'advanced-ads-settings-tracking-pitch-page'
add_filter( 'advanced-ads-setting-tabs', [ $this, 'tracking_pitch_tab' ] );
// register license settings.
register_setting( ADVADS_SLUG . '-licenses', ADVADS_SLUG . '-licenses' );
* Allow Ad Admin to save license settings..
* @param string[] $options Array with allowed options.
add_filter( 'advanced-ads-ad-admin-options', function( $options ) {
$options[] = ADVADS_SLUG . '-licenses';
'advanced_ads_settings_license_section',
[ $this, 'render_settings_licenses_section_callback' ],
'advanced-ads-settings-license-page'
add_filter( 'advanced-ads-setting-tabs', [ $this, 'license_tab' ] );
'advanced_ads_settings_license_pitch_section',
[ $this, 'render_settings_licenses_pitch_section_callback' ],
'advanced-ads-settings-license-page'
// add setting fields to disable ads.
__( 'Disable ads', 'advanced-ads' ),
[ $this, 'render_settings_disable_ads' ],
'advanced_ads_setting_section_disable_ads'
// add setting fields for user role.
__( 'Hide ads for user roles', 'advanced-ads' ),
[ $this, 'render_settings_hide_for_users' ],
'advanced_ads_setting_section_disable_ads'
// add setting fields for content injection protection.
'content-injection-everywhere',
__( 'Content placement in post lists', 'advanced-ads' ),
[ $this, 'render_settings_content_injection_everywhere' ],
'advanced_ads_setting_section_injection'
// add setting fields for content injection priority.
'content-injection-priority',
__( 'Priority of content injection filter', 'advanced-ads' ),
[ $this, 'render_settings_content_injection_priority' ],
'advanced_ads_setting_section_injection'
// add setting fields to remove injection level limitation.
'content-injection-level-limitation',
__( 'Disable level limitation', 'advanced-ads' ),
[ $this, 'render_settings_content_injection_level_limitation' ],
'advanced_ads_setting_section_injection'
// add setting fields for hiding ads from bots.
__( 'Hide ads from bots', 'advanced-ads' ),
[ $this, 'render_settings_block_bots' ],
'advanced_ads_setting_section_disable_ads'
// dummy setting field to hide ads for post types.
if ( ! defined( 'AAP_VERSION' ) ) {
'disable-by-post-types-pro',
__( 'Disable ads for post types', 'advanced-ads' ),
[ $this, 'render_settings_disable_post_types' ],
'advanced_ads_setting_section_disable_ads'
// opt out from internal notices.
__( 'Disable Ad Health and other notices', 'advanced-ads' ),
[ $this, 'render_settings_disabled_notices' ],
'advanced_ads_setting_section'
// opt out from internal notices.
__( 'ID prefix', 'advanced-ads' ),
[ $this, 'render_settings_front_prefix' ],
'advanced_ads_setting_section_output'
// allow editors to manage ads.
__( 'Allow editors to manage ads', 'advanced-ads' ),
[ $this, 'render_settings_editors_manage_ads' ],
'advanced_ads_setting_section'
// add unfiltered_html option to multisites
if ( is_multisite() && current_user_can( 'unfiltered_html' ) ) {
/* translators: unfiltered_html */
sprintf( __( 'Add the %s capability to user roles on multisite', 'advanced-ads' ), '<code>unfiltered_html</code>' ),
[ $this, 'renders_settings_allow_unfiltered_html' ],
'advanced_ads_setting_section'
__( 'Ad label', 'advanced-ads' ),
[ $this, 'render_settings_add_custom_label' ],
'advanced_ads_setting_section_output'
__( 'Open links in a new window', 'advanced-ads' ),
[ $this, 'render_settings_link_target_callback' ],
'advanced_ads_setting_section_output'
// add setting fields for advanced js.
__( 'Use advanced JavaScript', 'advanced-ads' ),
[ $this, 'render_settings_advanced_js' ],
'advanced_ads_setting_section_output'
if ( is_main_site( get_current_blog_id() ) ) {
__( 'Delete data on uninstall', 'advanced-ads' ),
[ $this, 'render_settings_uninstall_delete_data' ],
'advanced_ads_setting_section'
// hook for additional settings from add-ons.
do_action( 'advanced-ads-settings-init', $hook );
* Make sure ad admin can save options.
* Add a filter on `admin_init` priority 20 to allow other modules/add-ons to add their options.
* Filter option_page_capability_ with the appropriate slug in return to allow the Ad Admin user role to save these settings/options.
public function settings_capabilities() {
$ad_admin_options = [ ADVADS_SLUG ];
* Filters all options that the Ad Admin Role should have access to.
* @param array $ad_admin_options Array with option names.
$ad_admin_options = apply_filters( 'advanced-ads-ad-admin-options', $ad_admin_options );
foreach ( $ad_admin_options as $ad_admin_option ) {
add_filter( 'option_page_capability_' . $ad_admin_option, function() {
return WordPress::user_cap( 'advanced_ads_manage_options' );
* @param array $tabs setting tabs.
public function license_tab( array $tabs ) {
'page' => 'advanced-ads-settings-license-page',
'group' => ADVADS_SLUG . '-licenses',
'title' => __( 'Licenses', 'advanced-ads' ),
* @param array $tabs setting tabs.
public function pro_pitch_tab( array $tabs ) {
'page' => 'advanced-ads-settings-pro-pitch-page',
// 'group' => ADVADS_SLUG . '-pro-pitch',
'title' => __( 'Pro', 'advanced-ads' ),
* @param array $tabs setting tabs.
public function tracking_pitch_tab( array $tabs ) {
$tabs['tracking_pitch'] = [
'page' => 'advanced-ads-settings-tracking-pitch-page',
'tabid' => 'tracking-pitch',
'title' => __( 'Tracking', 'advanced-ads' ),
* Render settings section
public function render_settings_section_callback() {
// for whatever purpose there might come.
* Render "Disable Ads" settings section
public function render_settings_section_disable_ads_callback() {
// for whatever purpose there might come.
* Render "Content Injection" settings section
public function render_settings_section_output_callback() {
// for whatever purpose there might come.
* Render "Content Injection" settings section
public function render_settings_section_injection_callback() {
// for whatever purpose there might come.
* Render licenses settings section
public function render_settings_licenses_section_callback() {
include ADVADS_ABSPATH . 'admin/views/settings/license/section.php';
* Render licenses pithces settings section
public function render_settings_licenses_pitch_section_callback() {
echo '<h3>' . esc_attr__( 'Are you missing something?', 'advanced-ads' ) . '</h3>';
Advanced_Ads_Overview_Widgets_Callbacks::render_addons( true );
* Render pro pitch settings section
public function render_settings_pro_pitch_section_callback() {
include ADVADS_ABSPATH . 'admin/views/upgrades/pro-tab.php';
* Render tracking pitch settings section
public function render_settings_tracking_pitch_section_callback() {
include ADVADS_ABSPATH . 'admin/views/upgrades/tracking.php';
public function render_settings_disable_ads() {
$options = Advanced_Ads::get_instance()->options();
$disable_all = isset( $options['disabled-ads']['all'] ) ? 1 : 0;
$disable_404 = isset( $options['disabled-ads']['404'] ) ? 1 : 0;
$disable_archives = isset( $options['disabled-ads']['archives'] ) ? 1 : 0;
$disable_secondary = isset( $options['disabled-ads']['secondary'] ) ? 1 : 0;
$disable_feed = ( ! isset( $options['disabled-ads']['feed'] ) || $options['disabled-ads']['feed'] ) ? 1 : 0;
$disable_rest_api = isset( $options['disabled-ads']['rest-api'] ) ? 1 : 0;
include ADVADS_ABSPATH . 'admin/views/settings/general/disable-ads.php';
* Render setting to hide ads from logged in users
public function render_settings_hide_for_users() {
$options = Advanced_Ads::get_instance()->options();
if ( isset( $options['hide-for-user-role'] ) ) {
$hide_for_roles = Advanced_Ads_Utils::maybe_translate_cap_to_role( $options['hide-for-user-role'] );
$roles = $wp_roles->get_names();
include ADVADS_ABSPATH . 'admin/views/settings/general/hide-for-user-role.php';
* Render setting to display advanced js file
public function render_settings_advanced_js() {
$options = Advanced_Ads::get_instance()->options();
$checked = ( ! empty( $options['advanced-js'] ) ) ? 1 : 0;
include ADVADS_ABSPATH . 'admin/views/settings/general/advanced-js.php';
* Render setting for content injection protection
public function render_settings_content_injection_everywhere() {
$options = Advanced_Ads::get_instance()->options();
$enabled = $options['content-injection-enabled'] ?? '';
if ( ! isset( $options['content-injection-everywhere'] ) ) {
} elseif ( 'true' === $options['content-injection-everywhere'] ) {
$everywhere = absint( $options['content-injection-everywhere'] );
include ADVADS_ABSPATH . 'admin/views/settings/general/content-injection-everywhere.php';
* Render setting for content injection priority
public function render_settings_content_injection_priority() {
$options = Advanced_Ads::get_instance()->options();
$priority = ( isset( $options['content-injection-priority'] ) ) ? (int) $options['content-injection-priority'] : 100;
include ADVADS_ABSPATH . 'admin/views/settings/general/content-injection-priority.php';
* Render setting to disable content injection level limitation
public function render_settings_content_injection_level_limitation() {
$options = Advanced_Ads::get_instance()->options();
$checked = ( ! empty( $options['content-injection-level-disabled'] ) ) ? 1 : 0;
include ADVADS_ABSPATH . 'admin/views/settings/general/content-injection-level-limitation.php';
* Render setting for blocking bots
public function render_settings_block_bots() {
$options = Advanced_Ads::get_instance()->options();