我正在使用我主题中的一些自定义WordPress查询。它们都很好用,除了通过帖子标题对它们进行排序之外,我需要按照父母的帖子标题按字母顺序对它们进行排序。
似乎没有'orderby'的默认参数来完成此任务,但我知道必须有一种方法可以完成它。
我的查询返回的所有帖子都是子帖子,所以他们都有父母。
仅供参考,这是一个显示我的格式的示例查询。也许我有CPT'书籍',每本书都有第1章,第2章等的帖子。如果我想列出每本书的所有“第1章”帖子,按书名按字母顺序排序:
// List Chapter 1 for all Books
function query_ch1() {
global $post;
$args = array(
'post_type' => 'book',
'name' => 'chapter-1',
'posts_per_page' => '-1',
'order' => 'ASC',
'orderby' => 'title'
);
$query_ch1 = new WP_Query( $args );
if ( $query_ch1->have_posts() ) {
while ( $query_ch1->have_posts() ) {
$query_ch1->the_post();
echo '<div class="col-xs-12">';
echo '<a href="'.get_permalink().'" title="'.get_the_title().'">';
echo get_the_title();
echo '</a>';
echo '</div>';
}
wp_reset_postdata();
}
}
然而,这当然会列出所有第1章的帖子,而不是父母的帖子。
非常感谢任何帮助,提前谢谢!
答案 0 :(得分:1)
这是你可以尝试的:
get_posts($args)
。$parents = [];
$parentTitle = get_the_title($post->post_parent)
。$parents
中的父密钥。类似于:$parents[$parentTitle][] = $post;
ksort($parents);
根据密钥对$parents
数组进行排序。现在,您可以遍历$parents
,然后遍历其posts
:
foreach ($parents as $posts) {
foreach ($posts as $post)
// Do stuff
}
}
答案 1 :(得分:0)
我不确定这是否是理想的做法(就效率等而言),但经过大量的实验后,我最终得到了预期的效果。
使用原始帖子中的示例,它将是:
// List Chapter 1 for all Books
function query_ch1() {
global $post;
$args = array(
'post_type' => 'book',
'post_parent' => '0',
'posts_per_page' => '-1',
'order' => 'ASC',
'orderby' => 'title'
);
$query_ch1 = new WP_Query( $args );
if ( $query_ch1->have_posts() ) {
while ( $query_ch1->have_posts() ) {
$query_ch1->the_post();
$children = get_children( array( 'post_parent' => $post->ID, 'name' => 'chapter-1' ) );
foreach ( $children as $post ) {
echo '<div class="col-xs-12">';
echo '<a href="'.get_permalink().'" title="'.get_the_title().'">';
echo get_the_title();
echo '</a>';
echo '</div>';
}
}
wp_reset_postdata();
}
}
所以在阅读了Melvin Koopmans的建议之后,我改变了我的查询以拉出顶级页面而不是孩子,以便他们被正确排序,然后嵌套get_children()和foreach($ children as $ post)来做东西。