You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

190 lines
5.4 KiB

<?php
/**
* WPSEO plugin file.
*
* @package WPSEO\Admin\Notifiers
*/
/**
* Represents the logic for showing the post type archive notification.
*/
class WPSEO_Post_Type_Archive_Notification_Handler extends WPSEO_Dismissible_Notification {
/**
* Defaults for the title option.
*
* @var array
*/
protected $option_defaults = array();
/**
* Sets the notification identifier.
*
* @codeCoverageIgnore
*
* @return void
*/
public function __construct() {
$this->notification_identifier = 'post-type-archive-notification';
}
/**
* Checks if the notice should be shown.
*
* @return bool True when applicable.
*/
protected function is_applicable() {
if ( $this->is_notice_dismissed() ) {
return false;
}
if ( $this->is_new_install() ) {
return false;
}
return $this->get_post_types() !== array();
}
/**
* Returns the notification.
*
* @return Yoast_Notification The notification for the notification center.
*
* @codeCoverageIgnore
*/
protected function get_notification() {
$post_types = $this->get_post_types();
$message = esc_html__(
'We\'ve recently improved the functionality of the Search Appearance settings. Unfortunately, we\'ve discovered that for some edge-cases, saving the settings for specific post type archives might have gone wrong.',
'wordpress-seo'
);
$message .= PHP_EOL . PHP_EOL;
$message .= sprintf(
/* translators: %1$s is the archive template link start tag, %2$s is the link closing tag, %3$s is a comma separated string with content types. */
_n(
'Please check the %1$sarchive template%2$s for the following content type: %3$s.',
'Please check the %1$sarchive templates%2$s for the following content types: %3$s.',
count( $post_types ),
'wordpress-seo'
),
'<a href="' . esc_url( admin_url( 'admin.php?page=wpseo_titles#top#post-types' ) ) . '">',
'</a>',
implode( ', ', $post_types )
);
$message .= PHP_EOL . PHP_EOL;
$message .= '<a class="button" href="' . admin_url( '?page=' . WPSEO_Admin::PAGE_IDENTIFIER . '&yoast_dismiss=' . $this->notification_identifier ) . '">' . __( 'Remove this message', 'wordpress-seo' ) . '</a>';
$notification_options = array(
'type' => Yoast_Notification::WARNING,
'id' => 'wpseo-' . $this->notification_identifier,
'priority' => 1.0,
'capabilities' => 'wpseo_manage_options',
);
return new Yoast_Notification( $message, $notification_options );
}
/**
* Checks if the first activation is done before the release of 7.9.
*
* @return bool True when the install is 'new'.
*
* @codeCoverageIgnore
*/
protected function is_new_install() {
return WPSEO_Options::get( 'first_activated_on' ) >= strtotime( '2018-07-24' );
}
/**
* Returns all the post types which might have wrong archive settings.
*
* @return array The post types.
*
* @codeCoverageIgnore
*/
protected function get_post_types() {
static $post_types;
if ( $post_types === null ) {
$this->option_defaults = WPSEO_Option_Titles::get_instance()->get_defaults();
$post_types = get_post_types( array( 'public' => true ) );
$post_types = WPSEO_Post_Type::filter_attachment_post_type( $post_types );
$post_types = $this->filter_woocommerce_product_type( $post_types );
$post_types = array_filter( $post_types, array( $this, 'has_custom_archive_slug' ) );
$post_types = array_filter( $post_types, array( $this, 'has_default_templates_set' ) );
}
return $post_types;
}
/**
* Filters the WooCommerce product, when Woocommerce is active.
*
* @param array $post_types The post types to filter.
*
* @return array The filtere post types.
*
* @codeCoverageIgnore
*/
protected function filter_woocommerce_product_type( $post_types ) {
if ( WPSEO_Utils::is_woocommerce_active() ) {
unset( $post_types['product'] );
}
return $post_types;
}
/**
* Checks if the archive slug for the post type is overridden.
*
* @param string $post_type_name The post type's name.
*
* @return bool True when the archive slug is overridden.
*
* @codeCoverageIgnore
*/
protected function has_custom_archive_slug( $post_type_name ) {
$post_type = get_post_type_object( $post_type_name );
if ( $post_type === null || ! WPSEO_Post_Type::has_archive( $post_type ) ) {
return false;
}
// When the archive value is not TRUE it will be a custom archive slug.
return ( $post_type->has_archive !== true );
}
/**
* Checks if the default templates are set for given post type.
*
* @param string $post_type_name The post type name.
*
* @return bool True when the default templates are set.
*
* @codeCoverageIgnore
*/
protected function has_default_templates_set( $post_type_name ) {
$title_option_name = 'title-ptarchive-' . $post_type_name;
$metadesc_option_name = 'metadesc-ptarchive-' . $post_type_name;
return ( $this->is_equal_to_default( $title_option_name ) && $this->is_equal_to_default( $metadesc_option_name ) );
}
/**
* Checks if value for given option name is equal to the default value.
*
* @param string $option_name The option name to check.
*
* @return bool True when the option value is equal to the default value.
*
* @codeCoverageIgnore
*/
protected function is_equal_to_default( $option_name ) {
if ( ! isset( $this->option_defaults[ $option_name ] ) ) {
return false;
}
return ( WPSEO_Options::get( $option_name ) === $this->option_defaults[ $option_name ] );
}
}