排除父帖子并在存档中仅显示子帖子

Posted

技术标签:

【中文标题】排除父帖子并在存档中仅显示子帖子【英文标题】:Exclude parent posts and display only child posts in archive 【发布时间】:2016-02-11 17:41:34 【问题描述】:

我已完成此查询并且正在工作。我有很多子帖子,我计划在列出我的自定义帖子类型 city-guide 的存档页面时仅显示子帖子。 p>

$args = array(
'orderby' => 'date',
'order'   => 'DESC',
'post_type' => 'city-guide',
'posts_per_page' => 36,
'paged' => $paged
);

$query = new WP_Query( $args );

?>
    <?php $i=1; while( $query->have_posts() ): $query->the_post(); ?>


.....

我试过了

 $all = get_posts(array('post_type'=> 'city-guide', 'posts_per_page' => -1));
 $parents = array();
 foreach ($all as $single)
 
    $kids = get_children($single->ID);  
    if(isset($kids) && !empty($kids) && count($kids) >= 1)
    
        $parents[] = $single->ID;
    
  

$args = array(
'orderby' => 'date',
'order'   => 'DESC',
'post_type' => 'city-guide',
'post__not_in' => $parents,
'posts_per_page' => 36,
'paged' => $paged
);

$query = new WP_Query( $args );

 ?>
    <?php $i=1; while( $query->have_posts() ): $query->the_post(); ?>


....

这不起作用。请帮我找出我哪里出错了。

【问题讨论】:

【参考方案1】:

我知道这是一个老问题,但希望我能帮助那些在这里找到自己的路的人寻找与我相同的东西。

您可以通过使用“post_parent__not_in”参数排除任何 post_parent = 0 的帖子来仅显示子帖子:

$args = array(
    'orderby' => 'date',
    'order'   => 'DESC',
    'post_type' => 'city-guide',
    'posts_per_page' => 36,
    'paged' => $paged,
    'post_parent__not_in' => array(0)
);

这避免了遍历每个父帖子以获取每个孩子的需要。

【讨论】:

如此简单有效。谢谢!【参考方案2】:

我看到您正在尝试将 ID 推送到数组中,但为什么不只是在循环它们时使用 ID,同时让子项进入循环?下面的例子是我将如何解决这个问题。

<?php
$args = array(
    'orderby' => 'date',
    'order'   => 'DESC',
    'post_type' => 'city-guide',
    'posts_per_page' => 36,
    'paged' => $paged
    );

$query = new WP_Query( $args );

$i=1; while( $query->have_posts() ): $query->the_post();

$parentID = get_the_ID();

$childrenArgs = array(
            'post_type' => 'page',
            'post_parent' => $parentID ,
            );

        $children = get_children($childrenArgs);

        foreach ($children as $child)

            echo '<h1>' . $child -> post_title . '</h1>';

            $content = $child -> post_content;
            $content = apply_filters('the_content', $content);
            $content = str_replace(']]>', ']]&gt;', $content);
            echo $content;
        

endwhile;

?>

【讨论】:

【参考方案3】:

我认为您需要调查pre_get_posts 的操作。在你的functions.php中这样的东西就可以了。

function namespace_custom_query_vars( $query ) 
  if ( !is_admin() && $query->is_main_query()) 
    if ( $query->query["post_type"] == 'custom_post_type' ) 
      $query->set( 'post_parent__not_in', 0 );
    
  
  return $query;

add_action( 'pre_get_posts', 'namespace_custom_query_vars' );

关于这个here 有一篇不错的帖子。但请注意,此页面上的代码不会针对小的语法错误进行编译。

【讨论】:

【参考方案4】:

使用关系怎么样?一个简单的析取联合应该具有魅力。

$args = array(
    'post_type'      => POST_TYPE,
    'posts_per_page' => 36,
    'orderby'        => 'date',
    'order'          => 'DESC',
    'tax_query'      => array(
                            'relation' => 'AND',
                            array(
                                'taxonomy' => POST_TAXONOMY,
                                'field'    => 'slug',
                                'terms'    => $tax_slug,
                                'include_children' => true
                            ),
                            array(
                                'taxonomy' => POST_TAXONOMY,
                                'field'    => 'slug',
                                'terms'    => $tax_slug,
                                'include_children' => false,
                                'operator' => 'NOT IN'
                            )
                        )
);

或者有什么理由不考虑这个?

【讨论】:

以上是关于排除父帖子并在存档中仅显示子帖子的主要内容,如果未能解决你的问题,请参考以下文章

PHP 仅显示父自定义帖子类型的子帖子,而不是所有子帖子

仅显示父自定义帖子类型的子帖子,而不是所有子帖子

在自定义RSS提要中仅打印帖子的父类别

使用存档页面中的 ACF 字段进行自定义帖子

如何在 Flutter 中仅显示一英里内的帖子

按年份“query_posts()”问题的 Wordpress 存档