Robots Hooks
Filters
wp_robots
Filters the directives to be included in the robots meta tag.
apply_filters( 'wp_robots', array $robots ): arraySince: 5.7.0
Parameters:
$robots— Associative array where keys are directive names and values are either:truefor boolean directives (e.g.,noindex)- String values for parameterized directives (e.g.,
max-image-preview=>large)
Returns: Modified directives array
Default Callbacks:
| Callback | Priority | Condition |
|---|---|---|
wp_robots_noindex | 10 | Always registered |
wp_robots_noindex_embeds | 10 | Always registered |
wp_robots_noindex_search | 10 | Always registered |
wp_robots_max_image_preview_large | 10 | Always registered |
wp_robots_no_robots | 10 | Login page only |
Example — Add noindex to author archives:
add_filter( 'wp_robots', function( $robots ) {
if ( is_author() ) {
$robots['noindex'] = true;
$robots['follow'] = true;
}
return $robots;
} );Example — Remove max-image-preview:
add_filter( 'wp_robots', function( $robots ) {
unset( $robots['max-image-preview'] );
return $robots;
}, 20 );robots_txt
Filters the robots.txt output.
apply_filters( 'robots_txt', string $output, bool $public ): stringSince: 3.0.0
Parameters:
truefor boolean directives (e.g.,noindex)- String values for parameterized directives (e.g.,
max-image-preview=>large)
Returns: Modified robots.txt content string
Example — Add sitemap:
add_filter( 'robots_txt', function( $output, $public ) {
if ( $public ) {
$output .= "Sitemap: " . home_url( '/sitemap.xml' ) . "n";
}
return $output;
}, 10, 2 );Example — Block specific crawlers:
add_filter( 'robots_txt', function( $output ) {
$output .= "nUser-agent: GPTBotn";
$output .= "Disallow: /n";
$output .= "nUser-agent: CCBotn";
$output .= "Disallow: /n";
return $output;
} );Example — Disallow entire site for non-public:
add_filter( 'robots_txt', function( $output, $public ) {
if ( ! $public ) {
return "User-agent: *nDisallow: /n";
}
return $output;
}, 10, 2 );Actions
do_robotstxt
Fires when displaying the robots.txt file.
do_action( 'do_robotstxt' )Since: 2.1.0
Fires before the default robots.txt content is output. Headers have already been sent (Content-Type: text/plain).
Example — Log robots.txt requests:
add_action( 'do_robotstxt', function() {
error_log( 'robots.txt accessed: ' . $_SERVER['REMOTE_ADDR'] );
} );Example — Output additional content before default:
add_action( 'do_robotstxt', function() {
echo "# Custom robots.txt for " . get_bloginfo( 'name' ) . "nn";
} );do_robots
Action hook for serving the robots.txt file.
do_action( 'do_robots' )Since: 2.1.0
Fired by template-loader.php when is_robots() is true. The default handler do_robots() is attached to this action.
Example — Complete custom robots.txt:
// Remove default handler
remove_action( 'do_robots', 'do_robots' );
// Add custom handler
add_action( 'do_robots', function() {
header( 'Content-Type: text/plain; charset=utf-8' );
echo file_get_contents( ABSPATH . 'custom-robots.txt' );
} );Hook Registration Reference
From wp-includes/default-filters.php:
// Meta robots filter callbacks
add_filter( 'wp_robots', 'wp_robots_noindex' );
add_filter( 'wp_robots', 'wp_robots_noindex_embeds' );
add_filter( 'wp_robots', 'wp_robots_noindex_search' );
add_filter( 'wp_robots', 'wp_robots_max_image_preview_large' );
// Output meta robots tag
add_action( 'wp_head', 'wp_robots', 1 );
add_action( 'login_head', 'wp_robots', 1 );
add_action( 'embed_head', 'wp_robots' );
// Login page gets noindex
if ( ... login context ... ) {
add_filter( 'wp_robots', 'wp_robots_no_robots' );
}
// robots.txt handler
add_action( 'do_robots', 'do_robots' );Directive Reference
Standard robots meta directives:
| Directive | Type | Description |
|---|---|---|
index | boolean | Allow indexing |
noindex | boolean | Prevent indexing |
follow | boolean | Follow links |
nofollow | boolean | Don’t follow links |
noarchive | boolean | Don’t cache/archive page |
nosnippet | boolean | No text snippets in results |
max-snippet | value | Max snippet length (max-snippet:150) |
max-image-preview | value | Image preview size (none, standard, large) |
max-video-preview | value | Video preview seconds (-1 for unlimited) |
notranslate | boolean | Don’t offer translation |
noimageindex | boolean | Don’t index images |
unavailable_after | value | Date to stop showing in results |