Robots: Introduce Robots API.
This changeset introduces a filter-based Robots API, providing central control over the `robots` meta tag.
* Introduces `wp_robots()` function which should be called anywhere a `robots` meta tag should be included.
* Introduces `wp_robots` filter which allows adding or modifying directives for the `robots` meta tag. The `wp_robots()` function is entirely filter-based, i.e. if no filter is added to `wp_robots`, no directives will be present, and therefore the entire `robots` meta tag will be omitted.
* Introduces the following `wp_robots` filter functions which replace similar existing functions that were manually rendering a `robots` meta tag:
* `wp_robots_noindex()` replaces `noindex()`, which has been deprecated.
* `wp_robots_no_robots()` replaces `wp_no_robots()`, which has been deprecated.
* `wp_robots_sensitive_page()` replaces `wp_sensitive_page_meta()`, which has been deprecated. Its rendering of the `referrer` meta tag has been moved to another new function `wp_strict_cross_origin_referrer()`.
Migration to the new functions is straightforward. For example, a call to `add_action( 'wp_head', 'wp_no_robots' )` should be replaced with `add_filter( 'wp_robots', 'wp_robots_no_robots' )`.
Plugins and themes that render their own `robots` meta tags are encouraged to switch to rely on the `wp_robots` filter in order to use the central management layer now provided by WordPress core.
Props adamsilverstein, flixos90, timothyblynjacobs, westonruter.
See #51511.
Built from https://develop.svn.wordpress.org/trunk@49992
git-svn-id: http://core.svn.wordpress.org/trunk@49693 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-01-20 20:37:00 -05:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Robots template functions.
|
|
|
|
*
|
|
|
|
* @package WordPress
|
|
|
|
* @subpackage Robots
|
|
|
|
* @since 5.7.0
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Displays the robots meta tag as necessary.
|
|
|
|
*
|
|
|
|
* Gathers robots directives to include for the current context, using the
|
|
|
|
* {@see 'wp_robots'} filter. The directives are then sanitized, and the
|
|
|
|
* robots meta tag is output if there is at least one relevant directive.
|
|
|
|
*
|
|
|
|
* @since 5.7.0
|
|
|
|
*/
|
|
|
|
function wp_robots() {
|
|
|
|
/**
|
|
|
|
* Filters the directives to be included in the 'robots' meta tag.
|
|
|
|
*
|
|
|
|
* The meta tag will only be included as necessary.
|
|
|
|
*
|
|
|
|
* @since 5.7.0
|
|
|
|
*
|
|
|
|
* @param array $robots Associative array of directives. Every key must be the name of the directive, and the
|
|
|
|
* corresponding value must either be a string to provide as value for the directive or a
|
|
|
|
* boolean `true` if it is a boolean directive, i.e. without a value.
|
|
|
|
*/
|
|
|
|
$robots = apply_filters( 'wp_robots', array() );
|
|
|
|
|
|
|
|
// Don't allow mutually exclusive directives.
|
|
|
|
if ( ! empty( $robots['follow'] ) ) {
|
|
|
|
unset( $robots['nofollow'] );
|
|
|
|
}
|
|
|
|
if ( ! empty( $robots['nofollow'] ) ) {
|
|
|
|
unset( $robots['follow'] );
|
|
|
|
}
|
|
|
|
if ( ! empty( $robots['archive'] ) ) {
|
|
|
|
unset( $robots['noarchive'] );
|
|
|
|
}
|
|
|
|
if ( ! empty( $robots['noarchive'] ) ) {
|
|
|
|
unset( $robots['archive'] );
|
|
|
|
}
|
|
|
|
|
|
|
|
$robots_strings = array();
|
|
|
|
foreach ( $robots as $directive => $value ) {
|
|
|
|
if ( is_string( $value ) ) {
|
|
|
|
// If a string value, include it as value for the directive.
|
|
|
|
$robots_strings[] = "{$directive}:{$value}";
|
|
|
|
} elseif ( $value ) {
|
|
|
|
// Otherwise, include the directive if it is truthy.
|
|
|
|
$robots_strings[] = $directive;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( empty( $robots_strings ) ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
echo "<meta name='robots' content='" . esc_attr( implode( ', ', $robots_strings ) ) . "' />\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds noindex to the robots meta tag if required by the site configuration.
|
|
|
|
*
|
|
|
|
* If a blog is marked as not being public then noindex will be output to
|
|
|
|
* tell web robots not to index the page content. Add this to the
|
|
|
|
* {@see 'wp_robots'} filter.
|
|
|
|
*
|
|
|
|
* Typical usage is as a {@see 'wp_robots'} callback:
|
|
|
|
*
|
|
|
|
* add_filter( 'wp_robots', 'wp_robots_noindex' );
|
|
|
|
*
|
|
|
|
* @since 5.7.0
|
|
|
|
* @see wp_robots_no_robots()
|
|
|
|
*
|
|
|
|
* @param array $robots Associative array of robots directives.
|
|
|
|
* @return array Filtered robots directives.
|
|
|
|
*/
|
|
|
|
function wp_robots_noindex( array $robots ) {
|
|
|
|
if ( ! get_option( 'blog_public' ) ) {
|
|
|
|
return wp_robots_no_robots( $robots );
|
|
|
|
}
|
|
|
|
|
|
|
|
return $robots;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds noindex to the robots meta tag.
|
|
|
|
*
|
|
|
|
* This directive tells web robots not to index the page content.
|
|
|
|
*
|
|
|
|
* Typical usage is as a {@see 'wp_robots'} callback:
|
|
|
|
*
|
|
|
|
* add_filter( 'wp_robots', 'wp_robots_no_robots' );
|
|
|
|
*
|
|
|
|
* @since 5.7.0
|
|
|
|
*
|
|
|
|
* @param array $robots Associative array of robots directives.
|
|
|
|
* @return array Filtered robots directives.
|
|
|
|
*/
|
|
|
|
function wp_robots_no_robots( array $robots ) {
|
|
|
|
$robots['noindex'] = true;
|
|
|
|
|
|
|
|
if ( get_option( 'blog_public' ) ) {
|
|
|
|
$robots['follow'] = true;
|
|
|
|
} else {
|
|
|
|
$robots['nofollow'] = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $robots;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds noindex and noarchive to the robots meta tag.
|
|
|
|
*
|
|
|
|
* This directive tells web robots not to index or archive the page content and
|
|
|
|
* is recommended to be used for sensitive pages.
|
|
|
|
*
|
|
|
|
* Typical usage is as a {@see 'wp_robots'} callback:
|
|
|
|
*
|
|
|
|
* add_filter( 'wp_robots', 'wp_robots_sensitive_page' );
|
|
|
|
*
|
|
|
|
* @since 5.7.0
|
|
|
|
*
|
|
|
|
* @param array $robots Associative array of robots directives.
|
|
|
|
* @return array Filtered robots directives.
|
|
|
|
*/
|
|
|
|
function wp_robots_sensitive_page( array $robots ) {
|
|
|
|
$robots['noindex'] = true;
|
|
|
|
$robots['noarchive'] = true;
|
|
|
|
return $robots;
|
|
|
|
}
|
2021-01-29 15:38:03 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds 'max-image-preview:large' to the robots meta tag.
|
|
|
|
*
|
|
|
|
* This directive tells web robots that large image previews are allowed to be
|
|
|
|
* displayed, e.g. in search engines, unless the blog is marked as not being public.
|
|
|
|
*
|
|
|
|
* Typical usage is as a {@see 'wp_robots'} callback:
|
|
|
|
*
|
|
|
|
* add_filter( 'wp_robots', 'wp_robots_max_image_preview_large' );
|
|
|
|
*
|
|
|
|
* @since 5.7.0
|
|
|
|
*
|
|
|
|
* @param array $robots Associative array of robots directives.
|
|
|
|
* @return array Filtered robots directives.
|
|
|
|
*/
|
|
|
|
function wp_robots_max_image_preview_large( array $robots ) {
|
|
|
|
if ( get_option( 'blog_public' ) ) {
|
|
|
|
$robots['max-image-preview'] = 'large';
|
|
|
|
}
|
|
|
|
return $robots;
|
|
|
|
}
|