你不应该依赖全球$post
类似于这样的过滤器的变量。
在你的例子中,你通过了$event_city->ID
到get_the_permalink()
. 这意味着$event_city
职位与当前职位不一致$post
对象这是正常的。有时您希望使用以下函数get_the_title()
或get_the_permalink()
不改变全局$post
变量
在某个阶段get_the_permalink()
通过post_type_link
滤器问题是你的custom_post_permalink()
功能完全忽略请求链接的特定帖子($event_city
), 而只使用全局post变量。这意味着get_the_permalink()
函数在循环外部调用,它将仅根据循环中的当前帖子检索链接。
那么我们如何在过滤器中使用正确的post呢?As documented, post_type_link
筛选器回调将post对象作为第二个参数接收。此对象将表示中请求链接的帖子get_the_permalink()
. 因此,您需要在函数中使用该对象:
function custom_post_permalink( $post_link, $post ) { // Accept $post argument.
$post_type = get_post_type( $post->ID ); // $post now refers to the one passed as an argument.
$post_type_data = get_post_type_object( $post_type );
$post_type_slug = $post_type_data->rewrite[\'slug\'];
$post_type_slug_translated = apply_filters( \'wpml_get_translated_slug\', $post_type_slug, $post_type );
$translated_home_url = apply_filters( \'wpml_home_url\', home_url() );
$be_current_lang = apply_filters( \'wpml_current_language\', NULL );
if ( $be_current_lang === \'fr\' ) {
return $translated_home_url . $post_type_slug_translated . \'/\' . $post->post_name . \'.html\';
} else {
return $translated_home_url . \'/\' . $post_type_slug_translated . \'/\' . $post->post_name . \'.html\';
}
}
add_filter( \'post_type_link\', \'custom_post_permalink\', 10, 2 ); // Specify that we\'re accepting 2 arguments.
只要有可能,您就不应该依赖全球
$post
变量如果过滤器或操作挂钩将post对象传递给回调函数,请始终使用该对象。如果您已筛选
the_title
同样,依靠全球
$post
, 您会遇到完全相同的问题(在这种情况下,过滤器会获取post ID,您可以使用它来获取对象)。