web-dev-qa-db-ja.com

Wp_queryとwp_user_queryの単一ループ

まず第一に、私はこれを探して取り組んでみましたが、これを行うためのロジックやメソッドを作成できませんでした。

userscustom post typeのコンテンツを1つのloopにまとめて表示しようとしています。 custom post typeを使ってWP_Queryの値を、そしてWP_USER_Queryを使ってusersの値を取得することができます。同時に表示することもできます。しかし、投稿とユーザーは日付順に混在することはありません。

カスタムqueryを使ってこれを達成できるかどうかはわかりません。私の知識と経験はこの部分に限られています。

誰が私がこれを達成することができる方法について正しい方向に置くのを手伝うことができますか?


//編集と更新

ご意見ありがとうございました。私は私が本当に必要としていることと、それを達成しようとしている方法のアイデアの半分を挙げました。だから私はアイデア/シナリオから始めましょう。

一般的なアイデア:

  1. 私はカスタム投稿タイプを持っています、それを "課題"と "プロジェクト"と呼びましょう。
  2. 私はそのサイトにユーザーがいます、彼らを "先生"と "学生"と呼びましょう。
  3. 複数の先生が複数の生徒に「課題」と「プロジェクト」を割り当てることができます。
  4. 今、私はすべて(教師、学生、課題、そしてプロジェクト)を表示したい「ディレクトリ」ページがあります。
  5. フロントエンドでは、私は4x4のグリッドのようにサムネイル表示で各cptエントリとユーザーを表示したいと思います。

今、私はdirectory.phpと呼ばれるページテンプレートを作成しました、そして、cpt assignmentprojectsだけを表示するために次のループを使いました。

$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;
    }
}

あなたは私がどのようにユーザーを使うことができるかの基本的な考えを得ます。

主な質問

ユーザーを投稿ループ内でマージして、ユーザーと投稿を4 x 4のグリッドに表示し、タイムスタンプ順に並べ替えるにはどうすればよいですか。

たとえば、作成日には次のようになります。

教えるA(2018年6月10日)教えるB(2018年6月12日)Stud C(2018年6月15日)割り当てる1(2018年6月16日)割り当てる2(2018年6月18日)Stud D(2018年6月20日)Proj 1 (2018年6月22日)

それから私はこのように4x4のグリッドに表示します。

教えるA教えるBスタッドC割り当てる1割り当てる2スタッドDプロジェクト1

まだ混乱しているかどうかを教えてください。

6
Dilip Gupta

返された型がオブジェクトの場合は、2つの異なるクエリをマージすることはできません。これらは異なるメソッドとプロパティを持つためです。代わりに、それらを配列として取得できます。その後、それらをマージして日付を比較できます。これを実現するために、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
    }
}
4
Jack Johansson

WordPressユーザーから継承する2つのカスタム投稿タイプ、教師と生徒を作成できます。

          +------+
     +----+ User +----+
     |    +------+    |
     |                |
     |                |
     v                v
+----+----+      +----+----+      +---------+      +------------+
| Teacher |      | Student |      | Project |      | Assignment |
+---------+      +---------+      +---------+      +------------+

投稿メタフィールドを使用して、WordPressユーザーを教師/生徒の投稿タイプに関連付けることができます。

このデータ構造により、すべてのリソースに対して単一のループを作成できます。

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

$query = new WP_query( $args );
3
kierzniak