web-dev-qa-db-ja.com

カスタム分類タイプ用語でカスタム投稿タイプの投稿をグループ化する方法

あなたが私を助けることができれば私は本当に感謝します:)私は非常に立ち往生しているし、続行する方法がわからない。

私はeventというカスタム投稿タイプと2つのカスタム分類法を登録しています。

  1. タグのような機能を持つevent_type(イベントタイプ:例:ヨガ、音声作品)
  2. カテゴリライクな機能を持つevent_location(イベント開催場所外:イギリス - >ブライトン、ロンドン;ヨーロッパ - >パリ)。

ウェブサイトにはYoga -> Upcoming eventsのようなページがあります。 Voice work -> Upcoming workshops。どのページにアクセスしているかに応じて、適切なイベントを表示します。たとえば、私たちがYoga -> Upcoming eventsページにいる場合、すべてのeventカスタム投稿をヨガであるevent_typeで表示してから、event_location分類用語で結果をグループ化したいと思います。たとえば、イギリス、ブライトン、次にイギリス、ロンドン、そしてヨーロッパ、パリなどのすべてのヨガイベントをリストします。

私が現在テンプレートで行っていることは以下のとおりです。

  1. 現在のページとその先祖のスラッグを取得します。
  2. 私はevent_typeタクソノミのすべての用語のスラグを取得しています。それらにはイベントが関連付けられています。
  3. 以前に収集した値を交差させることによって、表示するイベントタイプを決定します。
  4. それからWP_Queryを構築して、決められたevent_type分類学用語でevent投稿を取得します。

これはうまくいくようです。しかし、結果は順不同で戻ってきたので、それらをevent_location分類学用語で順序付けしたいと思います。例えば:

  • 英国

    • ブライトン
      • イベント1
      • イベント2
    • ロンドン
      • イベント3
  • ヨーロッパ

    • パリ
      • イベント4

私はまた、期限切れでない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!

1
dashaluna

私はこれと少し混乱しました。最後に、イベントをevent_locationカテゴリでグループ化しないで機能を単純化することにしました。

私が代わりにしたことは以下の通りです:

  1. 私はURLを見ることによって何のevent_typeイベントが表示されるべきかを検出します。それから、そのevent_typeのすべてのイベントを表示し、それらをevent_date ASCの順に並べます。ここでのURLは/events?type=event_typeという形式です。

  2. 私はすべての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']
                              )

誰かに役立つことを願っています。

0
dashaluna

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');
3
Bainternet

@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
0
dashaluna