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

时间:2016-02-11 17:41:34

标签: wordpress parent-child archive

我已经完成了这个查询并且正在工作。我有很多子帖,我打算在列出我的自定义帖子类型 city-guide 的存档页面时只显示子帖。

$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(); ?>

{
....
}

这没用。请帮我找出错误的地方。

4 个答案:

答案 0 :(得分:4)

我知道这是一个古老的问题,但希望我能帮助那些在这里寻找同样事情的人。

您可以使用&post; post_parent__not_in&#39; post_parent__not_in&#39;排除任何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)
);

这样就无需循环遍历每个父帖子来获取每个孩子。

答案 1 :(得分:0)

我看到你正在尝试将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;

?>

答案 2 :(得分:0)

我认为你需要调查行动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,这是一篇不错的帖子。虽然请注意,此页面上的代码不会针对小的语法错误进行编译。

答案 3 :(得分:0)

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

$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'
                            )
                        )
);

或者有没有理由不考虑这个?