函数文档

_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.

Return

int The Post ID.

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.