如果可用,则返回子帖子,否则返回父帖子

时间:2018-07-07 作者:Shamim Hasan

如何使用WP\\u查询(或直接sql)并返回子帖子(如果可用),否则返回父帖子?

示例代码:

$args = array(
    \'post_type\' => \'my-cpt\',
    \'post_status\' => \'publish\',
);
$query = new WP_Query( $args );
我的目标是,如果任何帖子(我的cpt)有子帖子,那么返回最后一个子帖子,否则返回父帖子。

假设:跟随我的帖子

父级1

子-1-父-1

因此,我想通过查询child-2-parent-1、parent-2和child-1-parent-3返回

如何修改我的查询来实现这一点?

1 个回复
SO网友:Robert Gres

这个任务至少需要2个查询,因为它是不规则的。例如

// collect all child posts
$allChildPosts = get_posts([
  \'post_parent__not_in\' => [0],
  \'posts_per_page\' => -1,
]);

// list child posts and filter one post by parent id
$childPosts = [];
foreach ($allChildPosts as $post) {
    $childPosts[$post->post_parent] = $post;
}

// get all parent level posts without descendants
$lonelyPosts = get_posts([
  \'post_parent__not_in\' => array_keys($childPosts),
  \'posts_per_page\' => -1,
]);

$allPosts = array_merge($childPosts, $lonelyPosts);
// As a drawback, you\'d have to sort them manually, since they are glued together
usort($allPosts, \'sorting_function\');
第一种方法仅使用2个db查询,但在大量发布时效率会很低

第二种方法:

// get all parent posts
$parentPosts = get_posts([
  \'post_parent\' => 0,
  \'posts_per_page\' => -1,
]);

$allPosts = [];
foreach ($parentPosts as $post) {
    $descendants = get_posts([
      \'post_parent\' => $post->ID,
      \'posts_per_page\' => 1,
      \'orderby\' => \'whatever\'
    ]);
    if ($descendants) {
        $allPosts[] = $descendants[0];
    } else {
        $allPosts[] = $post;
    }
}
第二个更直接,还允许排序后代(否则如何理解哪一个必须是最后一个?),但既然numberOfParentPosts + 1 查询如果有大量的父帖子,它将变得效率低下。

如果您需要真正高效的解决方案,那么必须手动编写聪明的MySQL。

但请随时证明我错了:)

结束

相关推荐

WPQuery循环未提供预期输出

我试图获得3页,销售,出租和农业,以显示他们的自定义分类属性。出租和农业运作良好,但出于某种原因,销售显示出所有类别的房地产。我已经尝试了我能想到的一切,但似乎都不起作用,所以我想知道这里是否有人有什么想法?请使用WPQuery查看下面的代码。我已经检查了我的WP安装,并且在没有Sales自定义分类类型的Sales中肯定会显示属性。然而,出租和农业的代码是一样的,它们工作得很好。同样在销售中,分页似乎被破坏了,显示了9个可能的页面,然后当我单击第2页时,它会下降到4页。同样,其他类别也可以。我真的很感谢你