我需要根据URL动态更改正在加载的页面。这是一个翻译系统,每种语言的页面长度是不同的。URL如下所示:
/en/best-restaurants-in-tokyo
/it/migliori-ristoranti-a-tokyo
/fr/meilleurs-restaurants-à-tokyo
段塞存储在单独的表中,而不是
wp_posts
或
wp_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以打开其他帖子?
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的内容将是一个很好的开始。