: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
namespace Yoast\WP\SEO\Integrations\Watchers;
use Yoast\WP\SEO\Conditionals\No_Conditionals;
use Yoast\WP\SEO\Helpers\Capability_Helper;
use Yoast\WP\SEO\Helpers\Current_Page_Helper;
use Yoast\WP\SEO\Helpers\Notification_Helper;
use Yoast\WP\SEO\Helpers\Options_Helper;
use Yoast\WP\SEO\Integrations\Integration_Interface;
use Yoast\WP\SEO\Presenters\Admin\Search_Engines_Discouraged_Presenter;
use Yoast_Notification_Center;
* Shows a notification for users who have access for robots disabled.
class Search_Engines_Discouraged_Watcher implements Integration_Interface {
public const NOTIFICATION_ID = 'wpseo-search-engines-discouraged';
* The Yoast notification center.
* @var Yoast_Notification_Center
protected $notification_center;
* The notification helper.
* @var Notification_Helper
protected $notification_helper;
* The search engines discouraged presenter.
* @var Search_Engines_Discouraged_Presenter
* The current page helper.
* @var Current_Page_Helper
protected $current_page_helper;
protected $options_helper;
protected $capability_helper;
* Search_Engines_Discouraged_Watcher constructor.
* @param Yoast_Notification_Center $notification_center The notification center.
* @param Notification_Helper $notification_helper The notification helper.
* @param Current_Page_Helper $current_page_helper The current page helper.
* @param Options_Helper $options_helper The options helper.
* @param Capability_Helper $capability_helper The capability helper.
public function __construct(
Yoast_Notification_Center $notification_center,
Notification_Helper $notification_helper,
Current_Page_Helper $current_page_helper,
Options_Helper $options_helper,
Capability_Helper $capability_helper
$this->notification_center = $notification_center;
$this->notification_helper = $notification_helper;
$this->current_page_helper = $current_page_helper;
$this->options_helper = $options_helper;
$this->capability_helper = $capability_helper;
$this->presenter = new Search_Engines_Discouraged_Presenter();
* Initializes the integration.
* On admin_init, it is checked whether the notification about search engines being discouraged should be shown.
* On admin_notices, the notice about the search engines being discouraged will be shown when necessary.
public function register_hooks() {
\add_action( 'admin_init', [ $this, 'manage_search_engines_discouraged_notification' ] );
* The `admin_notices` hook fires on single site admin pages vs.
* `network_admin_notices` which fires on multisite admin pages and
* `user_admin_notices` which fires on multisite user admin pages.
\add_action( 'admin_notices', [ $this, 'maybe_show_search_engines_discouraged_notice' ] );
* Manage the search engines discouraged notification.
* Shows the notification if needed and deletes it if needed.
public function manage_search_engines_discouraged_notification() {
if ( ! $this->should_show_search_engines_discouraged_notification() ) {
$this->remove_search_engines_discouraged_notification_if_exists();
$this->maybe_add_search_engines_discouraged_notification();
* Show the search engine discouraged notice when needed.
public function maybe_show_search_engines_discouraged_notice() {
if ( ! $this->should_show_search_engines_discouraged_notice() ) {
$this->show_search_engines_discouraged_notice();
* Whether the search engines discouraged notification should be shown.
protected function should_show_search_engines_discouraged_notification() {
return $this->search_engines_are_discouraged() && $this->options_helper->get( 'ignore_search_engines_discouraged_notice', false ) === false;
* Remove the search engines discouraged notification if it exists.
protected function remove_search_engines_discouraged_notification_if_exists() {
$this->notification_center->remove_notification_by_id( self::NOTIFICATION_ID );
* Add the search engines discouraged notification if it does not exist yet.
protected function maybe_add_search_engines_discouraged_notification() {
if ( ! $this->notification_center->get_notification_by_id( self::NOTIFICATION_ID ) ) {
$notification = $this->notification();
$this->notification_helper->restore_notification( $notification );
$this->notification_center->add_notification( $notification );
* Checks whether search engines are discouraged from indexing the site.
* @return bool Whether search engines are discouraged from indexing the site.
protected function search_engines_are_discouraged() {
return (string) \get_option( 'blog_public' ) === '0';
* Whether the search engines notice should be shown.
protected function should_show_search_engines_discouraged_notice() {
$pages_to_show_notice = [
$this->search_engines_are_discouraged()
&& $this->capability_helper->current_user_can( 'manage_options' )
&& $this->options_helper->get( 'ignore_search_engines_discouraged_notice', false ) === false
$this->current_page_helper->is_yoast_seo_page()
|| \in_array( $this->current_page_helper->get_current_admin_page(), $pages_to_show_notice, true )
&& $this->current_page_helper->get_current_yoast_seo_page() !== 'wpseo_dashboard'
* Show the search engines discouraged notice.
protected function show_search_engines_discouraged_notice() {
'<div id="robotsmessage" class="notice notice-error">%1$s</div>',
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Output from present() is considered safe.
$this->presenter->present()
* Returns an instance of the notification.
* @return Yoast_Notification The notification to show.
protected function notification() {
return new Yoast_Notification(
$this->presenter->present(),
'type' => Yoast_Notification::ERROR,
'id' => self::NOTIFICATION_ID,
'capabilities' => 'wpseo_manage_options',