自定义函数在ACF关系字段的GET_PERMARINK中制造麻烦

时间:2019-06-07 作者:Gregory

我正在使用自定义函数来添加。html到我的自定义帖子(&M);页面,使用WPML。

此脚本正在上创建错误ACF relationship field permalink。

我的自定义功能:

function custom_post_permalink ($post_link) {
    global $post;
    if($post) {
        $type = get_post_type($post->ID);
        $post_type_data = get_post_type_object( $type );
        $post_type_slug = $post_type_data->rewrite[\'slug\'];
        $post_type_slug_translated = apply_filters( \'wpml_get_translated_slug\', $post_type_slug, $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\');
因此,当我查询我的帖子/页面/海关帖子并希望显示关系页面时,每个数据都显示得很好。

除非

get_the_permalink( $event_city->ID )
显示当前页面链接或循环中项目的链接。不是关系。(所以你的标题链接很好,url错误)

注意:如果我输出$event_city->ID 我有关系字段的ID,正如我所说,它与get_the_title( $event_city->ID )

nb2:我试过get_permalink, get_post_permalink, 和get_the_permalink, 相同的结果。

如果我停用我的功能,一切正常。

但我想不出是什么造成了这种麻烦。

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

你不应该依赖全球$post 类似于这样的过滤器的变量。

在你的例子中,你通过了$event_city->IDget_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,您可以使用它来获取对象)。

相关推荐

Problem with permalinks

我已经更改了类别的基本名称,现在它是“博客”,工作正常。但当我通过/blog/%category%/%postname%/更改结构时。显示404。如果我删除结构中的blog,它会再次工作,但我想使用blog word。问题出在哪里?非常感谢。