无法在PRE_GET_POSTS挂接中切换查询的POST

时间:2017-04-14 作者:Victor Marchuk

我需要根据URL动态更改正在加载的页面。这是一个翻译系统,每种语言的页面长度是不同的。URL如下所示:

/en/best-restaurants-in-tokyo

/it/migliori-ristoranti-a-tokyo

/fr/meilleurs-restaurants-à-tokyo
段塞存储在单独的表中,而不是wp_postswp_postmeta. 我发现实现这一点的唯一方法是修改全局WP_Query 中的对象pre_get_posts 钩问题是它不起作用,我不明白为什么。WordPress渲染index.php 而不是single.php 所有帖子都应该如此。如果我按原始slug或ID(即。?p=4033), 一切正常。

下面是演示该问题的代码。

add_action(\'pre_get_posts\', \'mt_handle_translation_redirect\', 9999);
function mt_handle_translation_redirect ($query) {
    global $wpdb;

    if (!$query->is_main_query()) return;

    // "1178" is a valid post ID
    $query->set(\'page_id\', 1178);
  }
如果我打开任何帖子页面(例如\'http://localhost/wordpress/?p=1010\'), 它将像预期的那样重定向到第1178页。如果我打开主页,它不会进行任何重定向。

如果我们添加add_rewrite_rule 对于代码,它将不再正确重定向,而是尝试呈现主页:

add_action(\'init\', \'mt_init\');
function mt_init() {
    add_rewrite_tag(\'%tr_language%\', \'([a-z_-]+)\' );
    add_rewrite_tag(\'%tr_title%\', \'([\\pL_-]+)\' );
    add_rewrite_rule(\'^(fr)/([^/]+)/?\', \'index.php?tr_language=$matches[1]&tr_title=$matches[2]\', \'top\');
    flush_rewrite_rules();
}
我打电话的时候index.php 如果没有特定的帖子ID或slug,就不可能再重定向到另一个页面,因为它总是呈现帖子列表,就像在主页或类别页面上一样。

如何创建自定义URL以打开其他帖子?

1 个回复
SO网友:Jess Mann

嗯。我仔细检查了一下。在我的本地服务器上,这段代码成功地更改了帖子:

function test_redirect()
{
        global $wp_query;
        $wp_query->set(\'page_id\', 5); 
}
add_action(\'pre_get_posts\', \'test_redirect\');
您必须进行一些调试。在dev服务器上,var\\u将$wp\\u查询变量转储到几个关键位置,以检查它是否具有您所期望的内容。

另一种解决方案是parse_query 更早修改查询的操作。

另一个选择是template_redirect 稍后,然后创建一个全新的wp\\U查询对象。如果您要将帖子更改为完全不同的内容,而不仅仅是另一个翻译,这通常是可取的,因为它将清除之前由parse\\u query设置的任何其他变量。它带来了两次查询帖子的额外开销。总体思路如下:

function redirect_translation()
{
        global $wp_query;
        // Replace wp_query here... query_posts() should work too.
        $wp_query = new WP_Query(array(\'post_id\' => 5));
}
add_action(\'template_redirect\',\'redirect_translation\');
在pre\\u get\\u posts中执行此操作将导致无限循环。

EDIT: 再次查看代码,如何调用mt\\u handle\\u translation\\u redirect?我怀疑您可能没有更新全局$wp\\u查询对象,这就是为什么没有修改真正的查询。在几个地方(比如模板文件)验证wp\\u query的内容将是一个很好的开始。

相关推荐

如何读取WordPress$Query关联数组(散列)键的值

WordPress编程新手(来自更为传统的环境),并试图了解其一些“独特”特性。我们的网站上有一个目录页,此代码驻留在functions.php, 如果条件为true,则调整结果。if( $query->is_post_type_archive( \'directory\' ) ){ ...//do stuff } 我想知道如何获取is_post_type_archive 这就是“目录”当我对值使用测试时。。。var_dumb($query->is_post