あなたが私を助けることができれば私は本当に感謝します:)私は非常に立ち往生しているし、続行する方法がわからない。
私はevent
というカスタム投稿タイプと2つのカスタム分類法を登録しています。
event_type
(イベントタイプ:例:ヨガ、音声作品)event_location
(イベント開催場所外:イギリス - >ブライトン、ロンドン;ヨーロッパ - >パリ)。ウェブサイトにはYoga -> Upcoming events
のようなページがあります。 Voice work -> Upcoming workshops
。どのページにアクセスしているかに応じて、適切なイベントを表示します。たとえば、私たちがYoga -> Upcoming events
ページにいる場合、すべてのevent
カスタム投稿をヨガであるevent_type
で表示してから、event_location
分類用語で結果をグループ化したいと思います。たとえば、イギリス、ブライトン、次にイギリス、ロンドン、そしてヨーロッパ、パリなどのすべてのヨガイベントをリストします。
私が現在テンプレートで行っていることは以下のとおりです。
event_type
タクソノミのすべての用語のスラグを取得しています。それらにはイベントが関連付けられています。event_type
分類学用語でevent
投稿を取得します。これはうまくいくようです。しかし、結果は順不同で戻ってきたので、それらをevent_location
分類学用語で順序付けしたいと思います。例えば:
英国
ヨーロッパ
私はまた、期限切れでないevent
投稿のみを表示し、それらをevent_date
で順序付けしたいと思います。 event_date
値は、他のevent
投稿詳細と共に単一のmeta_keyの下にメタ値として格納されます。
これが私のコードです。
//pull in the appropriate events depending on the page type: yoga/voice work
/* get the ancestors and current page slugs */
// collect ancestor pages
$relations = get_post_ancestors($post->ID);
// add current post to pages
array_Push($relations, $post->ID);
// get pages slugs
$relations_slugs = array();
foreach($relations as $page_ID){
$page = get_page($page_ID);
array_Push($relations_slugs, $page->post_name);
}
/* get the term slugs (non-empty) for event_type taxonomy */
//get the event_type taxonomy values
$event_types = get_terms( 'event_type', 'hide_empty=true' );
$event_types_slugs = array();
foreach($event_types as $event_type){
array_Push($event_types_slugs, $event_type->slug);
}
/* find what event_type to display on the current page */
$page_event_types = array_intersect($relations_slugs, $event_types_slugs);
$page_event_types_string = implode(",",$page_event_types);
/* find the events of the event_type to display on the current page */
$args = array(
'post_type' => 'event',
'tax_query' => array(
array(
'taxonomy' => 'event_type',
'field' => 'slug',
'terms' => $page_event_types_string
)
)
);
$temp = $wp_query; //assign orginal query to temp variable for later use
$wp_query = null;
$wp_query = new WP_Query($args);
/* run the loop to output the event's details */
get_template_part( 'loop', 'event-details' );
私はSQL文を構築するのが得意ではありません。あなたが私を助けることができれば私は本当に感謝します。どうもありがとうございました!!!
EDIT
私は機能をかなり単純化しました(私は元の機能ではかなり混乱して紛失したので)。私の答えを見てください。
時間を割いて助けてくれてくれてありがとう@Bainternet!
私はこれと少し混乱しました。最後に、イベントをevent_location
カテゴリでグループ化しないで機能を単純化することにしました。
私が代わりにしたことは以下の通りです:
私はURLを見ることによって何のevent_type
イベントが表示されるべきかを検出します。それから、そのevent_type
のすべてのイベントを表示し、それらをevent_date
ASCの順に並べます。ここでのURLは/events?type=event_type
という形式です。
私はすべてのevent_location
カテゴリ用語を含むサイドバーを提示します。ユーザーはリンクをクリックすることで特定の場所にあるすべてのイベントを見ることができます。この場合のURLのフォーマットは/events?location=event_location
です。その特定の場所を除くすべてのタイプのイベントがASC(すぐに最初に現れるもの)の順に表示されます。
それから私のカスタムクエリに私は'tax_query'
を含めます。たとえば、event_location
分類法では、次のようになります。
$wp_query['tax_query'] = array('taxonomy' => 'event_location',
'field' => 'slug',
'terms' => $_GET['location']
)
誰かに役立つことを願っています。
scribuとMikeが作成した term idで投稿をグループ化するこの派手な関数を使ってみてください :
function event_clauses( $clauses, $wp_query ) {
global $wpdb;
if ( isset( $wp_query->query['orderby'] ) && 'event_location' == $wp_query->query['orderby'] ) {
$clauses['join'] .=<<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
$clauses['where'] .= " AND (taxonomy = 'event_location' OR taxonomy IS NULL)";
$clauses['groupby'] = "object_id";
$clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
$clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ? 'ASC' : 'DESC';
}
return $clauses;
}
args配列に追加する'orderby' => 'event_location'
クエリの追加前
add_filter( 'posts_clauses', 'event_clauses', 10, 2 );
クエリ追加後
remove_filter( 'posts_clauses', 'event_clauses');
@Bainternetが示唆しているように、フィルタを動かすことができませんでした。 SQL全体を構築しようとしましたが、うまくいかないので、何か問題を起こしていると確信しています。ありがとうございます。
当分の間、event_type
およびevent_date
メタキー値をハードコーディングしました。
SELECT posts.*
FROM wp_posts as posts
LEFT OUTER JOIN wp_postmeta as postmeta ON posts.ID = postmeta.post_id
LEFT OUTER JOIN wp_term_relationships as relationships ON posts.ID = relationships.object_id
LEFT OUTER JOIN wp_term_taxonomy as taxonomy ON relationships.term_taxonomy_id = taxonomy.term_taxonomy_id
LEFT OUTER JOIN wp_terms as terms ON taxonomy.term_id = terms.term_id
WHERE posts.post_type = 'event' AND posts.post_status = 'publish'
AND postmeta.meta_key = 'event_date' AND postmeta.meta_value >= '2011-02-02'
AND terms.slug = 'kirtan' AND taxonomy.taxonomy = 'event_type' AND taxonomy.count > 0
GROUP BY taxonomy.taxonomy
ORDER BY terms.slug ASC, postmeta.meta_value ASC