dashaluna
  • 0
Учитель

Как сгруппировать сообщения пользовательского типа по пользовательским терминам таксономии

  • 0

Я был бы очень признателен, если бы вы могли мне помочь 🙂 Я очень застрял и не знаю, что делать дальше.

У меня есть пользовательский тип сообщения, 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 сообщений с определенными event_type терминами таксономии.

Кажется, это работает. Однако результаты возвращались неупорядоченными, и я хотел бы, чтобы они были упорядочены по event_location терминам таксономии. Например:

  • Соединенное Королевство

    • Брайтон
      • Событие 1
      • Событие 2
    • Лондон

      • Событие 3
  • Европа

    • Париж
      • Событие 4

Я также хотел бы отображать только event сообщения с неистекшим сроком действия и упорядочивать их по event_date . Значение event_date сохраняется как мета-значение вместе с остальными event деталями сообщения под одним мета-ключом.

Вот мой код:

    //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. Я был бы очень признателен, если бы вы могли мне помочь. Спасибо большое!!!

РЕДАКТИРОВАТЬ

Я значительно упростил функционал (так как в оригинале совсем запутался и потерялся). Пожалуйста, смотрите мой ответ.

Спасибо @Bainternet за то, что нашли время и попытались мне помочь!

Share
  1. Попробуйте взглянуть на фильтр posts_groupby. Вот связанная ссылка WPXchg: wordpress.stackexchange.com/questions/4528/…

    • 0
  2. попробуйте использовать эту причудливую функцию, которая группирует сообщения по идентификатору термина, созданному Скрибу и Майком :

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

    добавить в массив аргументов'orderby' => 'event_location'

    и перед запросом добавить

     add_filter( 'posts_clauses', 'event_clauses', 10, 2 );
    

    после запроса добавить

    remove_filter( 'posts_clauses', 'event_clauses');
    
    • 0

Оставить ответ

You must login to add an answer.