在Example.com/Latest上显示所有最新的帖子,并带有filve.php

时间:2017-11-27 作者:kater louis

我想为最新的帖子制定一个重写规则example.com/latest 通过rewrite_rules_array-筛选并显示带有archive.php.

通常这是example.com/index.php 我想是吧?但我用我的主题index.php 用于自定义索引页。

index.php?category_name=technik 已成功从中获取输出archive.php, 但是我如何从archive.php 没有任何额外的过滤?

add_filter("rewrite_rules_array", function($rules) {
    $newRules = array();

    // works as expected
    $newRules[\'fliegen/(.+)/?$\'] = \'index.php?category_name=fliegen&filter=$matches[1]\';

    // output generated by themes index.php
    $newRules[\'latest\'] = \'index.php\';

    // also tried, but still output by themes index.php
    $newRules[\'latest2\'] = \'archive.php\';
    $newRules[\'latest3\'] = \'wp-content/themes/mytheme/archive.php\';

    // Return merged rules
    return array_merge($newRules, $rules);
});
我找到了一个解决方法,这很难看——只需列出所有类别。。

index.php?category_name=technik,fliegen,foo,bar
但没有分类的帖子仍然不会显示。欢迎提出建议!谢谢

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

所有内部规则必须指向index.php. 这不是你的主题index.php 文件,这是主要的核心WordPress引导文件。

重写规则集查询变量,查询变量被解析为查询,这些查询根据类型具有与其关联的模板文件。内部重写规则从不直接指向主题文件。如果要修改查询的模板,请使用template filter.

因此,对于您的示例,首先我们添加一个查询变量来区分此请求和其他请求:

function wpd_query_vars( $vars ){
    $vars[] = \'wpd_template\';
    return $vars;
}
add_filter( \'query_vars\', \'wpd_query_vars\' );
接下来,我们添加一条规则。我们使用add_rewrite_rule 在这里如果我们只是添加而不是修改规则数组,那么使用它比rewrite_rules_array:

function wpd_add_rewrite(){
    add_rewrite_rule(
        \'latest/?$\',
        \'index.php?post_type=post&wpd_template=true\',
        \'top\'
    );
}
add_action( \'init\', \'wpd_add_rewrite\' );
注意,我们在这里设置了自定义查询变量,以便在下一步模板过滤器中检测它。我们还设置了简单post_type=post 获取按日期排序的默认最新帖子。

最后,过滤器强制archive.php 如果wpd_template var存在:

function wpd_home_template( $template ){
    global $wp_query;
    if( isset( $wp_query->query_vars[\'wpd_template\'] ) ){
        return locate_template( \'archive.php\', false );
    }
    return $template;
}
add_filter( \'home_template\', \'wpd_home_template\' );

SO网友:grazianodev

我认为你根本不需要重写规则。打开时,只需更改主查询即可archive.php, 像这样:

add_action( \'pre_get_posts\', \'show_all_posts\' );

function show_all_posts( $query ) {

    if( ! is_admin() && is_archive() && $query->is_main_query() {
        $query->set( \'post_status\', \'publish\' );  
    }

}
以上内容适用于所有存档页面。如果您只想在“最新”页面上使用,请按以下方式进行更改:

add_action( \'pre_get_posts\', \'show_all_posts\' );

function show_all_posts( $query ) {

    if( ! is_admin() && is_page( \'latest\' ) && $query->is_main_query() {
        $query->set( \'post_status\', \'publish\' );  
    }

}
如果您没有“最新”页面,可以创建一个页面并将其留空。然后,您可以创建一个名为latest.php 并将其分配到“最新”页面。在里面latest.php, 只需这样说:

get_template_part( \'archive\' );
它看起来就像你的archive.php 样板

UPDATE

如果您不想创建空白页,那么您可以创建一个“最新”类别,并为该类别页分配一个模板?我想,客户对某个类别做不了多少手脚。。。这并不意味着你必须将所有帖子添加到“最新”类别;你仍然需要使用pre_get_posts 更改主查询,使其不会仅返回“最新”类别中的帖子(实际上为空),而是返回所有类别中的帖子(因此,所有现有帖子)。

add_action( \'pre_get_posts\', \'show_all_posts\' );

function show_all_posts( $query ) {

    if( ! is_admin() && is_category( \'latest\' ) && $query->is_main_query() {
        $query->set( \'post_status\', \'publish\' );  
        $query->set( \'category__in\', $all_posts );  
    }

}
注意我的变化is_page( \'latest\' )is_category( \'latest\' ). 此外$all_posts 变量必须是包含所有类别ID的数组。我不知道你怎样才能做到这一点,但我想这一定很容易做到。

我从来没有测试过这个,这只是一个想法。希望有帮助!

结束

相关推荐

Custom archives function

我正在为我的教会网站建立一个自定义档案页面。在我的档案页上,我想把上周的布道放在一个特殊的盒子里,然后是未来的布道,最后是布道档案。我希望将来的布道和布道档案用标题隔开。。。i、 未来的布道布道档案布道档案。。。我的问题是,当我用分页功能点击按钮转到旧的布道帖子时,它会在我所在的每个归档页面上显示当前和未来的布道!如何使当前和未来的布道仅显示在第1页上,而不在单击查看旧帖子时显示?以下是我的功能:// Create the loop for the sermons page function se