_find_post_by_old_slug()
云策文档标注
概述
_find_post_by_old_slug() 是一个 WordPress 内部函数,用于根据旧 slug 查找对应的文章 ID,主要用于重定向旧链接。它通过查询数据库中的 _wp_old_slug 元数据,并支持基于年份、月份和日期的精确匹配,同时利用缓存机制优化性能。
关键要点
- 函数用途:查找旧 slug 对应的文章 ID,以支持重定向功能。
- 参数:$post_type(字符串,必需),基于查询变量指定当前文章类型。
- 返回值:整数,表示找到的文章 ID。
- 核心机制:通过 SQL 查询 $wpdb->postmeta 和 $wpdb->posts 表,匹配 meta_key 为 '_wp_old_slug' 的记录。
- 精确查询:如果查询变量中指定了 year、monthnum 或 day,函数会添加相应条件以提高查询精度。
- 缓存优化:使用 wp_cache_get_salted() 和 wp_cache_set_salted() 进行缓存处理,提升性能。
- 相关函数:与 wp_old_slug_redirect() 配合使用,实现旧 slug 重定向。
代码示例
function _find_post_by_old_slug( $post_type ) {
global $wpdb;
$query = $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta, $wpdb->posts WHERE ID = post_id AND post_type = %s AND meta_key = '_wp_old_slug' AND meta_value = %s", $post_type, get_query_var( 'name' ) );
if ( get_query_var( 'year' ) ) {
$query .= $wpdb->prepare( ' AND YEAR(post_date) = %d', get_query_var( 'year' ) );
}
if ( get_query_var( 'monthnum' ) ) {
$query .= $wpdb->prepare( ' AND MONTH(post_date) = %d', get_query_var( 'monthnum' ) );
}
if ( get_query_var( 'day' ) ) {
$query .= $wpdb->prepare( ' AND DAYOFMONTH(post_date) = %d', get_query_var( 'day' ) );
}
$key = md5( $query );
$last_changed = wp_cache_get_last_changed( 'posts' );
$cache_key = "find_post_by_old_slug:$key";
$cache = wp_cache_get_salted( $cache_key, 'post-queries', $last_changed );
if ( false !== $cache ) {
$id = $cache;
} else {
$id = (int) $wpdb->get_var( $query );
wp_cache_set_salted( $cache_key, $id, 'post-queries', $last_changed );
}
return $id;
}注意事项
- 此函数是 WordPress 核心内部函数,通常不应直接在主题或插件中调用,而是通过 wp_old_slug_redirect() 间接使用。
- 函数依赖于查询变量(如 name、year、monthnum、day),确保这些变量在调用前已正确设置。
- 缓存机制基于 wp_cache_get_last_changed() 和盐值缓存函数,需确保缓存组 'posts' 和 'post-queries' 正常工作。
- 函数从版本 4.9.3 开始引入,使用时需注意 WordPress 版本兼容性。
原文内容
Find the post ID for redirecting an old slug.
Description
See also
Parameters
$post_typestringrequired-
The current post type based on the query vars.
Source
function _find_post_by_old_slug( $post_type ) {
global $wpdb;
$query = $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta, $wpdb->posts WHERE ID = post_id AND post_type = %s AND meta_key = '_wp_old_slug' AND meta_value = %s", $post_type, get_query_var( 'name' ) );
/*
* If year, monthnum, or day have been specified, make our query more precise
* just in case there are multiple identical _wp_old_slug values.
*/
if ( get_query_var( 'year' ) ) {
$query .= $wpdb->prepare( ' AND YEAR(post_date) = %d', get_query_var( 'year' ) );
}
if ( get_query_var( 'monthnum' ) ) {
$query .= $wpdb->prepare( ' AND MONTH(post_date) = %d', get_query_var( 'monthnum' ) );
}
if ( get_query_var( 'day' ) ) {
$query .= $wpdb->prepare( ' AND DAYOFMONTH(post_date) = %d', get_query_var( 'day' ) );
}
$key = md5( $query );
$last_changed = wp_cache_get_last_changed( 'posts' );
$cache_key = "find_post_by_old_slug:$key";
$cache = wp_cache_get_salted( $cache_key, 'post-queries', $last_changed );
if ( false !== $cache ) {
$id = $cache;
} else {
$id = (int) $wpdb->get_var( $query );
wp_cache_set_salted( $cache_key, $id, 'post-queries', $last_changed );
}
return $id;
}
Changelog
| Version | Description |
|---|---|
| 4.9.3 | Introduced. |