如何为所有没有帖子格式的帖子创建存档?

时间:2014-01-11 作者:Jan Beck

标题说明了一切。我需要工作分页,正确的职位计数等基本上是一个新的页面的职位,但与后格式的过滤器。

到目前为止我已经尝试过的事情:

1) 已为创建新的重写规则/no-formats/ 获取加载主页的页面的id。php并附加参数(?no\\u post\\u format=true)。然后连接到“pre\\u get\\u posts”,检查该参数,并在主查询中添加一个tax\\u查询,该查询排除所有具有post格式的帖子。这不起作用,因为对主页的重写规则会导致重定向到实际主页。所以/没有格式/变成/主页/我的论点丢失了。

不是实际的代码,而是让您了解我的意思:

add_rewrite_rule( \'no-formats/?$\', \'index.php?p=\'. get_option( \'page_for_posts\' ) . \'&no_post_format=true\', \'top\' );
2)创建了一个新页面,并尝试复制显示帖子的页面的行为,并添加了提到的tax\\u query exclude。我只是想不出任何方法来复制主页。可能需要深入挖掘WP核心。

有人有什么想法可以把我推向正确的方向吗?

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

对我来说,我使用了一种稍微不同的方法:

使用endpoint 创建url,如http://example.com/no-formats/pre_get_posts 如果需要,设置正确的查询filter template_include 强制WP使用home.php 不再复制它。

add_action(\'init\', \'add_no_format_endpoint\');

function add_no_format_endpoint() {
  add_rewrite_endpoint( \'no-formats\', EP_ROOT );
}

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

function handle_no_format( $q ) {
  if ( $q->is_main_query() && is_home() && isset( $q->query[\'no-formats\'] ) ) {
    unset( $q->query[\'no-formats\'] );
    $q->is_home = FALSE; // <- add this if you have setted a static page as frontpage
    $tax_q =  array(
      \'taxonomy\' => \'post_format\',
      \'field\' => \'id\',
      \'operator\' => \'NOT IN\',
      \'terms\' => get_terms( \'post_format\', array( \'fields\' => \'ids\' ) )
    );
    $q->set( \'tax_query\', array( $tax_q) );
    add_filter( \'template_include\', \'force_home_template\', 999 );
  }
}

function force_home_template() {
  return locate_template( array( \'home.php\', \'index.php\' ), FALSE );
}
请记住访问仪表板中的“设置”->“永久链接”,刷新重写规则。

SO网友:Chip Bennett

编辑注:您可以对自定义页面模板使用相同的技术,通过new WP_Query():

// Post Formats
$post_formats_array = array(
    \'post-format-aside\',
    \'post-format-audio\',
    \'post-format-chat\',
    \'post-format-gallery\',
    \'post-format-image\',
    \'post-format-link\',
    \'post-format-status\',
    \'post-format-quote\',
    \'post-format-video\'
);
// Custom query args
$standard_posts_query_args = array(    
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'post_format\',
            \'field\' => \'slug\',
            // Use array defined above,
            // or try omitting \'terms\' entirely
            \'terms\' => $post_formats_array,             
            \'operator\' => \'NOT IN\'
        )
    )
);
// Custom query
$standard_posts = new WP_Query( $standard_posts_query_args );

// Custom query loop
if ( $standard_posts->have_posts() ) : while ( $standard_posts->have_posts() ) : $standard_posts->the_post();
    // Loop markup here
endwhile; endif;
分页

对于分页,please refer to this Question/Answer.

原始答案

为什么不将具有帖子格式的帖子从主帖子存档中排除?

function wpse129372_filter_posts_archive( $query ) {
    if ( $query->is_main_query && $query->is_archive() ) {
        $post_formats_array = array(
            \'post-format-aside\',
            \'post-format-audio\',
            \'post-format-chat\',
            \'post-format-gallery\',
            \'post-format-image\',
            \'post-format-link\',
            \'post-format-status\',
            \'post-format-quote\',
            \'post-format-video\'
        );
        $tax_query = array(
            array(
                \'taxonomy\' => \'post_format\',
                \'field\' => \'slug\',
                // Use array defined above,
                // or try omitting \'terms\' entirely
                \'terms\' => $post_formats_array,             
                \'operator\' => \'NOT IN\'
            )
        );
        $query->set( \'tax_query\', $tax_query );
    }
}
add_action( \'pre_get_posts\', \'wpse129372_filter_posts_archive\' );
这与(我假设)自定义模板文件(或自定义页面模板)一起用于具有帖子格式的帖子,将是一种在归档索引中仅显示“标准”帖子的非常简单的方法。

结束