summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/jetpack/modules/seo-tools')
-rw-r--r--plugins/jetpack/modules/seo-tools/class-jetpack-seo-utils.php14
-rw-r--r--plugins/jetpack/modules/seo-tools/jetpack-seo-posts.php91
-rw-r--r--plugins/jetpack/modules/seo-tools/jetpack-seo-titles.php301
-rw-r--r--plugins/jetpack/modules/seo-tools/jetpack-seo-utils.php126
-rw-r--r--plugins/jetpack/modules/seo-tools/jetpack-seo.php206
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";
- }
- }
- }
-}