Как вывести все категории или все метки (а также другие таксономии) из сети WordPress Multisite одним циклом

Не так давно на своих блогах я опубликовал плагин, который ставится на сеть WP Multisite, индексирует посты всех сайтов в сети и вуаля, мы можем спокойно выводить их в одном цикле.

network_get_terms()

Так как плагин стал пользоваться популярностью (хотя в рунете на данный момент не заинтересовал почти никого), я решил начать его дорабатывать, и первая из доработок, которую я сделал, это аналог функции get_terms() в WordPress — network_get_terms().

Самое главное отличие этих функций в том, что get_terms() возвращает рубрики/метки/термины с текущего блога, а network_get_terms() — со всех блогов сети в одном цикле.

network_get_terms( $network_taxonomies, $network_args )

Параметры функции

Хотел бы я написать, что все параметры идентичны параметрам функции get_terms(), но к сожалению это не совсем так, поэтому придется остановиться на них подробнее.

$network_taxonomies
Укажите нужные вам таксономии. Этот параметр также поддерживает возможность указать массив array('post_tag', 'category').
$network_args
number
Стандартно — указываем число — количество элементов, которое нужно получить.
offset
Число — количество элементов, которые нужно пропустить от начала. Например если указать 2, то функция начнет получать элементы начиная с 3-го по порядку. Работает только если указан параметр number.
include, exclude
Укажите в этих параметрах значения локальных ID одного или нескольких элементов (через массив), которые вы хотите включить, исключить (соответственно) из вывода.

// в этом примере исключаем рубрики, ID которых равны 1 или 2 на любом из блогов сети
$network_category = network_get_terms('category', array('exclude' => array( 1, 2 ) ) );

Если одновременно указаны оба параметра, то учитывается только include.

parent
Укажите локальный ID элемента таксономии, дочерние элементы (первого уровня) которого вам нужны.

Действует по всем блогам сети — т.е. если вы указали ID 11, а у вас на первом блоге есть рубрика с этим ID, и на втором блоге есть, то будут возвращены дочерние элементы первого уровня вложенности обоих этих рубрик.

Если указать 0, то будут выведены родительские элементы 1-го уровня.

$slug
Функция ищет по всем блогам сети элементы таксономий с указанным ярлыком. Также можно указать несколько элементов в виде массива.
$name
Возвращает все элементы таксономий сети с указанным названием. Чувствительности к регистру нет. Можно задать массив из нескольких элементов.
$name__like, $description__like
В этом параметре достаточно указать лишь часть названия, описания (соответственно).
$search
Функция будет искать заданную строку в названиях и ярлыках элементов таксономий сети.
orderby
Параметры сортировки, count — по количеству постов, name — по названию (по умолчанию), slug — по ярлыку, description — по описанию, include — по порядку, указанному в соответствующем параметре (см. выше), id — по значению локального ID.
order
Порядок сортировки — ASC по возрастанию (по умолчанию) или DESC по убыванию.
fields
Формат возвращаемого результата функции:

  • all — массив объектов (по умолчанию),
  • names — массив названий,
  • ids — массив локальных айдишников.

Фильтры функции

По сути network_get_terms() имеет те же фильтры, что и get_terms(), но только с префиксом network_.

get_terms() network_get_terms()
get_terms_args network_get_terms_args
get_terms network_get_terms
get_terms_orderby network_get_terms_orderby
list_terms_exclusions network_list_terms_exclusions
get_terms_fields network_get_terms_fields
terms_clauses network_terms_clauses

Описывать каждый фильтр я сейчас не стану, так как пост не об этом. А вот примеры мы рассмотрим (хочу обратить ваше внимание на то, что примеры будут работать, только если на вашем сайте установлен плагин, о котором я писал в начале статьи).

Пример 1. Выводим метки со всех блогов WP Multisite

$network_tags = network_get_terms('post_tag', 'orderby=name&hide_empty=0');
 
if($network_tags){
	echo '<select>';
	foreach ($network_tags as $network_tag){
		echo "<option value='{$network_tag->term_id}'>{$network_tag->name}</option>";
	}
	echo '</select>';
}
/*
в данном примере понятно, что
$network_tag->name - название метки,
$network_tag->term_id - её глобальный, уникальный ID среди всех меток сети
 
также существуют и другие параметры:
$network_tag->term_local_id - локальный ID метки внутри блога, на котором она находится
$network_tag->parent - локальный ID родительского элемента
$network_tag->taxonomy - название таксономии, в данном случае post_tag
$network_tag->slug - ярлык метки
$network_tag->blog_id - ID блога, на котором находится метка
$network_tag->description - описание метки
$network_tag->count - количество отмеченных ею записей
*/

Как вы наверное заметили, в этом примере не хватает одной важной вещи — то есть у нас есть названия меток, есть их ID, но нет самого важного, ссылок.

На самом деле этот момент я тоже предусмотрел и сделал функцию network_get_term_link(), которая является аналогом стандартной вордпрессовской get_term_link().

Пример 2. Выводим все рубрики с блогов сети WordPress Multisite со ссылками

Представляю вам функцию network_get_term_link(), которая по сути является аналогом get_term_link(), но работает в сети WordPress Multisite.

network_get_term_link( $term, $taxonomy='', $blog_id=null )
$term
В этом параметра можно задать локальный ID элемента таксономии, либо его ярлык. Также сюда можно передавать объекты, возвращаемые функцией network_get_terms, в этом случае второй и третий параметр можно будет не указать.
$taxonomy
Название таксономии
$blog_id
ID блога, на котором находится данная рубрика/метка/термин.
$network_cats = network_get_terms('category');
 
if($network_cats){
	echo '<ul>';
	foreach ( $network_cats as $network_cat ){
		echo '<li><a href="' . network_get_term_link( $network_cat ) . '">' . $network_cat->name . '</a></li>';
	}
	echo '</ul>';
}
Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Смотрите также

Комментарии 1

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Миша: Да, точно)

  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.