Я был бы очень признателен, если бы вы могли мне помочь 🙂 Я очень застрял и не знаю, что делать дальше.
У меня есть пользовательский тип сообщения, event
и для него зарегистрированы 2 пользовательские таксономии:
event_type
с функциональностью, подобной тегам (например, тип события: йога, работа с голосом)event_location
с функциями, подобными категориям (например, место проведения мероприятия: Великобритания -> Брайтон, Лондон; Европа -> Париж).
На сайте есть такие страницы, как Yoga -> Upcoming events
; Voice work -> Upcoming workshops
. В зависимости от того, на какой странице мы находимся, я хотел бы отображать соответствующие события. Например, если мы находимся на странице Yoga -> Upcoming events
, я бы хотел отобразить все event
пользовательские сообщения event_type
о йоге, а затем сгруппировать результаты по event_location
терминам таксономии. Например, перечислите все мероприятия по йоге для Великобритании, Брайтона, Великобритании, Лондона, Европы, Парижа и так далее.
В настоящее время я делаю в шаблоне следующее:
- Я получаю слаг текущей страницы и ее предков.
- Я получаю слаги всех терминов в
event_type
таксономии, с которыми связаны некоторые события. - Я определяю, какие типы событий отображать, пересекая ранее собранные значения.
- Затем я создаю 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 за то, что нашли время и попытались мне помочь!
Попробуйте взглянуть на фильтр posts_groupby. Вот связанная ссылка WPXchg: wordpress.stackexchange.com/questions/4528/…
Спасибо за ответ. Я сделал, как вы сказали, но теперь запрос ничего не возвращает: S
@Bainternet Мне наконец-то удалось увидеть, какой SQL генерируется в
WP_Query[request]
. Каким-то образом я получаю 2 утверждения:JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
я думаю, внутреннее соединение исходит из ранее установленных переменных запроса. Я удалил один из них и остался с:попробуйте использовать эту причудливую функцию, которая группирует сообщения по идентификатору термина, созданному Скрибу и Майком :
добавить в массив аргументов
'orderby' => 'event_location'
и перед запросом добавить
после запроса добавить