Group posts by custom field

时间:2019-02-06 作者:Neelam Khan

我正在尝试使用显示所有子页面的列表wp_query 到目前为止,我已经创建了一个函数来检索当前页面的所有子页面,但是我需要按照自定义字段将这些页面排序为两个列表。

调用自定义字段type 它是一个具有以下值的选择字段:

productabout 我需要根据字段值将页面列表分为两组,但我似乎无法按自定义字段对其进行分组。

我需要输出为:

Product
- Page 1
- Page 2
- Page 3

About
- Page 1
- Page 2
- Page 3
到目前为止,我有一个所有页面的列表,无法将它们分开,也无法在它们之间添加自定义字段的值。

function get_child_pages($page_id, $post_type = \'page\')
{
    // Set up the objects needed
    $custom_wp_query = new WP_Query();
    $all_wp_pages = $custom_wp_query->query(array(\'post_type\' => $post_type, \'posts_per_page\' => -1, \'order\' => \'ASC\', \'orderby\' => \'meta_value\', \'meta_key\' => \'type\', \'value\' => \'Product\',));

    // Filter through all pages and find specified page\'s children
    $page_children = get_page_children($page_id, $all_wp_pages);

    return $page_children;
}

foreach (get_child_pages(wp_get_post_parent_id(get_the_ID())) as $s) {
  echo \'<li><a href="\' . get_the_permalink($s->ID) . \'">\' . get_the_title($s->ID) . \'</a></li>\';

}

1 个回复
最合适的回答,由SO网友:tmdesigned 整理而成

你很接近了。您有:

foreach (get_child_pages(wp_get_post_parent_id(get_the_ID())) as $s) {
  echo \'<li><a href="\' . get_the_permalink($s->ID) . \'">\' . get_the_title($s->ID) . \'</a></li>\';
}
我们需要在上面添加一层来显示这两个列表。然而,我们不能假设一种类型的帖子都会出现在一起(即一个类别的所有帖子,然后是下一个类别的所有帖子)。这意味着我们不能按照它进来的顺序把它全部吐出来。

下面是一种利用holding对象根据该字段的值对帖子进行分组的方法:

//this will hold the post IDs sorted by outer groups
$list_groups = array(); 

foreach (get_child_pages(wp_get_post_parent_id(get_the_ID())) as $s) {

    //get the category of this post
    $list_category = get_post_meta( $s->ID, "type", true );

    //if this is the first post of that category, initialize the array
    if ( ! isset( $list_groups[ $list_category ] ) ){
        $list_groups[ $list_category ] = array();
    }

    //add this post ID to that category in our holding array
    $list_groups[ $list_category ][] = $s->ID;

}

//at this point we have an array ($list_groups) that has an inner array of post IDs for each category

foreach ( $list_groups as $category_name => $category_posts ){

    echo "<div class=\'category-group\'><h2>$category_name</h2><ul>";

    foreach ( $category_posts as $category_post_id ){

        $p_permalink = get_the_permalink( $category_post_id );
        $p_title = get_the_title( $category_post_id );

        echo "<li><a href=\'$p_permalink\'>$p_title</a></li>";

    }

    echo "</ul></div>";

}
因此,我们首先创建了一个保持数组,其结果如下所示:

$list_groups
---Product
   ---10
   ---15
   ---33
---About
   ---5
   ---12
   ---55
它只是一个为每种类型保存数组的数组,在这些数组中是属于那里的帖子的ID。

然后我们循环遍历持有数组的对象,并按类别将其吐出。

旁注:您的wp\\u查询似乎将结果限制为两个类别中的一个。我可能误解了这一点,但如果你只得到一个类别,请检查它。

相关推荐

Separate First Post Loop

我正在尝试使用<?php rewind_posts(); ?> 在我的主页模板上使用两个循环的功能。有人知道如何停止最新帖子后的第一个循环吗?这是我的代码:<?php if (have_posts()) : while (have_posts()) : the_post(); ?> <h1><a href=\"<?php the_permalink(); ?>\"><