diff options
Diffstat (limited to 'plugins/jetpack/modules/seo-tools')
5 files changed, 4 insertions, 734 deletions
diff --git a/plugins/jetpack/modules/seo-tools/class-jetpack-seo-utils.php b/plugins/jetpack/modules/seo-tools/class-jetpack-seo-utils.php index c6d8c294..008d3a44 100644 --- a/plugins/jetpack/modules/seo-tools/class-jetpack-seo-utils.php +++ b/plugins/jetpack/modules/seo-tools/class-jetpack-seo-utils.php @@ -23,11 +23,9 @@ class Jetpack_SEO_Utils { /** * Used to check whether SEO tools are enabled for given site. * - * @param int $site_id Optional. Defaults to current blog id if not given. - * * @return bool True if SEO tools are enabled, false otherwise. */ - public static function is_enabled_jetpack_seo( $site_id = 0 ) { + public static function is_enabled_jetpack_seo() { /** * Can be used by SEO plugin authors to disable the conflicting output of SEO Tools. * @@ -41,13 +39,9 @@ class Jetpack_SEO_Utils { return false; } - if ( function_exists( 'has_any_blog_stickers' ) ) { - // For WPCOM simple sites. - if ( empty( $site_id ) ) { - $site_id = get_current_blog_id(); - } - - return has_any_blog_stickers( array( 'business-plan', 'ecommerce-plan' ), $site_id ); + // For WPcom simple sites. + if ( defined( 'IS_WPCOM' ) && IS_WPCOM && method_exists( 'Jetpack_Plan', 'supports' ) ) { + return Jetpack_Plan::supports( 'advanced-seo' ); } // For all Jetpack sites. diff --git a/plugins/jetpack/modules/seo-tools/jetpack-seo-posts.php b/plugins/jetpack/modules/seo-tools/jetpack-seo-posts.php deleted file mode 100644 index 82c9b0a5..00000000 --- a/plugins/jetpack/modules/seo-tools/jetpack-seo-posts.php +++ /dev/null @@ -1,91 +0,0 @@ -<?php - -/** - * Class containing utility static methods for managing SEO custom descriptions for Posts and Pages. - */ -class Jetpack_SEO_Posts { - /** - * Key of the post meta value that will be used to store post custom description. - */ - const DESCRIPTION_META_KEY = 'advanced_seo_description'; - - /** - * Build meta description for post SEO. - * - * @param WP_Post $post Source of data for custom description. - * - * @return string Post description or empty string. - */ - public static function get_post_description( $post ) { - if ( empty( $post ) ) { - return ''; - } - - if ( post_password_required() || ! is_singular() ) { - return ''; - } - - // Business users can overwrite the description - $custom_description = self::get_post_custom_description( $post ); - - if ( ! empty( $custom_description ) ) { - return $custom_description; - } - - if ( ! empty( $post->post_excerpt ) ) { - return $post->post_excerpt; - } - - return $post->post_content; - } - - /** - * Returns post's custom meta description if it is set, and if - * SEO tools are enabled for current blog. - * - * @param WP_Post $post Source of data for custom description - * - * @return string Custom description or empty string - */ - public static function get_post_custom_description( $post ) { - if ( empty( $post ) ) { - return ''; - } - - $custom_description = get_post_meta( $post->ID, self::DESCRIPTION_META_KEY, true ); - - if ( empty( $custom_description ) || ! Jetpack_SEO_Utils::is_enabled_jetpack_seo() ) { - return ''; - } - - return $custom_description; - } - - /** - * Registers the self::DESCRIPTION_META_KEY post_meta for use in the REST API. - */ - public static function register_post_meta() { - $args = array( - 'type' => 'string', - 'description' => __( 'Custom post description to be used in HTML <meta /> tag.', 'jetpack' ), - 'single' => true, - 'default' => '', - 'show_in_rest' => array( - 'name' => self::DESCRIPTION_META_KEY - ), - ); - - register_meta( 'post', self::DESCRIPTION_META_KEY, $args ); - } - - /** - * Register the Advanced SEO Gutenberg extension - */ - public static function register_gutenberg_extension() { - if ( Jetpack_SEO_Utils::is_enabled_jetpack_seo() ) { - Jetpack_Gutenberg::set_extension_available( 'jetpack-seo' ); - } else { - Jetpack_Gutenberg::set_extension_unavailable( 'jetpack-seo', 'jetpack_seo_disabled' ); - } - } -} diff --git a/plugins/jetpack/modules/seo-tools/jetpack-seo-titles.php b/plugins/jetpack/modules/seo-tools/jetpack-seo-titles.php deleted file mode 100644 index a7c2758d..00000000 --- a/plugins/jetpack/modules/seo-tools/jetpack-seo-titles.php +++ /dev/null @@ -1,301 +0,0 @@ -<?php - -/* - * Each title format is an array of arrays containing two values: - * - type - * - value - * - * Possible values for type are: 'token' and 'string'. - * Possible values for 'value' are: any string in case that 'type' is set - * to 'string', or allowed token values for page type in case that 'type' - * is set to 'token'. - * - * Examples of valid formats: - * - * [ - * 'front_page' => [ - * [ 'type' => 'string', 'value' => 'Front page title and site name:'], - * [ 'type' => 'token', 'value' => 'site_name'] - * ], - * 'posts' => [ - * [ 'type' => 'token', 'value' => 'site_name' ], - * [ 'type' => 'string', 'value' => ' | ' ], - * [ 'type' => 'token', 'value' => 'post_title' ] - * ], - * 'pages' => [], - * 'groups' => [], - * 'archives' => [] - * ] - * Custom title for given page type is created by concatenating all of the array 'value' parts. - * Tokens are replaced with their corresponding values for current site. - * Empty array signals that we are not overriding the default title for particular page type. - */ - -/** - * Class containing utility static methods for managing SEO custom title formats. - */ -class Jetpack_SEO_Titles { - /** - * Site option name used to store custom title formats. - */ - const TITLE_FORMATS_OPTION = 'advanced_seo_title_formats'; - - /** - * Retrieves custom title formats from site option. - * - * @return array Array of custom title formats, or empty array. - */ - public static function get_custom_title_formats() { - if( Jetpack_SEO_Utils::is_enabled_jetpack_seo() ) { - return get_option( self::TITLE_FORMATS_OPTION, array() ); - } - - return array(); - } - - /** - * Returns tokens that are currently supported for each page type. - * - * @return array Array of allowed token strings. - */ - public static function get_allowed_tokens() { - return array( - 'front_page' => array( 'site_name', 'tagline' ), - 'posts' => array( 'site_name', 'tagline', 'post_title' ), - 'pages' => array( 'site_name', 'tagline', 'page_title' ), - 'groups' => array( 'site_name', 'tagline', 'group_title' ), - 'archives' => array( 'site_name', 'tagline', 'date' ), - ); - } - - /** - * Used to modify the default title with custom SEO title. - * - * @param string $default_title Default title for current page. - * - * @return string Custom title with replaced tokens or default title. - */ - public static function get_custom_title( $default_title = '' ) { - // Don't filter title for unsupported themes. - if ( self::is_conflicted_theme() ) { - return $default_title; - } - - $page_type = self::get_page_type(); - - // Keep default title if invalid page type is supplied. - if ( empty( $page_type ) ) { - return $default_title; - } - - $title_formats = self::get_custom_title_formats(); - - // Keep default title if user has not defined custom title for this page type. - if ( empty( $title_formats[ $page_type ] ) ) { - return $default_title; - } - - if ( ! Jetpack_SEO_Utils::is_enabled_jetpack_seo() ) { - return $default_title; - } - - $custom_title = ''; - $format_array = $title_formats[ $page_type ]; - - foreach ( $format_array as $item ) { - if ( 'token' == $item['type'] ) { - $custom_title .= self::get_token_value( $item['value'] ); - } else { - $custom_title .= $item['value']; - } - } - - return esc_html( $custom_title ); - } - - /** - * Returns string value for given token. - * - * @param string $token_name The token name value that should be replaced. - * - * @return string Token replacement for current site, or empty string for unknown token name. - */ - public static function get_token_value( $token_name ) { - - switch ( $token_name ) { - case 'site_name': - return get_bloginfo( 'name' ); - - case 'tagline': - return get_bloginfo( 'description' ); - - case 'post_title': - case 'page_title': - return the_title_attribute( array( 'echo' => false ) ); - - case 'group_title': - return single_tag_title( '', false ); - - case 'date': - return self::get_date_for_title(); - - default: - return ''; - } - } - - /** - * Returns page type for current page. We need this helper in order to determine what - * user defined title format should be used for custom title. - * - * @return string|bool Type of current page or false if unsupported. - */ - public static function get_page_type() { - - if ( is_front_page() ) { - return 'front_page'; - } - - if ( is_category() || is_tag() || is_tax() ) { - return 'groups'; - } - - if ( is_archive() && ! is_author() ) { - return 'archives'; - } - - if ( is_page() ) { - return 'pages'; - } - - if ( is_singular() ) { - return 'posts'; - } - - return false; - } - - /** - * Returns the value that should be used as a replacement for the date token, - * depending on the archive path specified. - * - * @return string Token replacement for a given date, or empty string if no date is specified. - */ - public static function get_date_for_title() { - // If archive year, month, and day are specified. - if ( is_day() ) { - return get_the_date(); - } - - // If archive year, and month are specified. - if ( is_month() ) { - return trim( single_month_title( ' ', false ) ); - } - - // Only archive year is specified. - if ( is_year() ) { - return get_query_var( 'year' ); - } - - return ''; - } - - /** - * Checks if current theme is defining custom title that won't work nicely - * with our custom SEO title override. - * - * @return bool True if current theme sets custom title, false otherwise. - */ - public static function is_conflicted_theme() { - /** - * Can be used to specify a list of themes that use their own custom title format. - * - * If current site is using one of the themes listed as conflicting, - * Jetpack SEO custom title formats will be disabled. - * - * @module seo-tools - * - * @since 4.4.0 - * - * @param array List of conflicted theme names. Defaults to empty array. - */ - $conflicted_themes = apply_filters( 'jetpack_seo_custom_title_conflicted_themes', array() ); - - return isset( $conflicted_themes[ get_option( 'template' ) ] ); - } - - /** - * Checks if a given format conforms to predefined SEO title templates. - * - * Every format type and token must be whitelisted. - * @see get_allowed_tokens() - * - * @param array $title_formats Template of SEO title to check. - * - * @return bool True if the formats are valid, false otherwise. - */ - public static function are_valid_title_formats( $title_formats ) { - $allowed_tokens = self::get_allowed_tokens(); - - if ( ! is_array( $title_formats ) ) { - return false; - } - - foreach ( $title_formats as $format_type => $format_array ) { - if ( ! in_array( $format_type, array_keys( $allowed_tokens ) ) ) { - return false; - } - - if ( '' === $format_array ) { - continue; - } - - if ( ! is_array( $format_array ) ) { - return false; - } - - foreach ( $format_array as $item ) { - if ( empty( $item['type'] ) || empty( $item['value'] ) ) { - return false; - } - - if ( 'token' == $item['type'] ) { - if ( ! in_array( $item['value'], $allowed_tokens[ $format_type ] ) ) { - return false; - } - } - } - } - - return true; - } - - /** - * Combines the previous values of title formats, stored as array in site options, - * with the new values that are provided. - * - * @param array $new_formats Array containing new title formats. - * - * @return array $result Array of updated title formats, or empty array if no update was performed. - */ - public static function update_title_formats( $new_formats ) { - // Empty array signals that custom title shouldn't be used. - $empty_formats = array( - 'front_page' => array(), - 'posts' => array(), - 'pages' => array(), - 'groups' => array(), - 'archives' => array(), - ); - - $previous_formats = self::get_custom_title_formats(); - - $result = array_merge( $empty_formats, $previous_formats, $new_formats ); - - if ( update_option( self::TITLE_FORMATS_OPTION, $result ) ) { - return $result; - } - - return array(); - } -} diff --git a/plugins/jetpack/modules/seo-tools/jetpack-seo-utils.php b/plugins/jetpack/modules/seo-tools/jetpack-seo-utils.php deleted file mode 100644 index b7e4362a..00000000 --- a/plugins/jetpack/modules/seo-tools/jetpack-seo-utils.php +++ /dev/null @@ -1,126 +0,0 @@ -<?php - -/** - * Class containing utility static methods that other SEO tools are relying on. - */ -class Jetpack_SEO_Utils { - /** - * Site option name used to store front page meta description. - */ - const FRONT_PAGE_META_OPTION = 'advanced_seo_front_page_description'; - - /** - * Old version of option name that was previously used under Free plan. - */ - const GRANDFATHERED_META_OPTION = 'seo_meta_description'; - - /** - * Used to check whether SEO tools are enabled for given site. - * - * @param int $site_id Optional. Defaults to current blog id if not given. - * - * @return bool True if SEO tools are enabled, false otherwise. - */ - public static function is_enabled_jetpack_seo( $site_id = 0 ) { - /** - * Can be used by SEO plugin authors to disable the conflicting output of SEO Tools. - * - * @module seo-tools - * - * @since 5.0.0 - * - * @param bool True if SEO Tools should be disabled, false otherwise. - */ - if ( apply_filters( 'jetpack_disable_seo_tools', false ) ) { - return false; - } - - if ( function_exists( 'has_any_blog_stickers' ) ) { - // For WPCOM sites - if ( empty( $site_id ) ) { - $site_id = get_current_blog_id(); - } - - return has_any_blog_stickers( array( 'business-plan', 'ecommerce-plan' ), $site_id ); - } - - // For all Jetpack sites - return true; - } - - /** - * Checks if this option was set while it was still available under free plan. - * - * @return bool True if we should enable grandfathering, false otherwise. - */ - public static function has_grandfathered_front_page_meta() { - return ! self::is_enabled_jetpack_seo() && get_option( self::GRANDFATHERED_META_OPTION ); - } - - /** - * Returns front page meta description for current site. - * - * Since we allowed non-business users to set Front page meta description for some time, - * before bundling it with other SEO tools features that require a business plan, - * we are supporting grandfathering here. - * - * @return string Front page meta description string or empty string. - */ - public static function get_front_page_meta_description() { - if ( self::is_enabled_jetpack_seo() ) { - $front_page_meta = get_option( self::FRONT_PAGE_META_OPTION ); - return $front_page_meta ? $front_page_meta : get_option( self::GRANDFATHERED_META_OPTION, '' ); - } - - // Support grandfathering for non-business users. - return get_option( self::GRANDFATHERED_META_OPTION, '' ); - } - - /** - * Updates the site option value for front page meta description. - * - * We are taking care to update the correct option, in case the value is grandfathered for current site. - * - * @param $value string New value for front page meta description. - * - * @return string Saved value, or empty string if no update was performed. - */ - public static function update_front_page_meta_description( $value ) { - $front_page_description = sanitize_text_field( $value ); - - /** - * Can be used to limit the lenght of front page meta description. - * - * @module seo-tools - * - * @since 4.4.0 - * - * @param int Maximum length of front page meta description. Defaults to 300. - */ - $description_max_length = apply_filters( 'jetpack_seo_front_page_description_max_length', 300 ); - - if ( function_exists( 'mb_substr' ) ) { - $front_page_description = mb_substr( $front_page_description, 0, $description_max_length ); - } else { - $front_page_description = substr( $front_page_description, 0, $description_max_length ); - } - - $can_set_meta = self::is_enabled_jetpack_seo(); - $grandfathered_meta_option = get_option( self::GRANDFATHERED_META_OPTION ); - $has_old_meta = ! empty( $grandfathered_meta_option ); - $option_name = self::has_grandfathered_front_page_meta() ? self::GRANDFATHERED_META_OPTION : self::FRONT_PAGE_META_OPTION; - - $did_update = update_option( $option_name, $front_page_description ); - - if ( $did_update && $has_old_meta && $can_set_meta ) { - // Delete grandfathered option if user has switched to Business plan and updated meta description. - delete_option( 'seo_meta_description' ); - } - - if ( $did_update ) { - return $front_page_description; - } - - return ''; - } -} diff --git a/plugins/jetpack/modules/seo-tools/jetpack-seo.php b/plugins/jetpack/modules/seo-tools/jetpack-seo.php deleted file mode 100644 index d8bccd46..00000000 --- a/plugins/jetpack/modules/seo-tools/jetpack-seo.php +++ /dev/null @@ -1,206 +0,0 @@ -<?php - -/** - * An SEO expert walks into a bar, bars, pub, public house, Irish pub, drinks, beer, wine, liquor, Grey Goose, Cristal... - */ -class Jetpack_SEO { - public function __construct() { - add_action( 'init', array( $this, 'init' ) ); - } - - public function init() { - /** - * Can be used to prevent SEO tools from inserting custom meta tags. - * - * @module seo-tools - * - * @since 4.4.0 - * - * @param bool true Should Jetpack's SEO Meta Tags be enabled. Defaults to true. - */ - if ( apply_filters( 'jetpack_seo_meta_tags_enabled', true ) ) { - add_action( 'wp_head', array( $this, 'meta_tags' ) ); - - // Add support for editing page excerpts in pages, regardless of theme support. - add_post_type_support( 'page', 'excerpt' ); - } - - /** - * Can be used to prevent SEO tools form modifying site titles. - * - * @module seo-tools - * - * @since 4.4.0 - * - * @param bool true Should Jetpack SEO modify site titles. Defaults to true. - */ - if ( apply_filters( 'jetpack_seo_custom_titles', true ) ) { - // Overwrite page title with custom SEO meta title for themes that support title-tag. - add_filter( 'pre_get_document_title', array( 'Jetpack_SEO_Titles', 'get_custom_title' ) ); - - // Add overwrite support for themes that don't support title-tag. - add_filter( 'wp_title', array( 'Jetpack_SEO_Titles', 'get_custom_title' ) ); - } - - add_filter( 'jetpack_open_graph_tags', array( $this, 'set_custom_og_tags' ) ); - } - - private function get_authors() { - global $wp_query; - - $authors = array(); - - foreach ( $wp_query->posts as $post ) { - $authors[] = get_the_author_meta( 'display_name', (int) $post->post_author ); - } - - $authors = array_unique( $authors ); - - return $authors; - } - - public function set_custom_og_tags( $tags ) { - $custom_title = Jetpack_SEO_Titles::get_custom_title(); - - if ( ! empty( $custom_title ) ) { - $tags['og:title'] = $custom_title; - } - - $post_custom_description = Jetpack_SEO_Posts::get_post_custom_description( get_post() ); - $front_page_meta = Jetpack_SEO_Utils::get_front_page_meta_description(); - - if ( is_front_page() && ! empty( $front_page_meta ) ) { - $tags['og:description'] = $front_page_meta; - } else { - if ( ! empty( $post_custom_description ) ) { - $tags['og:description'] = $post_custom_description; - } - } - - return $tags; - } - - public function meta_tags() { - global $wp_query; - - $period = ''; - $template = ''; - $meta = array(); - - /** - * Can be used to specify a list of themes that set their own meta tags. - * - * If current site is using one of the themes listed as conflicting, inserting Jetpack SEO - * meta tags will be prevented. - * - * @module seo-tools - * - * @since 4.4.0 - * - * @param array List of conflicted theme names. Defaults to empty array. - */ - $conflicted_themes = apply_filters( 'jetpack_seo_meta_tags_conflicted_themes', array() ); - - if ( isset( $conflicted_themes[ get_option( 'template' ) ] ) ) { - return; - } - - $front_page_meta = Jetpack_SEO_Utils::get_front_page_meta_description(); - $description = $front_page_meta ? $front_page_meta : get_bloginfo( 'description' ); - $meta['description'] = trim( $description ); - - // Try to target things if we're on a "specific" page of any kind. - if ( is_singular() ) { - // Business users can overwrite the description. - if ( ! ( is_front_page() && Jetpack_SEO_Utils::get_front_page_meta_description() ) ) { - $description = Jetpack_SEO_Posts::get_post_description( get_post() ); - - if ( $description ) { - $description = wp_trim_words( strip_shortcodes( wp_kses( $description, array() ) ) ); - $meta['description'] = $description; - } - } - - } elseif ( is_author() ) { - $obj = get_queried_object(); - - $meta['description'] = sprintf( - _x( 'Read all of the posts by %1$s on %2$s', 'Read all of the posts by Author Name on Blog Title', 'jetpack' ), - $obj->display_name, - get_bloginfo( 'title' ) - ); - } elseif ( is_tag() || is_category() || is_tax() ) { - $obj = get_queried_object(); - - $description = get_term_field( 'description', $obj->term_id, $obj->taxonomy, 'raw' ); - - if ( ! is_wp_error( $description ) && '' != $description ) { - $meta['description'] = wp_trim_words( $description ); - } else { - $authors = $this->get_authors(); - - $meta['description'] = wp_sprintf( - _x( 'Posts about %1$s written by %2$l', 'Posts about Category written by John and Bob', 'jetpack' ), - single_term_title( '', false ), - $authors - ); - } - } elseif ( is_date() ) { - if ( is_year() ) { - $period = get_query_var( 'year' ); - - $template = _nx( - '%1$s post published by %2$l in the year %3$s', // singular - '%1$s posts published by %2$l in the year %3$s', // plural - count( $wp_query->posts ), // number - '10 posts published by John in the year 2012', // context - 'jetpack' - ); - } elseif ( is_month() ) { - $period = date( 'F Y', mktime( 0, 0, 0, get_query_var( 'monthnum' ), 1, get_query_var( 'year' ) ) ); - - $template = _nx( - '%1$s post published by %2$l during %3$s', // singular - '%1$s posts published by %2$l during %3$s', // plural - count( $wp_query->posts ), // number - '10 posts publishes by John during May 2012', // context - 'jetpack' - ); - } elseif ( is_day() ) { - $period = date( - 'F j, Y', - mktime( 0, 0, 0, get_query_var( 'monthnum' ), get_query_var( 'day' ), get_query_var( 'year' ) ) - ); - - $template = _nx( - '%1$s post published by %2$l on %3$s', // singular - '%1$s posts published by %2$l on %3$s', // plural - count( $wp_query->posts ), // number - '10 posts published by John on May 30, 2012', // context - 'jetpack' - ); - } - - $authors = $this->get_authors(); - $meta['description'] = wp_sprintf( $template, count( $wp_query->posts ), $authors, $period ); - } - - /** - * Can be used to edit the default SEO tools meta tags. - * - * @module seo-tools - * - * @since 4.4.0 - * - * @param array Array that consists of meta name and meta content pairs. - */ - $meta = apply_filters( 'jetpack_seo_meta_tags', $meta ); - - // Output them - foreach ( $meta as $name => $content ) { - if ( ! empty( $content ) ) { - echo '<meta name="' . esc_attr( $name ) . '" content="' . esc_attr( $content ) . '" />' . "\n"; - } - } - } -} |