mirror of
https://github.com/gosticks/wordpress-develop.git
synced 2026-08-12 04:40:26 +00:00
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.
git-svn-id: https://develop.svn.wordpress.org/trunk@49992 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
@@ -893,7 +893,7 @@ class Tests_WP_Customize_Manager extends WP_UnitTestCase {
|
||||
$wp_customize->customize_preview_init();
|
||||
$this->assertSame( $did_action_customize_preview_init + 1, did_action( 'customize_preview_init' ) );
|
||||
|
||||
$this->assertSame( 10, has_action( 'wp_head', 'wp_no_robots' ) );
|
||||
$this->assertSame( 10, has_filter( 'wp_robots', 'wp_robots_no_robots' ) );
|
||||
$this->assertSame( 10, has_action( 'wp_head', array( $wp_customize, 'remove_frameless_preview_messenger_channel' ) ) );
|
||||
$this->assertSame( 10, has_filter( 'wp_headers', array( $wp_customize, 'filter_iframe_security_headers' ) ) );
|
||||
$this->assertSame( 10, has_filter( 'wp_redirect', array( $wp_customize, 'add_state_query_params' ) ) );
|
||||
|
||||
@@ -474,21 +474,6 @@ class Tests_General_Template extends WP_UnitTestCase {
|
||||
$this->assertSame( $expected, $result );
|
||||
}
|
||||
|
||||
/**
|
||||
* @ticket 43590
|
||||
*/
|
||||
function test_wp_no_robots() {
|
||||
// Simulate private site (search engines discouraged).
|
||||
update_option( 'blog_public', '0' );
|
||||
$actual_private = get_echo( 'wp_no_robots' );
|
||||
$this->assertSame( "<meta name='robots' content='noindex,nofollow' />\n", $actual_private );
|
||||
|
||||
// Simulate public site.
|
||||
update_option( 'blog_public', '1' );
|
||||
$actual_public = get_echo( 'wp_no_robots' );
|
||||
$this->assertSame( "<meta name='robots' content='noindex,follow' />\n", $actual_public );
|
||||
}
|
||||
|
||||
/**
|
||||
* @ticket 40969
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,213 @@
|
||||
<?php
|
||||
/**
|
||||
* Robots functions tests.
|
||||
*
|
||||
* @package WordPress
|
||||
*/
|
||||
|
||||
/**
|
||||
* Tests for robots template functions and filters.
|
||||
*
|
||||
* @group robots
|
||||
*/
|
||||
class Tests_Robots extends WP_UnitTestCase {
|
||||
|
||||
public function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
remove_all_filters( 'wp_robots' );
|
||||
}
|
||||
|
||||
/**
|
||||
* @ticket 51511
|
||||
*/
|
||||
public function test_wp_robots_renders_when_relevant() {
|
||||
// Do not render robots meta tag when there are no directives.
|
||||
$output = get_echo( 'wp_robots' );
|
||||
$this->assertEmpty( $output );
|
||||
|
||||
// Render robots meta tag with noindex.
|
||||
add_filter( 'wp_robots', array( $this, 'add_noindex_directive' ) );
|
||||
$output = get_echo( 'wp_robots' );
|
||||
$this->assertEquals( "<meta name='robots' content='noindex' />\n", $output );
|
||||
|
||||
// Do not render robots meta tag when there are only false-y directives.
|
||||
add_filter( 'wp_robots', array( $this, 'remove_noindex_directive' ), 11 );
|
||||
$output = get_echo( 'wp_robots' );
|
||||
$this->assertEmpty( $output );
|
||||
}
|
||||
|
||||
/**
|
||||
* @ticket 51511
|
||||
*/
|
||||
public function test_wp_robots_parses_directives_correctly() {
|
||||
add_filter(
|
||||
'wp_robots',
|
||||
function( array $robots ) {
|
||||
// Directives that should have values must use strings.
|
||||
$robots['directive-with-value'] = 'yes';
|
||||
$robots['directive-with-numeric-value'] = '1';
|
||||
// Any non-string value will be evaluated as boolean.
|
||||
// False-y directives will not be included.
|
||||
$robots['directive-active-boolean'] = true;
|
||||
$robots['directive-inactive-boolean'] = false;
|
||||
$robots['directive-active-integer'] = 1;
|
||||
$robots['directive-inactive-integer'] = 0;
|
||||
return $robots;
|
||||
}
|
||||
);
|
||||
|
||||
$expected_directives_string = implode(
|
||||
', ',
|
||||
array(
|
||||
'directive-with-value:yes',
|
||||
'directive-with-numeric-value:1',
|
||||
'directive-active-boolean',
|
||||
'directive-active-integer',
|
||||
)
|
||||
);
|
||||
|
||||
$output = get_echo( 'wp_robots' );
|
||||
$this->assertContains( "'{$expected_directives_string}'", $output );
|
||||
}
|
||||
|
||||
/**
|
||||
* @ticket 51511
|
||||
*/
|
||||
public function test_wp_robots_includes_basic_sanitization_follow_nofollow() {
|
||||
// Only follow or nofollow can be present, with follow taking precedence.
|
||||
add_filter( 'wp_robots', array( $this, 'add_follow_directive' ) );
|
||||
add_filter( 'wp_robots', array( $this, 'add_nofollow_directive' ) );
|
||||
$output = get_echo( 'wp_robots' );
|
||||
$this->assertContains( "'follow'", $output );
|
||||
|
||||
// Consider truthyness of the directive value though.
|
||||
// Here nofollow is true, follow is false.
|
||||
add_filter( 'wp_robots', array( $this, 'remove_follow_directive' ), 11 );
|
||||
add_filter( 'wp_robots', array( $this, 'add_nofollow_directive' ), 11 );
|
||||
$output = get_echo( 'wp_robots' );
|
||||
$this->assertContains( "'nofollow'", $output );
|
||||
|
||||
// Consider truthyness of the directive value though.
|
||||
// Here follow is true, nofollow is false.
|
||||
add_filter( 'wp_robots', array( $this, 'add_follow_directive' ), 12 );
|
||||
add_filter( 'wp_robots', array( $this, 'remove_nofollow_directive' ), 12 );
|
||||
$output = get_echo( 'wp_robots' );
|
||||
$this->assertContains( "'follow'", $output );
|
||||
}
|
||||
|
||||
/**
|
||||
* @ticket 51511
|
||||
*/
|
||||
public function test_wp_robots_includes_basic_sanitization_archive_noarchive() {
|
||||
// Only archive or noarchive can be present, with archive taking precedence.
|
||||
add_filter( 'wp_robots', array( $this, 'add_archive_directive' ) );
|
||||
add_filter( 'wp_robots', array( $this, 'add_noarchive_directive' ) );
|
||||
$output = get_echo( 'wp_robots' );
|
||||
$this->assertContains( "'archive'", $output );
|
||||
|
||||
// Consider truthyness of the directive value though.
|
||||
// Here noarchive is true, archive is false.
|
||||
add_filter( 'wp_robots', array( $this, 'remove_archive_directive' ), 11 );
|
||||
add_filter( 'wp_robots', array( $this, 'add_noarchive_directive' ), 11 );
|
||||
$output = get_echo( 'wp_robots' );
|
||||
$this->assertContains( "'noarchive'", $output );
|
||||
|
||||
// Consider truthyness of the directive value though.
|
||||
// Here archive is true, noarchive is false.
|
||||
add_filter( 'wp_robots', array( $this, 'add_archive_directive' ), 12 );
|
||||
add_filter( 'wp_robots', array( $this, 'remove_noarchive_directive' ), 12 );
|
||||
$output = get_echo( 'wp_robots' );
|
||||
$this->assertContains( "'archive'", $output );
|
||||
}
|
||||
|
||||
/**
|
||||
* @ticket 51511
|
||||
*/
|
||||
public function test_wp_robots_noindex() {
|
||||
add_filter( 'wp_robots', 'wp_robots_noindex' );
|
||||
|
||||
update_option( 'blog_public', '1' );
|
||||
$output = get_echo( 'wp_robots' );
|
||||
$this->assertEmpty( $output );
|
||||
|
||||
update_option( 'blog_public', '0' );
|
||||
$output = get_echo( 'wp_robots' );
|
||||
$this->assertContains( "'noindex, nofollow'", $output );
|
||||
}
|
||||
|
||||
/**
|
||||
* @ticket 51511
|
||||
*/
|
||||
public function test_wp_robots_no_robots() {
|
||||
add_filter( 'wp_robots', 'wp_robots_no_robots' );
|
||||
|
||||
update_option( 'blog_public', '1' );
|
||||
$output = get_echo( 'wp_robots' );
|
||||
$this->assertContains( "'noindex, follow'", $output );
|
||||
|
||||
update_option( 'blog_public', '0' );
|
||||
$output = get_echo( 'wp_robots' );
|
||||
$this->assertContains( "'noindex, nofollow'", $output );
|
||||
}
|
||||
|
||||
/**
|
||||
* @ticket 51511
|
||||
*/
|
||||
public function test_wp_robots_sensitive_page() {
|
||||
add_filter( 'wp_robots', 'wp_robots_sensitive_page' );
|
||||
|
||||
$output = get_echo( 'wp_robots' );
|
||||
$this->assertContains( "'noindex, noarchive'", $output );
|
||||
}
|
||||
|
||||
public function add_noindex_directive( array $robots ) {
|
||||
$robots['noindex'] = true;
|
||||
return $robots;
|
||||
}
|
||||
|
||||
public function remove_noindex_directive( array $robots ) {
|
||||
$robots['noindex'] = false;
|
||||
return $robots;
|
||||
}
|
||||
|
||||
public function add_follow_directive( array $robots ) {
|
||||
$robots['follow'] = true;
|
||||
return $robots;
|
||||
}
|
||||
|
||||
public function remove_follow_directive( array $robots ) {
|
||||
$robots['follow'] = false;
|
||||
return $robots;
|
||||
}
|
||||
|
||||
public function add_nofollow_directive( array $robots ) {
|
||||
$robots['nofollow'] = true;
|
||||
return $robots;
|
||||
}
|
||||
|
||||
public function remove_nofollow_directive( array $robots ) {
|
||||
$robots['nofollow'] = false;
|
||||
return $robots;
|
||||
}
|
||||
|
||||
public function add_archive_directive( array $robots ) {
|
||||
$robots['archive'] = true;
|
||||
return $robots;
|
||||
}
|
||||
|
||||
public function remove_archive_directive( array $robots ) {
|
||||
$robots['archive'] = false;
|
||||
return $robots;
|
||||
}
|
||||
|
||||
public function add_noarchive_directive( array $robots ) {
|
||||
$robots['noarchive'] = true;
|
||||
return $robots;
|
||||
}
|
||||
|
||||
public function remove_noarchive_directive( array $robots ) {
|
||||
$robots['noarchive'] = false;
|
||||
return $robots;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user