Wp_Query和wp_User_Query的单循环

时间:2018-06-28 作者:Dilip Gupta

首先,我尝试搜索并处理这个问题,但无法创建逻辑或方法。

我想展示userscustom post type 将内容合并为单个loop. 我可以得到custom post type 使用WP_Queryusers 使用WP_USER_Query. 我可以同时显示它们。但这样一来,帖子和用户就不会按日期顺序混合。

我不确定我是否可以通过定制来实现这一点query. 我在这方面的知识和经验有限。

有谁能帮我找到正确的方向,告诉我如何才能做到这一点?

编辑和更新

谢谢大家的评论,我相信我已经给出了我真正需要什么以及如何实现它的一半想法。因此,我将从想法/场景开始。

总体思路:

我有自定义的帖子类型,我们称之为“作业”和“项目”directory.php 并使用以下循环仅显示cptassignmentprojects.

$args = array(
    \'post_type\' => array(\'assigment\', \'project\'),
    \'post_status\' => \'publish\',
    \'order\' => \'ASC\'
);

$query = new WP_query( $args );
然后像这样循环

<?php if ( $query->have_posts() ) : ?>

    <?php
    while ( $query->have_posts() ) :
        $query->the_post();

        get_template_part( \'template-parts/content\', get_post_type() );

    endwhile;

    the_posts_navigation();

else :

    get_template_part( \'template-parts/content\', \'none\' );

endif;
wp_reset_postdata();
?>
代码正在运行,但请关注语法错误(如果有)。现在是用户部分。我是这样写的。

$user = new WP_User_Query(array(\'role\'=> \'teacher\'));

if (!empty($user)) {
    foreach ($user as $teacher) {
        echo $teacher->first_name;
    }
}
您可以了解我如何使用用户的基本想法。

The main Question

如何在post循环中合并用户,以便用户和帖子以4x4的网格显示,并按时间戳排序?

例如,下面是创建日期。

教A(2018年6月10日)教B(2018年6月12日)教C(2018年6月15日)分配1(2018年6月16日)分配2(2018年6月18日)教D(2018年6月20日)项目1(2018年6月22日)

然后我在4x4网格中显示如下。

设定A设定B螺柱C分配1分配2螺柱D项目1

如果还不清楚,请告诉我。

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

当返回的类型为对象时,不能合并两个不同的查询,因为它们具有不同的方法和属性。相反,您可以将它们作为数组获取。然后可以合并它们并比较日期。为此,我将使用get_posts() 结束WP_Query(), 和get_users() 结束WP_User_Query() 为了实现这一点。

代码本身应该是不言自明的。

// Get a list of users
$users = get_users ();

// Get an array of posts. Don\'t forget to set the args
$posts = get_posts();

// Let\'s merge these two
$users_posts = array_merge( $users, $posts );

// Now, let\'s sort both of them based on 
// their dates. a user object holds the date
// as `user_registered`, while a post object
// holds the date as `post_date`. We use the
// usort() function to do so.
usort( $users_posts, "sort_users_and_posts" );

// Function to sort the array
function sort_users_and_posts( $a, $b ){

    // Here\'s the tricky part. We need to get the
    // date based on the object type, and then compare them.

    // Get the date for first element
    if( $a instanceof WP_User ){
        $first_element_date = strtotime ( $a->user_registered );
    } else {
        $first_element_date = strtotime ( $a->post_date );
    }

    // Get the date for second element
    if( $b instanceof WP_User ){
        $second_element_date = strtotime ( $b->user_registered );
    } else {
        $second_element_date = strtotime ( $b->post_date );
    }

    // Now let\'s compare the dates

    // If the dates are the same
    if ( $first_element_date == $second_element_date ) return 0;

    // If one is bigger than the other
    return ( $first_element_date < $second_element_date ) ? -1 : 1;

}

// Now, we run a foreach loop and output the date.
// We need to check again whether the object is an
// instance of WP_Post or WP_User
foreach ( $users_posts as $object ) {
    if( $object instanceof WP_Post ){
        // This is a post
    } else {
        // This is a user
    }
}

SO网友:kierzniak

您可以创建另外两个自定义帖子类型teacher和student,它们将从您的WordPress用户继承。

          +------+
     +----+ User +----+
     |    +------+    |
     |                |
     |                |
     v                v
+----+----+      +----+----+      +---------+      +------------+
| Teacher |      | Student |      | Project |      | Assignment |
+---------+      +---------+      +---------+      +------------+
您可以使用帖子元字段将WordPress用户与教师/学生帖子类型关联起来。

此数据结构将允许您为所有资源创建单个循环。

$args = array(
    \'post_type\' => array( \'teacher\', \'student\', \'assigment\', \'project\' ),
    \'order\' => \'ASC\'
);

$query = new WP_query( $args );

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post