虚拟页面的重写规则和查询

时间:2015-01-08 作者:Pieter Goosen

我的问题来自this one. 坦白地说,我从来没有真正触及过重写规则,它们对我来说仍然没有意义

我已经成功建立了以下链接

http://localhost/wordpress/custom-archive/
默认情况下,这将导致404页,如custom-archive 不存在。这和参观一样

http://localhost/wordpress/category/
那部分很好用。

现在,发生了什么,当一篇文章附有类别和标签时,这个链接才会出现在一篇文章上。如果帖子有类别和/或标签,我会通过自定义将相关的类别ID和标签ID添加到链接中query_vars. 链接如下所示

http://localhost/wordpress/custom-archive/?cq=21&tq=18,19,20,144
其他重要信息,我可以使用template_include 只要两个人中的任何一个query_vars 存在,请使用自定义模板。这很有效

通过对特定模板进行自定义查询,显示正确的帖子

我的问题虽然我得到了一个自定义查询(我也想消除),但主查询404。这可以在我的面包屑和显示“未找到页面”的浏览器选项卡中看到

我所尝试的pre_get_posts 从我的自定义中获取值query_vars 更改主查询,但这不起作用,因为Wordpress试图以post或single page的形式读取页面

我也尝试过重写规则,这对我的事业也没有帮助。问题是,我真的无法得到正确的组合。我知道我必须告诉Wordpress这个页面是一个自定义存档,而不是一篇文章或一个页面,然后使用我自定义的值query_vars 在a中tax_query 获取属于类别的帖子AND 自定义中给定的标记query_vars

对于实现这一目标的正确重写规则,有什么建议吗?

编辑我知道我必须以某种方式重写

http://localhost/wordpress/custom-archive/?cq=XXX&tq=XXX
Wordpress可以理解这是帖子类型的自定义存档页面(或虚拟页面)post, 页面上显示的帖子应与以下类别中的帖子相匹配cq AND 具有由给定的标记tq.

这是关于在自定义模板中使用自定义查询的基本概念

$args = [
    \'post_type\'    => \'post\',
    \'tax_query\'    => [
        \'relation\' => \'AND\',
        [
            \'taxonomy\' => \'category\',
            \'terms\'    => get_query_var( \'cq\' ),
        ],
        [
            \'taxonomy\' => \'post_tag\',
            \'terms\'    => get_query_var( \'tq\' ),
        ],
    ],
];
$q = new WP_Query( $args );
我需要翻译这个来处理主查询。只需将上述内容添加到pre_get_posts 不起作用,该页面只是404的,因此需要重写URL才能起作用

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

只需设置post_type=post 在重写规则中:

function custom_archive_rule() {
    add_rewrite_rule(
        \'custom-archive/?\',
        \'index.php?post_type=post\',
        \'top\'
    );
}
add_action( \'init\', \'custom_archive_rule\' );
WordPress将此标识为is_home, 所以你必须把目标锁定在pre_get_posts 通过存在额外的查询变量。

function custom_arcive_tax( $query ) {
    if ( $query->is_home()
        && $query->is_main_query()
        && isset( $_GET[\'cq\'] ) ) {
            $tax_query = array(
                array(
                    \'taxonomy\' => \'category\',
                    \'terms\' => $_GET[\'cq\'],
                )
            );
            $query->set( \'tax_query\', $tax_query );
    }
}
add_action( \'pre_get_posts\', \'custom_arcive_tax\' );

结束

相关推荐