Files
SIGE-WEB-snapshot/ambiente-de-test/wp-content/plugins/wp-security-audit-log/classes/WPSensors/class-yoast-seo-sensor.php

1632 lines
58 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Sensor: Yoast SEO
*
* Yoast SEO sensor file.
*
* @package Wsal
* @since 3.2.0
*/
declare(strict_types=1);
namespace WSAL\WP_Sensors;
use WSAL\Controllers\Alert_Manager;
use WSAL\WP_Sensors\Helpers\Yoast_SEO_Helper;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Support for Yoast SEO Plugin.
*
* @package Wsal
* @subpackage Sensors
*/
if ( ! class_exists( '\WSAL\WP_Sensors\Yoast_SEO_Sensor' ) ) {
/**
* The main sensor class.
*/
class Yoast_SEO_Sensor {
/**
* Post ID.
*
* @var int
*/
private static $post_id = 0;
/**
* Post Object.
*
* @var WP_Post
*/
private static $post;
/**
* Possible scheme types and labels.
*
* @var array
*/
private static $schema_labels = array(
'Article' => 'Article',
'BlogPosting' => 'Blog Post',
'SocialMediaPosting' => 'Social Media Posting',
'NewsArticle' => 'News Article',
'AdvertiserContentArticle' => 'Advertiser Content Article',
'SatiricalArticle' => 'Satirical Article',
'ScholarlyArticle' => 'Scholarly Article',
'TechArticle' => 'Tech Article',
'Report' => 'Report',
'WebPage' => 'Web Page',
'ItemPage' => 'Item Page',
'AboutPage' => 'About Page',
'FAQPage' => 'FAQ Page',
'QAPage' => 'QA Page',
'ProfilePage' => 'Profile Page',
'ContactPage' => 'Contact Page',
'MedicalWebPage' => 'Medical Web Page',
'CollectionPage' => 'Collection Page',
'CheckoutPage' => 'Checkout Page',
'RealEstateListing' => 'Real Estate Listing',
'SearchResultsPage' => 'Search Results Page',
'_yoast_wpseo_bctitle' => '',
);
/**
* Listening to events using hooks.
*/
public static function init() {
if ( Yoast_SEO_Helper::is_wpseo_active() ) {
// If user can edit post then hook this function.
if ( current_user_can( 'edit_posts' ) ) {
add_action( 'admin_init', array( __CLASS__, 'event_admin_init' ) );
}
// Yoast SEO option alerts.
add_action( 'updated_option', array( __CLASS__, 'yoast_options_trigger' ), 10, 3 );
// Yoast SEO Site option alerts.
add_action( 'update_site_option', array( __CLASS__, 'yoast_site_options_trigger' ), 10, 3 );
}
}
/**
* Loads all the plugin dependencies early.
*
* @return void
*
* @since 4.6.0
*/
public static function early_init() {
add_filter(
'wsal_event_objects',
array( '\WSAL\WP_Sensors\Helpers\Yoast_SEO_Helper', 'wsal_yoast_seo_extension_add_custom_event_objects' )
);
if ( Yoast_SEO_Helper::is_wpseo_active() ) {
// Yoast SEO blog option default change alerts.
add_action(
'add_option_wpseo',
array( __CLASS__, 'yoast_blog_options_trigger' ),
10,
2
);
add_filter(
'wsal_togglealerts_sub_category_events',
array( '\WSAL\WP_Sensors\Helpers\Yoast_SEO_Helper', 'wsal_yoast_seo_extension_togglealerts_sub_category_events' )
);
add_filter(
'wsal_togglealerts_sub_category_titles',
array( '\WSAL\WP_Sensors\Helpers\Yoast_SEO_Helper', 'wsal_yoast_seo_extension_togglealerts_sub_category_titles' ),
10,
2
);
add_filter(
'wsal_togglealerts_obsolete_events',
array( '\WSAL\WP_Sensors\Helpers\Yoast_SEO_Helper', 'wsal_yoast_seo_extension_togglealerts_obsolete_events' )
);
}
}
/**
* Method: Admin Init Event.
*/
public static function event_admin_init() {
// Check for settings change.
self::check_seo_data_change();
}
/**
* Method: Get Post SEO Data.
*
* @param string $key Meta Key.
* @return mixed
*/
private static function get_post_seo_data( $key = '' ) {
// If empty key then return false.
if ( empty( $key ) ) {
return false;
}
return \WPSEO_Meta::get_value( $key, self::$post_id );
}
/**
* Get editor link.
*
* @param stdClass $post_id - Post id.
* @return array $editor_link - Name and value link.
*/
private static function get_editor_link( $post_id ) {
$value = get_edit_post_link( $post_id );
$editor_link = array(
'name' => 'EditorLinkPost',
'value' => $value,
);
return $editor_link;
}
/**
* Method: Detect Post SEO Data Change.
*/
private static function check_seo_data_change() {
// Set filter input args.
$filter_input_args = array(
'post_ID' => FILTER_VALIDATE_INT,
'yoast_wpseo_is_cornerstone' => FILTER_VALIDATE_BOOLEAN,
'yoast_wpseo_meta-robots-noindex' => FILTER_VALIDATE_INT,
'yoast_wpseo_meta-robots-nofollow' => FILTER_VALIDATE_INT,
'yoast_wpseo_canonical' => FILTER_VALIDATE_URL,
);
// Filter POST global array.
$post_array = filter_input_array( INPUT_POST, $filter_input_args );
if ( isset( $_POST['_wpnonce'] ) ) {
$post_array['_wpnonce'] = \sanitize_text_field( \wp_unslash( $_POST['_wpnonce'] ) );
}
if ( isset( $_POST['action'] ) ) {
$post_array['action'] = \sanitize_text_field( \wp_unslash( $_POST['action'] ) );
}
if ( isset( $_POST['yoast_wpseo_title'] ) ) {
$post_array['yoast_wpseo_title'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_title'] ) );
}
if ( isset( $_POST['yoast_wpseo_metadesc'] ) ) {
$post_array['yoast_wpseo_metadesc'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_metadesc'] ) );
}
if ( isset( $_POST['yoast_wpseo_focuskw'] ) ) {
$post_array['yoast_wpseo_focuskw'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_focuskw'] ) );
}
if ( isset( $_POST['yoast_wpseo_meta-robots-adv'] ) ) {
$post_array['yoast_wpseo_meta-robots-adv'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_meta-robots-adv'] ) );
}
if ( isset( $_POST['yoast_wpseo_schema_page_type'] ) ) {
$post_array['yoast_wpseo_schema_page_type'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_schema_page_type'] ) );
}
if ( isset( $_POST['yoast_wpseo_schema_page_type'] ) ) {
$post_array['yoast_wpseo_schema_page_type'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_schema_page_type'] ) );
}
if ( isset( $_POST['yoast_wpseo_schema_article_type'] ) ) {
$post_array['yoast_wpseo_schema_article_type'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_schema_article_type'] ) );
}
if ( isset( $_POST['yoast_wpseo_bctitle'] ) ) {
$post_array['yoast_wpseo_bctitle'] = \sanitize_text_field( \wp_unslash( $_POST['yoast_wpseo_bctitle'] ) );
}
if ( isset( $post_array['post_ID'] )
&& 'editpost' === $post_array['action']
&& isset( $post_array['_wpnonce'] )
&& wp_verify_nonce( $post_array['_wpnonce'], 'update-post_' . $post_array['post_ID'] ) ) {
self::$post_id = intval( $post_array['post_ID'] );
self::$post = get_post( self::$post_id );
// Check SEO data changes and alert if changed.
if ( isset( $post_array['yoast_wpseo_title'] ) ) {
self::check_title_change( $post_array['yoast_wpseo_title'] ); // Title.
}
if ( isset( $post_array['yoast_wpseo_metadesc'] ) ) {
self::check_desc_change( $post_array['yoast_wpseo_metadesc'] ); // Meta description.
}
if ( isset( $post_array['yoast_wpseo_meta-robots-noindex'] ) ) {
self::check_robots_index_change( $post_array['yoast_wpseo_meta-robots-noindex'] ); // Meta Robots Index.
}
if ( isset( $post_array['yoast_wpseo_meta-robots-nofollow'] ) ) {
self::check_robots_follow_change( $post_array['yoast_wpseo_meta-robots-nofollow'] ); // Meta Robots Follow.
}
if ( isset( $post_array['yoast_wpseo_meta-robots-adv'] ) ) {
self::check_robots_advanced_change( $post_array['yoast_wpseo_meta-robots-adv'] ); // Meta Robots Advanced.
}
if ( isset( $post_array['yoast_wpseo_canonical'] ) ) {
self::check_canonical_url_change( $post_array['yoast_wpseo_canonical'] ); // Canonical URL.
}
if ( isset( $post_array['yoast_wpseo_focuskw'] ) ) {
self::check_focus_keys_change( $post_array['yoast_wpseo_focuskw'] ); // Focus keywords.
}
if ( isset( $post_array['yoast_wpseo_is_cornerstone'] ) ) {
self::check_cornerstone_change( $post_array['yoast_wpseo_is_cornerstone'] ); // Cornerstone.
}
if ( isset( $post_array['yoast_wpseo_schema_page_type'] ) ) {
self::check_schema_change( $post_array['yoast_wpseo_schema_page_type'], 'page_type' );
}
if ( isset( $post_array['yoast_wpseo_schema_article_type'] ) ) {
self::check_schema_change( $post_array['yoast_wpseo_schema_article_type'], 'article_type' );
}
if ( isset( $post_array['yoast_wpseo_bctitle'] ) ) {
self::check_breadcrumb_change( $post_array['yoast_wpseo_bctitle'] );
}
}
}
/**
* Method: Check SEO Title Change.
*
* @param string $title Changed SEO Title.
*/
private static function check_title_change( $title ) {
// Get old title value.
$old_title = (string) self::get_post_seo_data( 'title' );
$title = (string) $title;
// If old and new values are empty then don't log the alert.
if ( empty( $old_title ) && empty( $title ) ) {
return;
}
// Remove whitespaces at the ends of the titles.
$old_title = trim( $old_title );
$title = trim( $title );
// If title is changed then log alert.
if ( $old_title !== $title ) {
// Ensure default value is not passed as NULL.
if ( ! empty( $old_title ) && empty( $title ) ) {
if ( strpos( $old_title, '%%title%% %%page%% %%sep%% %%sitename%%' ) !== false ) {
$title = '%%title%% %%page%% %%sep%% %%sitename%%';
}
}
if ( empty( $old_title ) && ! empty( $title ) ) {
if ( strpos( $title, '%%title%% %%page%% %%sep%% %%sitename%%' ) !== false ) {
$old_title = '%%title%% %%page%% %%sep%% %%sitename%%';
}
}
$editor_link = self::get_editor_link( self::$post_id );
Alert_Manager::trigger_event(
8801,
array(
'PostID' => self::$post->ID,
'PostType' => self::$post->post_type,
'PostTitle' => self::$post->post_title,
'PostStatus' => self::$post->post_status,
'PostDate' => self::$post->post_date,
'PostUrl' => get_permalink( self::$post->ID ),
'OldSEOTitle' => $old_title,
'NewSEOTitle' => $title,
$editor_link['name'] => $editor_link['value'],
)
);
}
}
/**
* Method: Check SEO Meta Description Change.
*
* @param string $desc Changed SEO Meta Description.
*/
private static function check_desc_change( $desc ) {
// Get old desc value.
$old_desc = esc_html( self::get_post_seo_data( 'metadesc' ) );
$desc = esc_html( $desc );
// If old and new values are empty then don't log the alert.
if ( empty( $old_desc ) && empty( $desc ) ) {
return;
}
// If desc is changed then log alert.
if ( trim( $old_desc ) !== trim( $desc ) ) {
// Replace NULL with a nicer string.
if ( empty( $old_desc ) ) {
$old_desc = esc_html__( 'Not provided', 'wp-security-audit-log' );
}
$editor_link = self::get_editor_link( self::$post_id );
Alert_Manager::trigger_event(
8802,
array(
'PostID' => self::$post->ID,
'PostType' => self::$post->post_type,
'PostTitle' => self::$post->post_title,
'PostStatus' => self::$post->post_status,
'PostDate' => self::$post->post_date,
'PostUrl' => get_permalink( self::$post->ID ),
'old_desc' => $old_desc,
'new_desc' => $desc,
$editor_link['name'] => $editor_link['value'],
)
);
}
}
/**
* Method: Check Meta Robots Index Change.
*
* @param string $index Changed Meta Robots Index.
*/
private static function check_robots_index_change( $index ) {
// Get old title value.
$old_index = (int) self::get_post_seo_data( 'meta-robots-noindex' );
if ( 1 === $old_index ) {
$old_index = 'No';
} else {
$old_index = 'Yes';
}
if ( 1 === $index ) {
$index = 'No';
} else {
$index = 'Yes';
}
// If setting is changed then log alert.
if ( $old_index !== $index ) {
$editor_link = self::get_editor_link( self::$post_id );
Alert_Manager::trigger_event(
8803,
array(
'PostID' => self::$post->ID,
'PostType' => self::$post->post_type,
'PostTitle' => self::$post->post_title,
'PostStatus' => self::$post->post_status,
'PostDate' => self::$post->post_date,
'PostUrl' => get_permalink( self::$post->ID ),
'OldStatus' => $old_index,
'NewStatus' => $index,
$editor_link['name'] => $editor_link['value'],
)
);
}
}
/**
* Method: Check Meta Robots Follow Change.
*
* @param string $follow Changed Meta Robots Follow.
*/
private static function check_robots_follow_change( $follow ) {
// Get old title value.
$old_follow = (int) self::get_post_seo_data( 'meta-robots-nofollow' );
if ( 1 === $old_follow ) {
$old_follow = 'disabled';
} else {
$old_follow = 'enabled';
}
if ( 1 === $follow ) {
$follow = 'disabled';
} else {
$follow = 'enabled';
}
// If setting is changed then log alert.
if ( $old_follow !== $follow ) {
$editor_link = self::get_editor_link( self::$post_id );
Alert_Manager::trigger_event(
8804,
array(
'PostID' => self::$post->ID,
'PostType' => self::$post->post_type,
'PostTitle' => self::$post->post_title,
'PostStatus' => self::$post->post_status,
'PostDate' => self::$post->post_date,
'PostUrl' => get_permalink( self::$post->ID ),
'EventType' => $follow,
$editor_link['name'] => $editor_link['value'],
)
);
}
}
/**
* Method: Check Meta Robots Advanced Change.
*
* @param array $advanced Advanced array.
*/
private static function check_robots_advanced_change( $advanced ) {
// Convert to string.
if ( is_array( $advanced ) ) {
$advanced = implode( ',', $advanced );
}
// Get old title value.
$old_adv = self::get_post_seo_data( 'meta-robots-adv' );
// If old and new values are empty then don't log the alert.
if ( empty( $old_adv ) && ( empty( $advanced ) || '-' === $advanced ) ) {
return;
}
// If setting is changed then log alert.
if ( $old_adv !== $advanced ) {
$editor_link = self::get_editor_link( self::$post_id );
Alert_Manager::trigger_event(
8805,
array(
'PostID' => self::$post->ID,
'PostType' => self::$post->post_type,
'PostTitle' => self::$post->post_title,
'PostStatus' => self::$post->post_status,
'PostDate' => self::$post->post_date,
'PostUrl' => get_permalink( self::$post->ID ),
'OldStatus' => $old_adv,
'NewStatus' => $advanced,
$editor_link['name'] => $editor_link['value'],
)
);
}
}
/**
* Method: Check Canonical URL Change.
*
* @param string $canonical_url Changed Canonical URL.
*/
private static function check_canonical_url_change( $canonical_url ) {
// Get old title value.
$old_url = self::get_post_seo_data( 'canonical' );
// Check to see if both change value are empty.
if ( empty( $old_url ) && empty( $canonical_url ) ) {
return; // Return if both are empty.
}
// If title is changed then log alert.
if ( $old_url !== $canonical_url ) {
$editor_link = self::get_editor_link( self::$post_id );
Alert_Manager::trigger_event(
8806,
array(
'PostID' => self::$post->ID,
'PostType' => self::$post->post_type,
'PostTitle' => self::$post->post_title,
'PostStatus' => self::$post->post_status,
'PostDate' => self::$post->post_date,
'PostUrl' => get_permalink( self::$post->ID ),
'OldCanonicalUrl' => $old_url,
'NewCanonicalUrl' => $canonical_url,
$editor_link['name'] => $editor_link['value'],
)
);
}
}
/**
* Method: Check Focus Keywords Change.
*
* @param string $focus_keys Changed Focus Keywords.
*/
private static function check_focus_keys_change( $focus_keys ) {
// Get old title value.
$old_focus_keys = self::get_post_seo_data( 'focuskw' );
// If old and new values are empty then don't log the alert.
if ( empty( $old_focus_keys ) && empty( $focus_keys ) ) {
return;
}
// If title is changed then log alert.
if ( $old_focus_keys !== $focus_keys ) {
// Replace NULL with a nicer string.
if ( empty( $old_focus_keys ) ) {
$old_focus_keys = esc_html__( 'Not provided', 'wp-security-audit-log' );
}
$editor_link = self::get_editor_link( self::$post_id );
Alert_Manager::trigger_event(
8807,
array(
'PostID' => self::$post->ID,
'PostType' => self::$post->post_type,
'PostTitle' => self::$post->post_title,
'PostStatus' => self::$post->post_status,
'PostDate' => self::$post->post_date,
'PostUrl' => get_permalink( self::$post->ID ),
'old_keywords' => $old_focus_keys,
'new_keywords' => $focus_keys,
$editor_link['name'] => $editor_link['value'],
)
);
}
}
/**
* Method: Check Cornerstone Change.
*
* @param string $cornerstone Changed Cornerstone.
*/
private static function check_cornerstone_change( $cornerstone ) {
// Get old title value.
$old_cornerstone = (int) self::get_post_seo_data( 'is_cornerstone' );
$cornerstone = (int) $cornerstone;
if ( 1 === $cornerstone ) {
$alert_status = 'enabled';
} else {
$alert_status = 'disabled';
}
// If setting is changed then log alert.
if ( $old_cornerstone !== $cornerstone ) {
$editor_link = self::get_editor_link( self::$post_id );
Alert_Manager::trigger_event(
8808,
array(
'PostID' => self::$post->ID,
'PostType' => self::$post->post_type,
'PostTitle' => self::$post->post_title,
'PostStatus' => self::$post->post_status,
'PostDate' => self::$post->post_date,
'PostUrl' => get_permalink( self::$post->ID ),
'EventType' => $alert_status,
$editor_link['name'] => $editor_link['value'],
)
);
}
}
/**
* Method: Check Breadcrumb Change.
*
* @param string $breadcrumb Changed Breadcrumb.
*/
private static function check_breadcrumb_change( $breadcrumb ) {
// Get old title value.
$old_breadcrumb = ( ! self::get_post_seo_data( 'bctitle' ) ) ? '' : self::get_post_seo_data( 'bctitle' );
// If setting is changed then log alert.
if ( $old_breadcrumb !== $breadcrumb ) {
$editor_link = self::get_editor_link( self::$post_id );
Alert_Manager::trigger_event(
8850,
array(
'PostID' => self::$post->ID,
'PostType' => self::$post->post_type,
'PostTitle' => self::$post->post_title,
'PostStatus' => self::$post->post_status,
'PostDate' => self::$post->post_date,
'PostUrl' => get_permalink( self::$post->ID ),
'old_breadcrumb' => $old_breadcrumb,
'new_breadcrumb' => $breadcrumb,
$editor_link['name'] => $editor_link['value'],
)
);
}
}
/**
* Method: Check Schema Change.
*
* @param string $schema Changed Schema.
* @param string $type Page type.
*/
private static function check_schema_change( $schema, $type = 'page_type' ) {
// Get old title value.
$old_schema = ( 'page_type' === $type ) ? self::get_post_seo_data( 'schema_page_type' ) : self::get_post_seo_data( 'schema_article_type' );
// If setting is changed then log alert.
if ( $old_schema !== $schema ) {
$event_code = ( 'page_type' === $type ) ? 8851 : 8852;
$editor_link = self::get_editor_link( self::$post_id );
Alert_Manager::trigger_event(
$event_code,
array(
'PostID' => self::$post->ID,
'PostType' => self::$post->post_type,
'PostTitle' => self::$post->post_title,
'PostStatus' => self::$post->post_status,
'PostDate' => self::$post->post_date,
'PostUrl' => get_permalink( self::$post->ID ),
'old_type' => ( $old_schema ) ? self::$schema_labels[ $old_schema ] : esc_html__( 'Default', 'wp-security-audit-log' ),
'new_type' => ( $schema ) ? self::$schema_labels[ $schema ] : esc_html__( 'Default', 'wp-security-audit-log' ),
$editor_link['name'] => $editor_link['value'],
)
);
}
}
/**
* Method: Yoast default blog options change trigger.
* Notes:
* - To accomplish that, Yoast is taking the site, removes option (wpseo_ms) and sets the new one
*
* @see Yoast-Network-Admin::handle_restore_site_request
* - wp functions used do not triggering events @see WPSEO_Options::reset_ms_blog :
* - delete_blog_option, update_blog_option
* Logic used here is - if add_option_wpseo is triggered (this method is called only then), and global $_POST is set with valid 'site_id' value and 'ms_defaults_set' (in $value parameter) == true - we know which site has been preset with the default options
*
* @param string $option Option name.
* @param mixed $value Option old value.
*/
public static function yoast_blog_options_trigger( $option, $value ) {
$site_id = ( isset( $_POST['wpseo_ms'] ) && ! empty( $_POST['wpseo_ms']['site_id'] ) ) ? (int) $_POST['wpseo_ms']['site_id'] : 0; // phpcs:ignore WordPress.Security.NonceVerification.Missing
if ( $site_id && isset( $value['ms_defaults_set'] ) && true === $value['ms_defaults_set'] ) {
self::yoast_setting_change_alert( 'site-default-options-change', $site_id, '' );
}
}
/**
* Method: Yoast SEO options trigger.
*
* @param string $option Option name.
* @param mixed $old_value Option old value.
* @param mixed $new_value Option new value.
*/
public static function yoast_site_options_trigger( $option, $old_value, $new_value ) {
if ( 'wpseo_ms' === $option ) {
$prefix_network = 'network-';
$prefix_yoast = 'allow_';
$event_names = array(
'keyword_analysis_active', // SEO analysis.
'content_analysis_active', // Readability analysis.
'enable_cornerstone_content', // Cornerstone Content.
'enable_text_link_counter', // Text Link Counter.
'enable_xml_sitemap', // XML Sitemaps.
'enable_admin_bar_menu', // Admin bar menu.
'disableadvanced_meta', // Advanced settings for authors.
'tracking', // Usage tracking.
'enable_headless_rest_endpoints', // REST enpoint.
'enable_enhanced_slack_sharing', // Slack sharing.
);
foreach ( $event_names as $event_name ) {
$yoast_name = $prefix_yoast . $event_name; // Yoast event names - starting with active-[YoastEventName].
$wsal_name = $prefix_network . $event_name; // internal use name - network-[YoastEventName].
if ( isset( $old_value[ $yoast_name ] ) && isset( $new_value[ $yoast_name ] ) ) {
if ( $old_value[ $yoast_name ] !== $new_value[ $yoast_name ] ) {
$suffix = '-inactive';
if ( ! $new_value[ $yoast_name ] ) {
$suffix = '-active';
}
self::yoast_setting_switch_alert( $wsal_name . $suffix, $new_value[ $yoast_name ] );
}
}
}
if ( $old_value['access'] !== $new_value['access'] ) {
self::yoast_setting_change_alert( 'site-access-change', $old_value['access'], $new_value['access'] );
}
// We are aware the variables are being fed in backwards here, however this appears to be the only way.
// to get a reliable outcome. Issue https://github.com/WPWhiteSecurity/activity-log-yoast-seo/issues/63.
if ( $old_value['defaultblog'] !== $new_value['defaultblog'] ) {
self::yoast_setting_change_alert( 'site-default-seo-inherit-change', $new_value['defaultblog'], $old_value['defaultblog'] );
}
}
}
/**
* Method: Yoast SEO options trigger.
*
* @param string $option Option name.
* @param mixed $old_value Option old value.
* @param mixed $new_value Option new value.
*/
public static function yoast_options_trigger( $option, $old_value, $new_value ) {
// Detect the SEO option.
if ( 'wpseo_titles' === $option || 'wpseo' === $option || 'wpseo_social' === $option ) {
// WPSEO Title Alerts.
if ( 'wpseo_titles' === $option ) {
// Redirect attachment URLs to the attachment itself.
if ( $old_value['disable-attachment'] !== $new_value['disable-attachment'] ) {
self::yoast_setting_change_alert( 'disable-attachment', $old_value['disable-attachment'], $new_value['disable-attachment'] );
}
// Title Separator.
if ( $old_value['separator'] !== $new_value['separator'] ) {
self::yoast_setting_change_alert( 'separator', $old_value['separator'], $new_value['separator'] );
}
// Homepage Title.
if ( $old_value['title-home-wpseo'] !== $new_value['title-home-wpseo'] ) {
self::yoast_setting_change_alert( 'title-home-wpseo', $old_value['title-home-wpseo'], $new_value['title-home-wpseo'] );
}
// Homepage Meta Description.
if ( $old_value['metadesc-home-wpseo'] !== $new_value['metadesc-home-wpseo'] ) {
self::yoast_setting_change_alert( 'metadesc-home-wpseo', $old_value['metadesc-home-wpseo'], $new_value['metadesc-home-wpseo'] );
}
// Company or Person.
if ( $old_value['company_or_person'] !== $new_value['company_or_person'] ) {
self::yoast_setting_change_alert( 'company_or_person', $old_value['company_or_person'], $new_value['company_or_person'] );
}
// Author Archives.
if ( $old_value['disable-author'] !== $new_value['disable-author'] ) {
self::yoast_setting_switch_alert( 'disable-author', $new_value['disable-author'] );
}
if ( $old_value['noindex-author-wpseo'] !== $new_value['noindex-author-wpseo'] ) {
self::yoast_setting_switch_alert( 'noindex-author-wpseo', $new_value['noindex-author-wpseo'] );
}
if ( $old_value['title-author-wpseo'] !== $new_value['title-author-wpseo'] ) {
self::yoast_setting_change_alert( 'title-author-wpseo', $old_value['title-author-wpseo'], $new_value['title-author-wpseo'] );
}
if ( $old_value['metadesc-author-wpseo'] !== $new_value['metadesc-author-wpseo'] ) {
self::yoast_setting_change_alert( 'metadesc-author-wpseo', $old_value['metadesc-author-wpseo'], $new_value['metadesc-author-wpseo'] );
}
// Date Archives.
if ( $old_value['disable-date'] !== $new_value['disable-date'] ) {
self::yoast_setting_switch_alert( 'disable-date', $new_value['disable-date'] );
}
if ( $old_value['noindex-archive-wpseo'] !== $new_value['noindex-archive-wpseo'] ) {
self::yoast_setting_switch_alert( 'noindex-archive-wpseo', $new_value['noindex-archive-wpseo'] );
}
if ( $old_value['title-archive-wpseo'] !== $new_value['title-archive-wpseo'] ) {
self::yoast_setting_change_alert( 'title-archive-wpseo', $old_value['title-archive-wpseo'], $new_value['title-archive-wpseo'] );
}
if ( $old_value['metadesc-archive-wpseo'] !== $new_value['metadesc-archive-wpseo'] ) {
self::yoast_setting_change_alert( 'metadesc-archive-wpseo', $old_value['metadesc-archive-wpseo'], $new_value['metadesc-archive-wpseo'] );
}
$schemas = array(
'schema-page-type-post',
'schema-article-type-post',
'schema-page-type-page',
'schema-article-type-page',
'schema-page-type-attachment',
'schema-article-type-attachment',
);
foreach ( $schemas as $schema ) {
if ( $old_value[ $schema ] !== $new_value[ $schema ] ) {
self::yoast_setting_change_alert( $schema, $old_value[ $schema ], $new_value[ $schema ] );
}
}
// Get public post types.
$post_types = get_post_types( array( 'public' => true ) );
// For each post type check show, title, and description changes.
foreach ( $post_types as $type ) {
if ( isset( $old_value[ "noindex-$type" ] ) ) {
// Show Post Type in search results.
if ( $old_value[ "noindex-$type" ] !== $new_value[ "noindex-$type" ] ) {
self::yoast_setting_switch_alert( "noindex-$type", $new_value[ "noindex-$type" ] );
}
// Post Type Title Template.
if ( $old_value[ "title-$type" ] !== $new_value[ "title-$type" ] ) {
self::yoast_setting_change_alert( "title-$type", $old_value[ "title-$type" ], $new_value[ "title-$type" ] );
}
// Post Type Meta Description Template.
if ( $old_value[ "metadesc-$type" ] !== $new_value[ "metadesc-$type" ] ) {
self::yoast_setting_change_alert( "metadesc-$type", $old_value[ "metadesc-$type" ], $new_value[ "metadesc-$type" ] );
}
// Show Meta box.
if ( $old_value[ "display-metabox-pt-$type" ] !== $new_value[ "display-metabox-pt-$type" ] ) {
self::yoast_setting_switch_alert( "display-metabox-pt-$type", $new_value[ "display-metabox-pt-$type" ] );
}
}
}
// Get taxonomy types.
$taxonomy_types = get_taxonomies( array( 'public' => true ) );
// Lets check each and see if anything has been changes.
foreach ( $taxonomy_types as $type ) {
if ( isset( $old_value[ "noindex-tax-$type" ] ) ) {
// Show Post Type in search results.
if ( $old_value[ "noindex-tax-$type" ] !== $new_value[ "noindex-tax-$type" ] ) {
self::yoast_setting_switch_alert( "noindex-tax-$type", $new_value[ "noindex-tax-$type" ] );
}
// Post Type Title Template.
if ( $old_value[ "title-tax-$type" ] !== $new_value[ "title-tax-$type" ] ) {
self::yoast_setting_change_alert( "title-tax-$type", $old_value[ "title-tax-$type" ], $new_value[ "title-tax-$type" ] );
}
// Post Type Meta Description Template.
if ( $old_value[ "metadesc-tax-$type" ] !== $new_value[ "metadesc-tax-$type" ] ) {
self::yoast_setting_change_alert( "metadesc-tax-$type", $old_value[ "metadesc-tax-$type" ], $new_value[ "metadesc-tax-$type" ] );
}
// Show Meta box.
if ( $old_value[ "display-metabox-tax-$type" ] !== $new_value[ "display-metabox-tax-$type" ] ) {
self::yoast_setting_switch_alert( "display-metabox-tax-$type", $new_value[ "display-metabox-tax-$type" ] );
}
}
}
}
// Webmaster URL alerts.
if ( 'wpseo' === $option ) {
// SEO analysis.
if ( isset( $old_value['keyword_analysis_active'] ) && isset( $new_value['keyword_analysis_active'] ) ) {
if ( $old_value['keyword_analysis_active'] !== $new_value['keyword_analysis_active'] ) {
self::yoast_setting_switch_alert( 'keyword_analysis_active', $new_value['keyword_analysis_active'] );
}
}
// Readability analysis.
if ( isset( $old_value['content_analysis_active'] ) && isset( $new_value['content_analysis_active'] ) ) {
if ( $old_value['content_analysis_active'] !== $new_value['content_analysis_active'] ) {
self::yoast_setting_switch_alert( 'content_analysis_active', $new_value['content_analysis_active'] );
}
}
// Cornerstone Content.
if ( isset( $old_value['enable_cornerstone_content'] ) && isset( $new_value['enable_cornerstone_content'] ) ) {
if ( $old_value['enable_cornerstone_content'] !== $new_value['enable_cornerstone_content'] ) {
self::yoast_setting_switch_alert( 'enable_cornerstone_content', $new_value['enable_cornerstone_content'] );
}
}
// Text Link Counter.
if ( isset( $old_value['enable_text_link_counter'] ) && isset( $new_value['enable_text_link_counter'] ) ) {
if ( $old_value['enable_text_link_counter'] !== $new_value['enable_text_link_counter'] ) {
self::yoast_setting_switch_alert( 'enable_text_link_counter', $new_value['enable_text_link_counter'] );
}
}
// XML Sitemaps.
if ( isset( $old_value['enable_xml_sitemap'] ) && isset( $new_value['enable_xml_sitemap'] ) ) {
if ( $old_value['enable_xml_sitemap'] !== $new_value['enable_xml_sitemap'] ) {
self::yoast_setting_switch_alert( 'enable_xml_sitemap', $new_value['enable_xml_sitemap'] );
}
}
/**
* Ryte integration.
*
* NOTE: Reenamed in yoast plugin v13.2.
*
* @see: https://github.com/Yoast/wordpress-seo/pull/14123
*/
$integrations = array(
'semrush_integration_active',
'zapier_integration_active',
'algolia_integration_active',
'wincher_integration_active',
'ryte_indexability',
);
foreach ( $integrations as $integration ) {
if ( $old_value[ $integration ] !== $new_value[ $integration ] ) {
self::yoast_setting_switch_alert( $integration, $new_value[ $integration ] );
}
}
// Admin bar menu.
if ( isset( $old_value['enable_admin_bar_menu'] ) && isset( $new_value['enable_admin_bar_menu'] ) ) {
if ( $old_value['enable_admin_bar_menu'] !== $new_value['enable_admin_bar_menu'] ) {
self::yoast_setting_switch_alert( 'enable_admin_bar_menu', $new_value['enable_admin_bar_menu'] );
}
}
// Advanced settings for authors.
if ( isset( $old_value['disableadvanced_meta'] ) && isset( $new_value['disableadvanced_meta'] ) ) {
if ( $old_value['disableadvanced_meta'] !== $new_value['disableadvanced_meta'] ) {
self::yoast_setting_switch_alert( 'disableadvanced_meta', $new_value['disableadvanced_meta'] );
}
}
// Usage tracking.
if ( isset( $old_value['tracking'] ) && isset( $new_value['tracking'] ) ) {
if ( $old_value['tracking'] !== $new_value['tracking'] ) {
self::yoast_setting_switch_alert( 'tracking', $new_value['tracking'] );
}
}
// REST enpoint.
if ( isset( $old_value['enable_headless_rest_endpoints'] ) && isset( $new_value['enable_headless_rest_endpoints'] ) ) {
if ( $old_value['enable_headless_rest_endpoints'] !== $new_value['enable_headless_rest_endpoints'] ) {
self::yoast_setting_switch_alert( 'enable_headless_rest_endpoints', $new_value['enable_headless_rest_endpoints'] );
}
}
$search_engines = array(
'baiduverify',
'googleverify',
'msverify',
'yandexverify',
);
foreach ( $search_engines as $search_engine ) {
if ( $old_value[ $search_engine ] !== $new_value[ $search_engine ] ) {
self::yoast_setting_change_alert( $search_engine, $old_value[ $search_engine ], $new_value[ $search_engine ] );
}
}
}
// Social profile alerts.
if ( 'wpseo_social' === $option ) {
self::yoast_social_profile_setting_change_alert( $old_value, $new_value );
}
}
if ( 'wpseo-premium-redirects-export-plain' === $option ) {
self::yoast_redirects_change_alert( $option, $old_value, $new_value, 'plain' );
} elseif ( 'wpseo-premium-redirects-export-regex' === $option ) {
self::yoast_redirects_change_alert( $option, $old_value, $new_value, 'regex' );
} elseif ( 'wpseo_redirect' === $option ) {
self::yoast_redirects_system_change_alert( $option, $old_value, $new_value );
}
}
/**
* Trigger an alert for redirect changes.
*
* @param string $option - Current option being changes.
* @param array $old_value - Old value.
* @param array $new_value - new value.
* @return void
*/
private static function yoast_redirects_system_change_alert( $option, $old_value, $new_value ) {
$alert_code = 8858;
$alert_args = array(
'new_method' => ( 'off' === $new_value['disable_php_redirect'] ) ? esc_html__( 'PHP', 'wp-security-audit-log' ) : esc_html__( 'Web server', 'wp-security-audit-log' ),
'old_method' => ( 'off' === $old_value['disable_php_redirect'] ) ? esc_html__( 'PHP', 'wp-security-audit-log' ) : esc_html__( 'Web server', 'wp-security-audit-log' ),
);
Alert_Manager::trigger_event( $alert_code, $alert_args );
}
/**
* Monitor and alert for changes related to Yoast redirects (Premium only)
*
* @param string $option - Option being changed.
* @param array $old_value - Old value.
* @param array $new_value - New Value.
* @param string $redirect_type - Redirection type.
*
* @return void
*/
private static function yoast_redirects_change_alert( $option, $old_value, $new_value, $redirect_type = 'plain' ) {
$alert_args = null;
$alert_code = null;
$is_regex = ( 'regex' === $redirect_type ) ? true : false;
if ( count( $old_value ) !== count( $new_value ) ) {
$compare_added_items = array_diff_assoc(
array_map( 'serialize', $new_value ),
array_map( 'serialize', $old_value )
);
$added_items = array_map( 'unserialize', $compare_added_items );
$compare_removed_items = array_diff_assoc(
array_map( 'serialize', $old_value ),
array_map( 'serialize', $new_value )
);
$removed_items = array_map( 'unserialize', $compare_removed_items );
if ( ! empty( $added_items ) ) {
$alert_code = 8855;
$alert_args['old_url'] = key( $added_items );
$added_items = end( $added_items );
$alert_args['new_url'] = ( isset( $added_items['url'] ) && ! empty( $added_items['url'] ) ) ? $added_items['url'] : esc_html__( 'Not applicable', 'wp-security-audit-log' );
$alert_args['redirect_code'] = $added_items['type'];
$alert_args['redirect_type'] = ( $is_regex ) ? 'regex' : 'plain';
}
if ( ! empty( $removed_items ) ) {
$alert_code = 8857;
$alert_args['old_url'] = key( $removed_items );
$removed_items = end( $removed_items );
$alert_args['new_url'] = ( isset( $removed_items['url'] ) && ! empty( $added_items['url'] ) ) ? $removed_items['url'] : esc_html__( 'Not applicable', 'wp-security-audit-log' );
$alert_args['redirect_code'] = $removed_items['type'];
$alert_args['redirect_type'] = ( $is_regex ) ? 'regex' : 'plain';
}
}
if ( count( $old_value ) === count( $new_value ) ) {
$compare_modified_items = array_diff_assoc(
array_map( 'serialize', $new_value ),
array_map( 'serialize', $old_value )
);
$modified_items = array_map( 'unserialize', $compare_modified_items );
$compare_removed_items = array_diff_assoc(
array_map( 'serialize', $old_value ),
array_map( 'serialize', $new_value )
);
$removed_items = array_map( 'unserialize', $compare_removed_items );
if ( ! empty( $modified_items ) ) {
$alert_code = 8856;
$alert_args['redirect_type'] = ( $is_regex ) ? 'regex' : 'plain';
$alert_args['old_url'] = ( key( $removed_items ) !== key( $modified_items ) ) ? key( $removed_items ) : esc_html__( 'Not applicable', 'wp-security-audit-log' );
$alert_args['new_old_url'] = ( key( $modified_items ) !== key( $removed_items ) ) ? key( $modified_items ) : esc_html__( 'Not applicable', 'wp-security-audit-log' );
$modified_items = end( $modified_items );
$removed_items = end( $removed_items );
$alert_args['old_new_url'] = ( isset( $removed_items['url'] ) && ! empty( $removed_items['url'] ) && $modified_items['url'] !== $removed_items['url'] ) ? $removed_items['url'] : esc_html__( 'Not applicable', 'wp-security-audit-log' );
$alert_args['new_new_url'] = ( isset( $modified_items['url'] ) && ! empty( $added_items['url'] ) && $modified_items['url'] !== $removed_items['url'] ) ? $modified_items['url'] : esc_html__( 'Not applicable', 'wp-security-audit-log' );
$alert_args['new_redirect_code'] = ( $removed_items['type'] !== $modified_items['type'] ) ? $modified_items['type'] : esc_html__( 'Not applicable', 'wp-security-audit-log' );
$alert_args['old_redirect_code'] = ( $modified_items['type'] !== $removed_items['type'] ) ? $removed_items['type'] : esc_html__( 'Not applicable', 'wp-security-audit-log' );
}
}
if ( ! empty( $alert_code ) ) {
Alert_Manager::trigger_event( $alert_code, $alert_args );
}
}
/**
* Method: Trigger Yoast Setting Change Alerts.
*
* @param string $key Setting key.
* @param string $old_value Old setting value.
* @param string $new_value New setting value.
*/
private static function yoast_setting_change_alert( $key, $old_value, $new_value ) {
// Return if key is empty.
if ( empty( $key ) ) {
return;
}
// Return if both old and new values are empty.
if ( empty( $old_value ) && empty( $new_value ) ) {
return;
}
// Alert arguments.
$alert_args = array(
'old' => $old_value, // Old value.
'new' => $new_value, // New value.
);
// Find title-* in the key.
if ( false !== strpos( $key, 'title-' ) ) {
// Confirm if this is a taxonomy or not.
if ( false !== strpos( $key, 'title-tax-' ) ) {
$seo_post_type = self::create_tidy_name( $key );
// Set alert meta data.
$alert_args['SEOPostType'] = $seo_post_type;
} elseif ( false !== strpos( $key, 'title-author-' ) || false !== strpos( $key, 'title-archive-' ) ) {
$seo_post_type = self::create_tidy_name( $key );
// Set alert meta data.
$alert_args['archive_type'] = $seo_post_type;
} else {
$seo_post_type = self::create_tidy_name( $key );
$seo_post_type .= 's';
// Set alert meta data.
$alert_args['SEOPostType'] = $seo_post_type;
}
}
// Find metadesc-* in the key.
if ( false !== strpos( $key, 'metadesc-' ) ) {
// Confirm if this is a taxonomy or not.
if ( false !== strpos( $key, 'metadesc-tax-' ) ) {
$seo_post_type = self::create_tidy_name( $key );
// Set alert meta data.
$alert_args['SEOPostType'] = $seo_post_type;
} elseif ( false !== strpos( $key, 'metadesc-author-' ) || false !== strpos( $key, 'metadesc-archive-' ) ) {
$seo_post_type = self::create_tidy_name( $key );
$seo_post_type .= 's';
// Set alert meta data.
$alert_args['archive_type'] = $seo_post_type;
} else {
$seo_post_type = self::create_tidy_name( $key );
$seo_post_type .= 's';
// Set alert meta data.
$alert_args['SEOPostType'] = $seo_post_type;
}
}
// Set alert code to null initially.
$alert_code = null;
// Detect alert code for setting.
switch ( $key ) {
case 'separator':
$alert_code = 8809;
if ( class_exists( '\WPSEO_Option_Titles' ) ) {
$titles = \WPSEO_Option_Titles::get_instance();
$available_seperators = $titles->get_separator_options();
$alert_args['old'] = $available_seperators[ $alert_args['old'] ];
$alert_args['new'] = $available_seperators[ $alert_args['new'] ];
}
break;
case 'metadesc-archive-wpseo':
case 'metadesc-author-wpseo':
$alert_code = 8836;
break;
case 'company_or_person':
$alert_code = 8812;
$alert_args['old'] = ucwords( $alert_args['old'] );
$alert_args['new'] = ucwords( $alert_args['new'] );
break;
case strpos( $key, 'title-archive-' ):
case strpos( $key, 'title-author-' ):
$alert_code = 8835;
break;
case strpos( $key, 'title-tax-' ):
$alert_code = 8831;
break;
case strpos( $key, 'title-' ):
$alert_code = 8814;
break;
case strpos( $key, 'metadesc-tax-' ):
$alert_code = 8832;
$alert_args['old'] = ( ! empty( $alert_args['old'] ) ) ? $alert_args['old'] : esc_html__( 'Not provided', 'wp-security-audit-log' );
$alert_args['new'] = ( ! empty( $alert_args['new'] ) ) ? $alert_args['new'] : esc_html__( 'Not provided', 'wp-security-audit-log' );
break;
case strpos( $key, 'metadesc-' ):
$alert_code = 8822;
$alert_args['old'] = ( ! empty( $alert_args['old'] ) ) ? $alert_args['old'] : esc_html__( 'Not provided', 'wp-security-audit-log' );
$alert_args['new'] = ( ! empty( $alert_args['new'] ) ) ? $alert_args['new'] : esc_html__( 'Not provided', 'wp-security-audit-log' );
break;
case 'disable-attachment':
$alert_code = 8826;
$alert_args['EventType'] = $new_value ? 'enabled' : 'disabled';
break;
case 'site-access-change':
$alert_code = 8838;
$alert_args['old'] = ucwords( $alert_args['old'] );
$alert_args['new'] = ucwords( $alert_args['new'] );
break;
case 'site-default-seo-inherit-change':
$alert_code = 8839;
$alert_args['old'] = ( ! empty( $alert_args['old'] ) ) ? get_blog_details( $alert_args['old'] )->blogname : esc_html__( 'None', 'wp-security-audit-log' );
$alert_args['new'] = ( ! empty( $alert_args['new'] ) ) ? get_blog_details( $alert_args['new'] )->blogname : esc_html__( 'None', 'wp-security-audit-log' );
break;
case 'site-default-options-change':
$alert_code = 8840;
$alert_args['old'] = get_blog_details( $alert_args['old'] )->blogname . ' / ' . $alert_args['old'];
$alert_args['new'] = '';
break;
case 'baiduverify':
case 'googleverify':
case 'msverify':
case 'yandexverify':
$alert_code = 8841;
$alert_args['search_engine_type'] = ucwords( str_replace( 'verify', '', $key ) );
if ( empty( $alert_args['old'] ) && ! empty( $alert_args['new'] ) ) {
$event_type = 'added';
} elseif ( empty( $alert_args['new'] ) && ! empty( $alert_args['old'] ) ) {
$event_type = 'removed';
} else {
$event_type = 'modified';
}
$alert_args['EventType'] = $event_type;
$alert_args['old'] = ( empty( $alert_args['old'] ) ) ? esc_html__( 'Not provided', 'wp-security-audit-log' ) : $alert_args['old'];
$alert_args['new'] = ( empty( $alert_args['new'] ) ) ? esc_html__( 'Not provided', 'wp-security-audit-log' ) : $alert_args['new'];
break;
case 'schema-page-type-post':
case 'schema-page-type-page':
case 'schema-page-type-attachment':
$alert_code = 8853;
$alert_args['SEOPostType'] = ucwords( str_replace( 'schema-page-type-', '', $key ) );
$alert_args['old_type'] = ( $alert_args['old'] ) ? self::$schema_labels[ $alert_args['old'] ] : esc_html__( 'Default', 'wp-security-audit-log' );
$alert_args['new_type'] = ( $alert_args['new'] ) ? self::$schema_labels[ $alert_args['new'] ] : esc_html__( 'Default', 'wp-security-audit-log' );
break;
case 'schema-article-type-page':
case 'schema-article-type-post':
case 'schema-article-type-attachment':
$alert_code = 8854;
$alert_args['SEOPostType'] = ucwords( str_replace( 'schema-article-type-', '', $key ) );
$alert_args['old_type'] = ( $alert_args['old'] ) ? self::$schema_labels[ $alert_args['old'] ] : esc_html__( 'Default', 'wp-security-audit-log' );
$alert_args['new_type'] = ( $alert_args['new'] ) ? self::$schema_labels[ $alert_args['new'] ] : esc_html__( 'Default', 'wp-security-audit-log' );
break;
default:
break;
}
// Trigger the alert.
if ( ! empty( $alert_code ) ) {
Alert_Manager::trigger_event( $alert_code, $alert_args );
}
}
/**
* Method: Trigger Yoast Enable/Disable Setting Alerts.
*
* @param string $key <20><><EFBFBD> Setting index to alert.
* @param mixed $new_value Setting new value.
*/
private static function yoast_setting_switch_alert( $key, $new_value ) {
// If key is empty, then return.
if ( empty( $key ) ) {
return;
}
// Check and set status.
$status = (int) $new_value;
// Alert arguments.
$alert_args = array();
// Find noindex-* in the key.
if ( false !== strpos( $key, 'noindex-' ) ) {
// Check if its a taxonomy setting.
if ( false !== strpos( $key, 'noindex-tax-' ) ) {
$seo_post_type = self::create_tidy_name( $key );
// Set alert meta data.
$alert_args['SEOPostType'] = $seo_post_type;
$status = 1 === $status ? 0 : 1;
} else {
$seo_post_type = self::create_tidy_name( $key );
// Set alert meta data.
$alert_args['SEOPostType'] = $seo_post_type;
$status = 1 === $status ? 0 : 1;
}
}
// Find display-metabox-pt-* in the key.
if ( false !== strpos( $key, 'display-metabox-tax-' ) ) {
$seo_post_type = self::create_tidy_name( $key );
// Set alert meta data.
$alert_args['SEOPostType'] = $seo_post_type;
} else {
$seo_post_type = self::create_tidy_name( $key );
// Set alert meta data.
$alert_args['SEOPostType'] = $seo_post_type;
}
$alert_args['EventType'] = 1 === $status ? 'enabled' : 'disabled';
// Find network-* in the key.
if ( false !== strpos( $key, 'network-' ) ) {
$event_key = substr( $key, strpos( $key, '-' ) + 1 );
$event_key = substr( $event_key, 0, strrpos( $event_key, '-' ) );
switch ( $event_key ) {
default:
case 'keyword_analysis_active':
$feature_name = esc_html__( 'SEO Analysis', 'wp-security-audit-log' );
break;
case 'content_analysis_active':
$feature_name = esc_html__( 'Readability Analysis', 'wp-security-audit-log' );
break;
case 'enable_cornerstone_content':
$feature_name = esc_html__( 'Cornerstone content', 'wp-security-audit-log' );
break;
case 'enable_text_link_counter':
$feature_name = esc_html__( 'Text link counter', 'wp-security-audit-log' );
break;
case 'enable_xml_sitemap':
$feature_name = esc_html__( 'XML sitemap', 'wp-security-audit-log' );
break;
case 'enable_admin_bar_menu':
$feature_name = esc_html__( 'Admin bar menu', 'wp-security-audit-log' );
break;
case 'disableadvanced_meta':
$feature_name = esc_html__( 'Security: advanced or schema settings for authors', 'wp-security-audit-log' );
break;
case 'tracking':
$feature_name = esc_html__( 'Usage tracking', 'wp-security-audit-log' );
break;
case 'enable_headless_rest_endpoints':
$feature_name = esc_html__( 'REST API: Head endpoint', 'wp-security-audit-log' );
break;
case 'enable_enhanced_slack_sharing':
$feature_name = esc_html__( 'Slack sharing', 'wp-security-audit-log' );
break;
}
// Set alert meta data.
$alert_args['feature_name'] = $feature_name;
$alert_args['EventType'] = 1 === $status ? 'disabled' : 'enabled';
}
// Set alert code to NULL initially.
$alert_code = null;
// Add switch case to set the alert code.
switch ( $key ) {
case 'noindex-author-wpseo':
case 'noindex-archive-wpseo':
$alert_code = 8834;
$archive_type = self::create_tidy_name( $key );
// If this is the "date archive" setting, update archive type to something more descriptive.
if ( 'Archive' === $archive_type ) {
$archive_type = esc_html__( 'Date', 'wp-security-audit-log' );
}
// Set alert meta data.
$alert_args['archive_type'] = $archive_type;
break;
case strpos( $key, 'noindex-tax-' ):
$alert_code = 8830;
break;
case strpos( $key, 'noindex-' ):
$alert_code = 8813;
break;
case 'keyword_analysis_active':
$alert_code = 8815;
break;
case 'content_analysis_active':
$alert_code = 8816;
break;
case 'enable_cornerstone_content':
$alert_code = 8817;
break;
case 'enable_text_link_counter':
$alert_code = 8818;
break;
case 'enable_xml_sitemap':
$alert_code = 8819;
break;
case ( false !== strpos( $key, 'network-' ) && false !== strpos( $key, '-inactive' ) ):
$alert_code = 8842;
break;
case ( false !== strpos( $key, 'network-' ) && false !== strpos( $key, '-active' ) ):
$alert_code = 8843;
break;
// renamed to ryte_integration. see: https://github.com/Yoast/wordpress-seo/pull/14123.
case 'onpage_indexability':
case 'ryte_indexability':
$alert_code = 8820;
$alert_args['type'] = ucfirst( str_replace( '_indexability', '', $key ) );
break;
case 'semrush_integration_active':
case 'zapier_integration_active':
case 'algolia_integration_active':
case 'wincher_integration_active':
$alert_code = 8820;
$alert_args['type'] = ucfirst( str_replace( '_integration_active', '', $key ) );
break;
case 'enable_admin_bar_menu':
$alert_code = 8821;
break;
case strpos( $key, 'display-metabox-pt-' ):
$alert_code = 8824;
break;
case strpos( $key, 'display-metabox-tax-' ):
$alert_code = 8837;
// Avoid false reporting for post_format metabox.
if ( 'display-metabox-tax-post_format' === $key ) {
$alert_code = null;
}
break;
case strpos( $key, 'disableadvanced_meta' ):
$alert_code = 8825;
break;
case strpos( $key, 'tracking' ):
$alert_code = 8827;
break;
case strpos( $key, 'enable_headless_rest_endpoints' ):
$alert_code = 8828;
break;
case 'disable-author':
case 'disable-date':
$alert_code = 8833;
$archive_type = str_replace( 'disable-', '', $key );
$archive_type = ucfirst( $archive_type );
// Set alert meta data.
$alert_args['archive_type'] = $archive_type;
// Reverse logic for enabled/disabled.
$alert_args['EventType'] = $new_value ? 'disabled' : 'enabled';
break;
default:
break;
}
// Trigger the alert.
if ( ! empty( $alert_code ) ) {
Alert_Manager::trigger_event( $alert_code, $alert_args );
}
}
/**
* Method: Trigger Yoast Social profile settings alerts.
*
* @param mixed $old_value Setting old value.
* @param mixed $new_value Setting new value.
*/
private static function yoast_social_profile_setting_change_alert( $old_value, $new_value ) {
// Array of keys we want to look for.
$profiles_to_monitor = array(
'facebook_site',
'instagram_url',
'linkedin_url',
'pinterest_url',
'twitter_site',
'youtube_url',
'wikipedia_url',
);
foreach ( $old_value as $social_profile => $value ) {
if ( in_array( $social_profile, $profiles_to_monitor, true ) && $old_value[ $social_profile ] !== $new_value[ $social_profile ] ) {
$alert_code = 8829;
$event_type = self::determine_social_event_type( $old_value[ $social_profile ], $new_value[ $social_profile ] );
$alert_args = array(
'social_profile' => ucwords( substr( $social_profile, 0, strpos( $social_profile, '_' ) ) ),
'old_url' => empty( $old_value[ $social_profile ] ) ? ' ' : $old_value[ $social_profile ], // The empty string is intentional.
'new_url' => empty( $new_value[ $social_profile ] ) ? ' ' : $new_value[ $social_profile ], // The empty string is intentional.
'EventType' => $event_type,
);
Alert_Manager::trigger_event( $alert_code, $alert_args );
}
}
// Facebook social settings.
if ( $new_value['opengraph'] !== $old_value['opengraph'] ) {
$alert_code = 8844;
$alert_args = array(
'EventType' => ( ! $new_value['opengraph'] ) ? 'disabled' : 'enabled',
);
Alert_Manager::trigger_event( $alert_code, $alert_args );
}
if ( $new_value['og_default_image'] !== $old_value['og_default_image'] ) {
$alert_code = 8845;
$alert_args = array(
'image_name' => ( empty( $new_value['og_default_image_id'] ) ) ? esc_html__( 'None supplied', 'wsal-yoast' ) : wp_basename( $new_value['og_default_image'] ),
'image_path' => ( empty( $new_value['og_default_image'] ) ) ? esc_html__( 'None supplied', 'wsal-yoast' ) : dirname( $new_value['og_default_image'] ),
'old_image' => ( empty( $old_value['og_default_image'] ) ) ? esc_html__( 'None supplied', 'wsal-yoast' ) : wp_basename( $old_value['og_default_image'] ),
'old_path' => ( empty( $old_value['og_default_image'] ) ) ? esc_html__( 'None supplied', 'wsal-yoast' ) : dirname( $old_value['og_default_image'] ),
);
Alert_Manager::trigger_event( $alert_code, $alert_args );
}
if ( $new_value['twitter'] !== $old_value['twitter'] ) {
$alert_code = 8846;
$alert_args = array(
'EventType' => ( ! $new_value['twitter'] ) ? 'disabled' : 'enabled',
);
Alert_Manager::trigger_event( $alert_code, $alert_args );
}
if ( $new_value['twitter_card_type'] !== $old_value['twitter_card_type'] ) {
$alert_code = 8847;
$alert_args = array(
'new_setting' => $new_value['twitter_card_type'],
'old_setting' => $old_value['twitter_card_type'],
);
Alert_Manager::trigger_event( $alert_code, $alert_args );
}
if ( $new_value['pinterestverify'] !== $old_value['pinterestverify'] ) {
$alert_code = 8848;
$alert_args = array(
'new_value' => ( empty( $new_value['pinterestverify'] ) ) ? esc_html__( 'None supplied', 'wsal-yoast' ) : $new_value['pinterestverify'],
'old_value' => ( empty( $old_value['pinterestverify'] ) ) ? esc_html__( 'None supplied', 'wsal-yoast' ) : $old_value['pinterestverify'],
);
Alert_Manager::trigger_event( $alert_code, $alert_args );
}
}
/**
* Helper function to check if a profile was added, removed or modified.
*
* @param string $old_value Old profile value.
* @param string $new_value New profile value.
* @return string Our determination of whats happened
*/
private static function determine_social_event_type( $old_value, $new_value ) {
if ( ! empty( $old_value ) && empty( $new_value ) ) {
return 'removed';
} elseif ( empty( $old_value ) && ! empty( $new_value ) ) {
return 'added';
} else {
return 'modified';
}
}
/**
* Helper function to strip a string of any unwanted compontent.
*
* @param string $text_to_strip String we want to work on.
* @return string $tidied_text The actual string we want.
*/
private static function create_tidy_name( $text_to_strip ) {
$tidied_text = null;
// Array of string we want to look for.
$strings_to_remove = array(
'title-',
'tax-',
'-wpseo',
'metadesc-',
'noindex-',
'display-',
'metabox-',
'pt-',
'disable-',
);
if ( ! empty( $text_to_strip ) ) {
$tidied_text = str_replace( $strings_to_remove, '', $text_to_strip );
$tidied_text = ucfirst( $tidied_text );
// If this is the "date archive" setting, update archive type to something more descriptive.
if ( 'Archive' === $tidied_text ) {
$tidied_text = esc_html__( 'Date', 'wp-security-audit-log' );
}
// If left unchanged, the alert reads "Categorys". The 's' is missing as its added later.
if ( 'Category' === $tidied_text ) {
$tidied_text = esc_html__( 'Categories', 'wp-security-audit-log' );
}
return $tidied_text;
}
}
}
}