排除父帖子并在存档中仅显示子帖子
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(']]>', ']]>', $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'
)
)
);
或者有什么理由不考虑这个?
【讨论】:
以上是关于排除父帖子并在存档中仅显示子帖子的主要内容,如果未能解决你的问题,请参考以下文章