问题
您在掌握问题时遇到的问题是“我怎么做X?” 这不是第一步操作,而是一个多步骤过程,需要分解。
您不需要这样做:
get all the posts that are a child of X ordered by meta
您需要这样做:
get all the posts that are a child of X
for each child, get all the posts that are a child
foreach child of that child get all the posts that are a child
...
hmmm we don't have any more children left
Take our list of posts and order them by meta
通用解决方案
因此,要了解如何无限执行直到结束,而无需对其进行硬编码,则需要了解递归函数。
例如
function make_zero( $amount ) {
$amount = $amount - 1;
if ( $amount > 1 ){
return make_zero( $amount );
}
return $amount;
}
将递归应用于此问题以寻求解决方案
因此,您的父母是$parid
,并且您的帖子元密钥为$metakey
。
让我们将其传递给一个函数以获取其子级。
$children = get_children_with_meta( $parid, $metakey );
然后,我们将对$ children数组进行排序,键将是发布ID,而值将是元值。
asort($children);
并将函数定义为:
function get_children_with_meta( $parent_id, $metakey ) {
$q = new WP_Query( array( 'post_parent' => $parent_id, 'meta_key' => $metakey ));
if ( $q->have_posts() ) {
$children - array();
while ( $q->have_posts() ) {
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
}
return $children;
} else {
// there are no children!!
return array();
}
}
这为您提供了一个帖子ID和值的数组,按从低到高的顺序排列。您可以使用其他PHP排序功能从最高到最低进行排序。
现在孩子们的孩子呢?
在循环的中间,我们需要进行递归调用,传入子代而不是父代ID。
所以这:
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
变成这个:
$q->the_post();
$meta_value = get_post_meta(get_the_ID(), $metakey, true );
$children[get_the_ID() ] = $meta_value;
// now get the childrens children
$grandchildren = get_children_with_meta( get_the_ID(), $metakey );
// merge the grandchildren and the children into the same list
$children = array_merge( $children, $grandchildren );
通过此修改,该功能现在可以检索孩子,孩子的孩子,孩子的孩子的孩子……等
最后,您可以修剪数组上的值以获取如下所示的ID:
$post_ids = array_keys( $children );
$q = new WP_Query( array( 'post__in' => $post_ids );
// etc
使用此策略,您可以将meta键值替换为任何其他指标,或者以其他方式使用递归函数。
由于完整的代码只需要几秒钟的基本理解和快速的复制粘贴,因此我不会用完整的复制粘贴代码块来侮辱您的智慧。
优点
- 修改后适用于任何帖子类型和数据形式
- 可以修改以生成嵌套标记
- 通过将返回的数组置于瞬态状态,轻松缓存以加快速度
- 可以通过将分页应用于末尾WP_Query来进行分页设置
您会遇到的问题
- 在找到孩子之前,您无法知道他们有多少个孩子,因此性能成本不会增加
- 您想要的内容会产生很多查询,并且由于涉及的潜在深度,其固有的成本很高。
我的建议
我建议您要么展平页面层次结构,要么改用分类法。例如,如果您要对帖子进行评分,请使用第1,2、3、4和5等术语进行页面评分分类。这将为您提供开箱即用的帖子列表。
或者,使用导航菜单并完全绕开此问题