まず第一に、私はこれを探して取り組んでみましたが、これを行うためのロジックやメソッドを作成できませんでした。
users
とcustom post type
のコンテンツを1つのloop
にまとめて表示しようとしています。 custom post type
を使ってWP_Query
の値を、そしてWP_USER_Query
を使ってusers
の値を取得することができます。同時に表示することもできます。しかし、投稿とユーザーは日付順に混在することはありません。
カスタムquery
を使ってこれを達成できるかどうかはわかりません。私の知識と経験はこの部分に限られています。
誰が私がこれを達成することができる方法について正しい方向に置くのを手伝うことができますか?
//編集と更新
ご意見ありがとうございました。私は私が本当に必要としていることと、それを達成しようとしている方法のアイデアの半分を挙げました。だから私はアイデア/シナリオから始めましょう。
一般的なアイデア:
今、私はdirectory.php
と呼ばれるページテンプレートを作成しました、そして、cpt assignment
とprojects
だけを表示するために次のループを使いました。
$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
まだ混乱しているかどうかを教えてください。
返された型がオブジェクトの場合は、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
}
}
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 );