У меня есть иерархический пользовательский тип сообщений типа « Географии» , в котором каждой географии присваивается пользовательская таксономия ( geographytype
тип): область, страна, регион или город. Иерархия устанавливается следующим образом:
Area ¬ Country ¬ Region City
В качестве примера: город Бостон – ребенок Соединенных Штатов, который, в свою очередь, является ребенком Америки.
Я хочу иметь возможность получить детей и / или внуков из географии и указать ее geographytype
– например, если я буду рассматривать Америку , я хочу получить все города, включая Бостон .
Однако, похоже, я могу делать только то или другое. Если я использую get_pages () , я могу получить всех детей и внуков, указав parent
параметр, но я не могу указать тип geographytype
, поэтому я просто получаю все.
И наоборот, если я использую WP_Query (), я могу указать свой geographytype
tax_query
, используя параметр tax_query
, но он не даст мне внуков; Я могу получить только прямых детей, используя параметр post_parent
.
Я хочу иметь возможность сделать то и другое: получить детей и внуков с определенной пользовательской таксономией.
Я смог достичь этого, достаточно забавно, используя с get_pages()
и WP_Query()
. Мне нужна функция многократного использования, которая вернет массив WP_Query, который я мог бы пропустить, поэтому я придумал следующее:
function returnChildGeographies($geoID, $geoType, $grandChildren = false) { $args = array( 'post_type' => 'geographies', 'posts_per_page' => -1, 'orderby' => 'post_title', 'order' => 'ASC', 'post_parent' => $geoID, 'tax_query' => array( array( 'taxonomy' => 'geographytype', 'field' => 'slug', 'terms' => $geoType ) ) ); if ($grandChildren) { $getPagesArgs = array( 'sort_order' => 'ASC', 'sort_column' => 'post_title', 'hierarchical' => 0, 'child_of' => $geoID, 'post_type' => 'geographies' ); $pagesArray = get_pages($getPagesArgs); $grandChildArray = array(); foreach ($pagesArray as $grandchild) { $grandChildArray[] = $grandchild->ID; } unset($args['post_parent']); $args['post__in'] = $grandChildArray; } $childArray = new WP_Query($args); return $childArray; }
неfunction returnChildGeographies($geoID, $geoType, $grandChildren = false) { $args = array( 'post_type' => 'geographies', 'posts_per_page' => -1, 'orderby' => 'post_title', 'order' => 'ASC', 'post_parent' => $geoID, 'tax_query' => array( array( 'taxonomy' => 'geographytype', 'field' => 'slug', 'terms' => $geoType ) ) ); if ($grandChildren) { $getPagesArgs = array( 'sort_order' => 'ASC', 'sort_column' => 'post_title', 'hierarchical' => 0, 'child_of' => $geoID, 'post_type' => 'geographies' ); $pagesArray = get_pages($getPagesArgs); $grandChildArray = array(); foreach ($pagesArray as $grandchild) { $grandChildArray[] = $grandchild->ID; } unset($args['post_parent']); $args['post__in'] = $grandChildArray; } $childArray = new WP_Query($args); return $childArray; }
В качестве примера использования: если я просматриваю зону Америки, и я хочу, чтобы все города (которые являются внуками этого района), я звоню:
$regionQuery = returnChildGeographies($post->ID, 'city', true);
Если я хочу только прямых детей:
$countryQuery = returnChildGeographies($post->ID, 'country', false);
На основе этого последнего параметра функция будет отключена post_parent
и задайте post__in
, который представляет собой массив идентификаторов сообщений, которые я ищу.
Вероятно, эту функцию можно было бы немного упростить, но метод стоит: объединение get_pages()
и WP_Query()
показалось лучшим способом получения внуков (или правнуков или великих граждорей) и использования пользовательской таксономии запрос.