在日期存档页面上仅显示引用类别的帖子

时间:2015-01-30 作者:user3848698

我正在类别中使用wp\\u get\\u archive()。php。

如果我在类别=2的页面上,它应该只显示该类别的档案。然而,它适用于所有类别。以下是我的分类代码。php以及归档。php

<?php get_header(); ?>
 <?php 
   $args =array(               
                \'posts_per_page\' =>1,                 
           );
  $loop = new WP_Query( $args );                                            
  if($loop->have_posts()):while ( $loop->have_posts() ): $loop->the_post();
   the_content();
  endwhile;
  endif;
 ?>
 <?php wp_get_archives( array( \'type\' => \'daily\') ); ?>
第一部分是显示特定类别的存档,这段代码解决了这一问题,多亏了Pieter Goosen——他在How do I change the sql query for wp_get_archive()

但现在的问题是,如果我从分类页面转到该归档,我还需要只显示该分类中的帖子。

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

在我再次开始之前,我只想强调一个事实,即您不应该在归档页面上运行自定义查询来代替主查询。请参见this post 了解何时应使用自定义查询,何时不应使用自定义查询。如果您不切换回默认循环,那么我的解决方案将不起作用

在上一篇文章中,我们已经解决了仅显示当前查看类别中的档案的问题。下一个问题是,当您访问当前类别中的日期存档时,仅显示当前类别中的帖子

为了实现这一点,我们将使用以下过滤器和操作

为了让日期档案页面知道请求是否来自类别页面,并只提供该类别的帖子,我们需要设置某种类型的推荐人。像wp_get_referer()$_SERVER[\'HTTP_REFERER\'] 非常不可靠(请参见this post 更多信息),我们将在URL中使用额外的参数来设置值,我们将检查这些值并使用这些值来确定要提供哪些帖子。为了实现这一点,我们将设置一个新的查询变量cq 将保存当前类别ID。

接下来,我们需要修改wp_get_archives() 当它们显示在类别页面上时。我们需要将类别ID添加到URL中,以便在归档页面上更改主查询时可以读取类别ID。要更改链接以包含自定义查询变量,我们将使用get_archives_link 筛选以更改链接和add_query_arg 将自定义查询变量添加到新链接的步骤

现在我们有了新的链接,如果单击类别页面中的链接,您将在日期存档页面上看到类似的内容添加到您的URL中?cq=21. 21 是我的测试站点中的类别ID。

现在,无论何时在日期存档页面上,我们都必须检查新的quey变量是否附加到URL。我们将使用filter_input( INPUT_GET, \'cq\', FILTER_VALIDATE_INT ); 要获取值,请清理并验证URL中的值。如果将新的查询变量附加到URL,我们需要调整主查询,以仅返回ID作为值添加到的类别中的帖子cq. pre_get_posts 将在此处使用

以下是完整的代码:

add_filter( \'query_vars\', function ( $vars ) {

    $query_vars = [
        \'cq\'  
    ];
    $vars = array_merge( $vars, $query_vars );

    return $vars;

});


add_filter( \'get_archives_link\', function ( $link_html ) {

    if( is_category() ) {

        preg_match ( "/href=\'(.+?)\'/", $link_html, $url );

        $old_url = $url[1];
        $new_url = add_query_arg( [\'cq\' => get_queried_object_id()], $old_url );
        $link_html = str_replace( $old_url, $new_url, $link_html );

    }

    return $link_html;

});

add_action( \'pre_get_posts\', function ( $q ) {

    $cat_id = filter_input( INPUT_GET, \'cq\', FILTER_VALIDATE_INT );
    if(     !is_admin() // Target only the front end
         && $q->is_main_query() // Target only the main query
         && $q->is_date() // Only target the date archive pages
         && $cat_id // Only run the condition if we have a valid ID
    ) {

        $q->set( \'cat\', $cat_id );

    }
});

SO网友:Caio Bleggi

补充@Pieter Goosen 难以置信的解决方案我不得不为过滤器的get\\u archives函数添加一个WHERE和JOIN子句,只带来与类别关联的帖子相关的期间:

/* Add category WHERE parameter to the get_archives function */
function categories_archive_where($sql_where, $parsed_args){
    global $wpdb;
    $cat_id = get_query_var(\'cq\') ?: (is_category() ? get_queried_object_id() : false);
    if($cat_id){
         $sql_where = $wpdb->prepare("WHERE post_type = %s AND post_status = \'publish\' AND {$wpdb->term_relationships}.term_taxonomy_id = %s", $parsed_args[\'post_type\'], $cat_id);
    }
    return $sql_where;
}
add_filter(\'getarchives_where\', \'categories_archive_where\', 99, 2);

/* Add category JOIN parameter to the get_archives function */
function categories_archive_join($sql_join){
    global $wpdb;
    $cat_id = get_query_var(\'cq\') ?: (is_category() ? get_queried_object_id() : false);
    if($cat_id){
         $sql_join = "JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id";
    }
    return $sql_join;
}
add_filter(\'getarchives_join\', \'categories_archive_join\', 99, 1);

结束