get_taxonomies() — получает список всех зарегистрированных таксономий. Wordpress таксономия
Таксономия WordPress: работа с терминами
От автора: Концепция таксономий и терминов в WordPress нераздельна. Чуть ниже я более подробно расскажу об этом. По моему мнению, чтобы работать с терминами, необходимо понимать, что представляют собой таксономии и термины, и как они взаимодействуют. Иначе как мы будем уверены, что все делаем правильно на программном уровне?
В этой серии из двух статей мы с вами узнаем, что такое таксономии, их роль в WordPress, а также, что их связывает с терминами. И чуть позже мы обратим внимание на понятие терминов, а также научимся работать с term metadata API.
Рекомендую ознакомиться с предыдущими моими статьями, если вы еще этого не сделали. В них я объясняю принцип работы API, с которым мы будем работать. Если же вы не хотите тратить свое время на это, в принципе, ничего страшного. В этой серии мы подробно разберем все, что вам будет нужно.
Что такое таксономии?
Определение из кодекса: «В WordPress «таксономии» — это механизм группировки нескольких постов (ссылок или постов пользовательского типа).»
Это слово мы слышим нечасто. Иногда люди даже теряются, когда начинают говорить о таксономиях и терминах. Другими словами, люди используют пример фразы в качестве таксономии, но на самом деле это всего лишь термин. Чуть ниже я объясню это предложение.
Говоря простым языком, таксономии – это способы группировки вещей. В WordPress после установки есть две таксономии: категории и теги. Ниже мы разберем каждую таксономию более подробно.
Хотите быстро научиться создавать сайты и блоги на WordPress с уникальным дизайном?
Получите самую полную в Рунете бесплатную систему обучения создания сайтов на WordPress
Узнать подробнееЕсть один нюанс, по крайней мере, в WordPress: таксономии могут быть иерархическими и неиерархическими. Самый понятный пример вышесказанного:
При создании нового категории в WordPress, вы можете создать как категорию верхнего уровня, подкатегорию, так и уже существующую категорию. К примеру, орлы – подкатегория птиц.
Создавая тег в WordPress, вы прописываете одно слово или фразу, которая будет ассоциироваться с постом. Дочерних и родительских тегов не бывает.
В этом и заключается разница иерархической и неиерархической таксономии. Вроде бы легко, правда? Если поддерживаются дочерние элементы, как в категориях, это иерархическая таксономия. Если же дочерние элементы не поддерживаются, как в тегах, это неиерархическая таксономия.
В этой серии статей умение различать таксономии не играет большой роли, разве что это поможет лучше понять этот язык в процессе разработки.
Но когда мы начнем программно создавать таксономии и прикреплять к ним термины, у нас не должно возникнуть сомнения в том, что мы делаем.
Что такое термины?
Именно то определение, которого следовало ожидать, учитывая все, что мы уже изучили. Т.е. термины ассоциируются с таксономиями. Однако у терминов есть несколько важных аспектов, которые необходимо знать, если мы будем создавать их или работать с ними программно. Термины состоят из:
Краткого заголовка URL адреса
Заголовка
Описания
И не забывайте, что если мы работает с иерархической таксономией, такой как категории, термины могут включать в себя родительские термины.
Хотите быстро научиться создавать сайты и блоги на WordPress с уникальным дизайном?
Получите самую полную в Рунете бесплатную систему обучения создания сайтов на WordPress
Узнать подробнееЭто не означает, что в таксономиях нет информации, относящейся к терминам. К примеру, у таксономии есть название, тип поста, с которым она ассоциируется, а также ряд аргументов, которые выходят за рамки этой статьи. В следующей статье мы подробно их рассмотрим.
Как связаны термины и таксономии?
Между терминами и таксономиями что-то наподобие симбиотической связи, т.е. один не может существовать без другого. В иерархических таксономиях это прослеживается нагляднее. В кодексе WordPress есть диаграмма, описывающая связь таксономий и терминов:
К примеру, можно иметь таксономию Категории, но в ней должен быть хотя бы один термин. Именно поэтому в WordPress по умолчанию есть термины без категорий (Uncategorized).
Но также можно создать таксономию Теги и не хранить ни одного тега в базе данных. Можем ли мы, как разработчики, как-то расширить данную систему? Как термины, так и таксономии могут быть созданы программно, однако пользователи также могут создавать и добавлять их. По крайней мере, если в пользовательском интерфейсе есть такая возможность.
Конкретный пример: С помощью интерфейса WordPress все мы можем создавать категории и теги. Но если вы программист и хотите переместить отдельные таксономии и термины в базу данных, вы можете сделать так, чтобы пользователи не смогли больше добавлять и удалять их через интерфейс.
Что такое Term Metadata?
Мы уже поняли, что такое таксономии и термины, а также разницу между ними, и остался один вопрос: Зачем нужны term metadata? Или по-другому в чем смысл term metadata?
Хороший вопрос. Возможно, именно поэтому данной функции не было до WordPress 4.4. Что еще интереснее, так это то, что об этой функции объявили больше 6 лет назад. Главная причина, по которой еще 6 лет назад заговорили о метаданных терминов была:
«На данный момент нет конкретного способа хранения дополнительных данных в таксономиях. Разработчикам плагинов приходится создавать методы для хранения таких данных. К примеру, можно хранить данные в зашифрованном виде в поле описания или использовать метод set_option(). Новая функция не помешала бы, к примеру, add_taxonomy_data() / get_taxonomy_data().»
Данное понятие будет иметь для вас смысл, если вы продвинутый разработчик. Но не все из нас достигли такого уровня знаний, и мы не можем точно сказать, чем метаданные терминов лучше.
Как и в других API, мы можем хранить данные о любом термине из базы данных. К метаданным терминов можно отнести что-либо, связанное с временем создания термина, автором, количеством постов, с которыми ассоциируется данный термин. Также с их помощью терминам можно добавлять изображения.
Так как информация в метаданных терминов может быть самой разной, нам открываются широчайшие возможности. В следующей статье мы рассмотрим конкретные примеры.
Заключение
На данный момент вы знаете все, что вам пригодится для работы с терминами и таксономиями. Когда вы будете писать плагин, тему или что-либо еще для клиента, вам, скорее всего, придется несколько раз открыть кодекс. Даже для опытного разработчика это нормальная практика.
В следующей статье мы научимся работать с метаданными терминов: разберем конкретный пример кода, добавим этот код в одну из тем по умолчанию, будем вносить изменения и следить за базой данных.
Автор: Tom McFarlin
Источник: http://code.tutsplus.com/
Редакция: Команда webformyself.
Хотите быстро научиться создавать сайты и блоги на WordPress с уникальным дизайном?
Получите самую полную в Рунете бесплатную систему обучения создания сайтов на WordPress
Узнать подробнееWordPress-Профессионал
Посмотрите информацию по API WordPress, благодаря Вы сможете научиться писать плагины и виджеты
Научитьсяwebformyself.com
Создание своей таксономии в WordPress (ЧПУ ссылки)
// Регистрация новой таксономии:
add_action( 'init', 'create_taxname', 0 );
function create_taxname () {
$args = array(
// Название таксономии
'label' => _x( 'Имена', 'taxonomy general name' ),
// Значения таксономии в админ-панели:
'labels' => array(
// Общее название таксономии (множественное число).
// По умолчанию: 'МеткИ' или 'РубрикИ'
'name' => _x( 'Имена', 'taxonomy general name' ),
// Название таксономии (единственное число).
// По умолчанию: 'МеткА' или 'РубрикА'
'singular_name' => _x( 'Имена', 'taxonomy singular name' ),
// Название таксономии в пункте меню.
'menu_name' => __( 'Имена' ),
// По умолчанию: 'Все метки' или 'Все рубрики'
'all_items' => __( 'Все Имена' ),
// Текст изменения таксономии на странице редактирования.
// По умолчанию: 'Изменить метку' или 'Изменить рубрику'
'edit_item' => __( 'Изменить имя' ),
// Текст в админ-панели на странице редактирования данной таксономии.
// По умолчанию: 'Просмотреть метку' или 'Просмотреть рубрику'
'view_item' => __( 'Просмотреть Имена' ),
// Текст обновления таксономии во вкладке свойства.
// По умолчанию: 'Обновить метку' или 'Обновить рубрику'
'update_item' => __( 'Обновить имя' ),
// Текст добавления новой таксономии при ее создании.
// По умолчанию: 'Добавить новую метку' или 'Добавить новую рубрику'
'add_new_item' => __( 'Добавить новое имя' ),
// Название таксономии при ее создании и редактировании.
// По умолчанию: 'Название'
'new_item_name' => __( 'Название' ),
// Текст родительской таксономии при создании и редактировании.
// Для древовидных таксономий.
// По умолчанию: Родительская.
'parent_item' => __( 'Родительская' ),
// То же, что и parent_item, но с добавлением двоеточия.
// По умолчанию: 'Родительская:'
'parent_item_colon' => __( 'Родительская:' ),
// Текст в кнопке поиска на странице всех таксономий.
// По умолчанию: 'Поиск меток' или 'Поиск рубрик'
'search_items' => __( 'Поиск имени' ),
// ЧЕТЫРЕ НИЖНИХ параметра НЕ используется для древовидных таксономий:
// Надпись популярных таксономий (на странице всех таксономий).
// По умолчанию: Популярные метки или null.
'popular_items' => null,
// Надпись разделения таксономий запятыми в метабоксе.
// По умолчанию: Метки разделяются запятыми или null.
'separate_items_with_commas' => null,
// Надпись добавления или удаления таксономий в метабоксе когда JavaScript отключен.
// По умолчанию: Добавить или null.
'add_or_remove_items' => null,
// Текст выбора из часто используемых таксономий в метабоксе.
// По умолчанию: Выбрать из часто используемых или null.
'choose_from_most_used' => null,
// Текст в случае, если запрашиваемая таксономия не найдена.
// По умолчанию: 'Меток не найдено. или 'Рубрик не найдено.
'not_found' => __( 'Имя не найдено.' ),
),
// Если true, то таксономия становится доступной для использования.
'public' => true,
// Доступность таксономии для управления в админ-панели, но не показывает ее в меню.
// По умолчанию: 'public'.
'show_ui' => true,
// Показывать таксономию в админ-меню.
// Значение аргумента 'show_ui' должно быть true.
// По умолчанию: значение аргумента 'show_ui'.
'show_in_menu' => true,
// Добавляет или исключает таксономию в навигации сайта "Внешний вид -> Меню"
// По умолчанию: 'public'.
// Позволяет виджет 'Облако меток' использовать в таксономии.
// По умолчанию: 'show_ui'.
'show_tagcloud' => true,
// Показ таксономии в меню быстрого доступа.
// По умолчанию: 'show_ui'.
'show_in_quick_edit' => true,
// Обеспечивает показ метабокса с таксономией в записи. По умолчанию: null.
'meta_box_cb' => null,
// Позволяет автоматическое создание столбцов таксономии в таблице ассоциативных типов постов.
// По умолчанию: false.
'show_admin_column' => false,
// Подключает описание таксономии в таблице со всеми таксономиями. По умолчанию: ''
'description' => '',
// Делает таксономию древовидной как рубрики или недревовидной как метки. По умолчанию: false.
'hierarchical' => true,
// Название функции, вызываемая после обновления ассоциативных типов объектов записи (поста)
// Действует во многом как хук.
// По умолчанию: ''.
'update_count_callback' => '',
// Значение запроса. По умолчанию: true.
'query_var' => true,
// Перезапись URL. По умолчанию: true.
'rewrite' => array(
// Текст в ЧПУ. По умолчанию: название таксономии.
'slug' => 'person',
// Позволяет ссылку добавить к базовому URL.
'with_front' => false,
// Использовать (true) или не использовать (false) древовидную структуру ссылок.
// По умолчанию: false.
'hierarchical' => true,
// Перезаписывает конечное значение таксономии. По умолчанию: EP_NONE.
'ep_mask' => EP_NONE,
),
/*
// Массив полномочий зарегестрированных пользователей:
'capabilities' => array(
'manage_terms' => 'manage_resource',
'edit_terms' => 'manage_categories',
'delete_terms' => 'manage_categories',
'assign_terms' => 'edit_posts',
),
*/
// Должна ли таксономия запоминать порядок, в котором посты были созданы.
// По умолчанию: null.
'sort' => null,
// Является ли таксономия собственной или встроенной.
// Рекомендация: не использовать этот аргумент при регистрации собственной таксономии.
// По умолчанию: false.
'_builtin' => false,
);
// Названия типов записей к которым будет привязана таксономия
register_taxonomy( 'person', array('post'), $args );
}
ploshadka.net
Метаданные в таксономиях WordPress без плагинов
Блог / WordPress / Метаданные в таксономиях без использования плагиновЯ уже писал про добавление метабоксов к постам (записям, страницам, произвольным типам постов), теперь давайте разберемся, как добавлять произвольные поля (дополнительные настройки) на страницы редактирования рубрик, меток и прочих таксономий, которые вы можете насоздавать.
Шаг 1. Создание таблицы в базе данных
Всё дело в том, что, в отличии от метабоксов для постов, которые можно прикрутить на основе значений произвольных полей постов, то для таксономий WordPress тупо не предусматривает никаких метаданных, места в базе данных для них не предназначено.
Ну что же, похоже, что единственный выход — это создание собственной таблицы в БД, наподобие wp_postmeta.
Вообще назвать нужно её wp_termmeta (естественно префикс может быть другим), иначе стандартные вордпрессовские функции по работе с метаданными у нас просто не будут работать.
Есть два способа создания таблицы:
- Лезем в phpMyAdmin и создаем там.
- Через SQL-запрос, который можно задействовать прямо в коде.
Способ 1. Создание таблицы в базе данных через phpMyAdmin
Открываем phpMyAdmin, выбираем базу данных своего сайта, затем нажимаем на ссылку . Настройки выставляем примерно следующие, одним словом ориентируемся на таблицу wp_postmeta.
Способ 2. Использование SQL-запроса для создания таблицы
Тут я подразумеваю код, который мы вставим в functions.php, после чего таблица сразу создастся. Понятное дело, что код нужно выполнить только один раз, а значит, лучше всего повесить его например на активацию темы.
if ( is_admin() && isset($_GET['activated'] ) && $pagenow == "themes.php" ) { // вешаем запрос создания таблицы на активацию темы global $wpdb; // глобальный класс $wpdb необходим при работе с базой данных в WordPress $collate = ''; if($wpdb->has_cap('collation')) { if(!empty($wpdb->charset)) $collate = "DEFAULT CHARACTER SET $wpdb->charset"; if(!empty($wpdb->collate)) $collate .= " COLLATE $wpdb->collate"; } // дальше идет сам SQL запрос $wpdb->query("CREATE TABLE IF NOT EXISTS ". $wpdb->prefix . "termmeta ( `meta_id` bigint(20) NOT NULL AUTO_INCREMENT, `term_id` bigint(20) NOT NULL, `meta_key` varchar(255) NOT NULL, `meta_value` longtext DEFAULT '' NOT NULL, PRIMARY KEY id (`meta_id`)) $collate;" ); } |
После того, как таблица будет создана, можно будет перейти к следующему шагу.
Шаг 2. Универсальное решение по добавлению настроек — использование PHP класса
Реально — использование готового класса это круто и легко. Вы на лету сможете создавать столько настроек в таксономиях, сколько захотите.
И я дам вам готовый класс с некоторыми базовыми полями: <input> (текстовый и чекбокс), <select>, <textarea>. Также вы можете прикрутить поле с загрузкой изображения, используя код из этого поста.
Я решил не добавлять в код вообще ничего лишнего (я не хочу сказать, что nonce-проверки и проверки на права пользователей — лишнее, просто в этом примере я от них отказался для простоты восприятия кода).
<?php class trueTaxonomyMetaBox { /* * Функция-конструктор, в ней мы активируем хуки */ function __construct( $options ) { $this->options = $options; $this->prefix = $this->options['id'] .'_'; // префикс настроек foreach ( $this->options['taxonomy'] as $taxonomy ) { // для каждой таксономии, которая указана в параметрах add_action($taxonomy . '_edit_form_fields', array(&$this, 'fill'), 10, 2 ); // хук добавления полей } add_action('edit_term', array(&$this, 'save'), 10,1); // хук сохранения значений полей } /* * Функция, создающая поля, я описал в ней текстовые поля (input type=text и textarea), чекбокс и выпадающий список */ function fill( $term, $taxonomy ){ foreach ( $this->options['args'] as $param ) { // для каждого описанного параметра... ?><tr><?php // определяем значение произвольного поля таксономии if(!$value = get_metadata('term', $term->term_id, $this->prefix .$param['id'], true)) $value = $param['std']; switch ( $param['type'] ) { // input[type="text"] case 'text':{ ?> <th scope="row"><label for="<?php echo $this->prefix .$param['id'] ?>"><?php echo $param['title'] ?></label></th> <td> <input name="<?php echo $this->prefix .$param['id'] ?>" type="<?php echo $param['type'] ?>" value="<?php echo $value ?>" /> <?php if(isset( $param['desc'] ) ) echo '<p>' . $param['desc'] . '</p>' ?> </td> <?php break; } // textarea case 'textarea':{ ?> <th scope="row"><label for="<?php echo $this->prefix .$param['id'] ?>"><?php echo $param['title'] ?></label></th> <td> <textarea name="<?php echo $this->prefix .$param['id'] ?>" type="<?php echo $param['type'] ?>" value="<?php echo $value ?>" /><?php echo $value ?></textarea> <?php if(isset( $param['desc'] ) ) echo '<p>' . $param['desc'] . '</p>' ?> </td> <?php break; } // input[type="checkbox"] case 'checkbox':{ ?> <th scope="row"><label for="<?php echo $this->prefix .$param['id'] ?>"><?php echo $param['title'] ?></label></th> <td> <label for="<?php echo $this->prefix .$param['id'] ?>"><input name="<?php echo $this->prefix .$param['id'] ?>" type="<?php echo $param['type'] ?>"<?php echo ($value=='on') ? ' checked="checked"' : '' ?> /> <?php if(isset( $param['desc'] ) ) echo $param['desc'] ?></label> </td> <?php break; } // select case 'select':{ ?> <th scope="row"><label for="<?php echo $this->prefix .$param['id'] ?>"><?php echo $param['title'] ?></label></th> <td> <label for="<?php echo $this->prefix .$param['id'] ?>"> <select name="<?php echo $this->prefix .$param['id'] ?>"><option>...</option><?php foreach($param['args'] as $val=>$name){ ?><option value="<?php echo $val ?>"<?php echo ( $value == $val ) ? ' selected="selected"' : '' ?>><?php echo $name ?></option><?php } ?></select></label> <?php if(isset( $param['desc'] ) ) echo '<p>' . $param['desc'] . '</p>' ?> </td> <?php break; } } ?></tr><?php } } /* * Функция сохранения значений полей */ function save( $term_id ){ foreach ( $this->options['args'] as $param ) { if ( isset( $_POST[ $this->prefix . $param['id'] ] ) && trim( $_POST[ $this->prefix . $param['id'] ] ) ) { update_metadata('term', $term_id, $this->prefix . $param['id'], trim($_POST[ $this->prefix . $param['id'] ], '') ); } else { delete_metadata('term', $term_id, $this->prefix . $param['id'], '', false); } } } } |
Добавив этот класс в свой плагин или тему, можно приступить к заданию параметров класса, или иначе говоря к созданию настроек.
Вот пример:
$options = array( array( 'id' => 'metatax', // айдишник играет роль префикса названий полей 'taxonomy' => array('category', 'game'), // укажите таксономии, для которых нужно добавить ниже перечисленные поля 'args' => array( array( 'id' => 'order', // атрибуты name и id без префикса, например с префиксом будет meta1_field_1 'title' => 'Порядок', // лейбл поля 'type' => 'text', // тип, в данном случае обычное текстовое поле 'desc' => 'Укажите порядок сортировки.', // описание 'std' => '0' // значение поля по умолчанию ), array( 'id' => 'homepage', 'title' => 'Главная', 'type' => 'checkbox', // чекбокс 'desc' => 'Отображать на главной странице в списке рубрик', 'std' => '' ) ) ), array( 'id' => 'metagame', 'taxonomy' => array('game'), 'args' => array( array( 'id' => 'genre', 'title' => 'Жанр игры', 'type' => 'select', // выпадающий список 'desc' => 'Выберите жанр из выпадающего списка.', 'std' => '', 'args' => array('mmorpg' => 'MMORPG', 'strategy' => 'Стратегия', 'racing' => 'Гонки' ) // элементы задаются через массив, по типу атрибут value=>лейбл ), array( 'id' => 'reqs', 'title' => 'Системные требования', 'type' => 'textarea', 'std' => '' ) ) ) ); foreach ($options as $option) { $truetaxmetabox = new trueTaxonomyMetaBox($option); } |
Вот результат:
Вот в принципе и всё. Я написал только про самое основное.
Если у вас будут какие-то вопросы, пожалуйста, оставляйте их в комментариях к посту, обязательно постараюсь вам помочь.
misha.blog
Добавление фильтра по таксономиям в WordPress
Блог / WordPress / Добавление фильтра по таксономиямСколько у вас постов на блоге? 100 или может быть 10000? Согласитесь, что при огромном количестве записей бывает полезно отобразить только содержимое какой-нибудь конкретной категории в админке. Правда сам я, если вдруг что, пользуюсь поиском, но тем не менее 🙂
Для этого есть фильтр по рубрикам, который находится на странице с записями:
Окей, вроде всё норм, но однажды у меня один клиент попросил добавить фильтр по таксономиям. Вот типо того:
Знаете, я недавно видел статью (не стану называть автора), в которой проводился обзор: что лучше — Joomla или WordPress, там говорилось, что:
- якобы WordPress подходит только для блогов,
- якобы WordPress очень ограничен по функционалу и возможностям в отличие от джумлы
Возможности в WordPress не ограничены, по крайней мере я с границами пока что не столкнулся и эта статья тому подтверждение. Это было небольшое отступление, а теперь за дело.
function true_taxonomy_filter() { global $typenow; // тип поста if( $typenow == 'post' ){ // для каких типов постов отображать $taxes = array('platform', 'game'); // таксономии через запятую foreach ($taxes as $tax) { $current_tax = isset( $_GET[$tax] ) ? $_GET[$tax] : ''; $tax_obj = get_taxonomy($tax); $tax_name = mb_strtolower($tax_obj->labels->name); // функция mb_strtolower переводит в нижний регистр // она может не работать на некоторых хостингах, если что, убирайте её отсюда $terms = get_terms($tax); if(count($terms) > 0) { echo "<select name='$tax'>"; echo "<option value=''>Все $tax_name</option>"; foreach ($terms as $term) { echo '<option value='. $term->slug, $current_tax == $term->slug ? ' selected="selected"' : '','>' . $term->name .' (' . $term->count .')</option>'; } echo "</select>"; } } } } add_action( 'restrict_manage_posts', 'true_taxonomy_filter' ); |
Ну как бы и добавить больше нечего, исчерпывающий код 🙂 вставляем в файл functions.php вашей темы и радуемся.
P.S. Если хотите удалить при этом стандартный фильтр по рубрикам, используйте вот этот код:
add_filter( 'wp_dropdown_cats', '__return_false' ); |
После удаления фильтра по рубрикам может показаться логичным ещё и удаление колонки с рубриками, но эта тема затронута в отдельном посте.
Смотрите также
misha.blog
get_the_terms() - элементы таксономий поста, WordPress
Блог / Кодекс WordPress / get_the_terms() — возвращает все элементы таксономий, присвоенные к указанному посту в виде массива их объектовБлагодаря этой функции вы можете вы вывести все метки, которые присвоены к посту, все рубрики, которым принадлежит пост (одновременно и метки и рубрики тоже можно), а также элементы других таксономий (иногда их называют — термины).
Также хочу обратить ваше внимание на то, что эта функция не работает непосредственно с базой данных, прежде всего она пытается получить всё необходимое из кэша WordPress.
get_the_terms( $post, $taxonomy ) |
В случае, если указанного вами поста не существует, либо ему просто не присвоено элементов заданных таксономий, функция возвращает false. А также объект WP_Error при указании несуществующей таксономии.
Выводимые термины сортируются по имени по возрастанию.
Примеры использования get_the_terms()
Как я уже писал, функция возвращает массив объектов таксономий, как с этим работать — посмотрим на примере.
Ну и как всегда начнём от простого к сложному.
1. Вывод ссылок на все метки текущего поста
// из условия понятно, что функция используется в цикле, а значит глобальная перменная $post->ID задана и содержит ID поста $termini = get_the_terms( $post->ID, 'post_tag' ); // так как функция вернула массив, то логично будет прокрутить его через foreach() foreach( $termini as $termin ){ echo '<a href="' . get_term_link( $termin ) . '">' . $termin->name . '</a>'; } /* * Также вы можете использовать: * $termin->ID - понятное дело, ID элемента * $termin->slug - ярлык элемента * $termin->term_group - значение term group * $termin->term_taxonomy_id - ID самой таксономии * $termin->taxonomy - название таксономии * $termin->description - описание элемента * $termin->parent - ID родительского элемента * $termin->count - количество содержащихся в нем постов */ |
Для получения URL ссылки на страницу термина, я использовал функцию get_term_link().
2. Вывод через запятую ссылок на термины, которые присвоены к посту
Основная проблема это, вы не поверите, запятые, то есть если мы будем просто выводить элементы как в первом примере и добавим запятую после </a>, то на конце будет всегда оставаться лишняя запятая, а она нам совсем ни к чему.
// переменная $post в данном случае - объект поста $termini = get_the_terms( $post, array('category','post_tag','ваша_произвольная_таксономия') ); // проверяем, что $termini не равно false, и не является объектом WP_Error if ( $termini && ! is_wp_error( $termini ) ) { // все полученные элементы по ходу цикла мы будем класть в этот массив $termini_massiv = array(); foreach ( $termini as $termin ) { // добавление элемента в массив $termini_massiv[] = '<a href="' . get_term_link( $termin ) . '" title="Перейти к ' . esc_attr( $termin->name ) . '">' . $termin->name . '</a>'; } // на данном этапе у нас имеется массив $termini_massiv, содержащий ссылки на все нужные термины // используя функцию PHP join(), объединим элементы массива в строку, в качестве разделителя используем запятую с пробелом $termini_a_hrefs = join( ", ", $termini_massiv ); // осталось только вывести блок ссылок echo '<div>Теги: <span>' . $termini_a_hrefs . '</span></div>'; } |
Фильтры
У функции есть только один фильтр, который и совпадает с её названием — get_the_terms.
get_the_terms
Позволяет изменить список терминов, полученных в результате действия функции. Появился в версии WP 3.1.0
function get_the_terms_filter_cb( $terms, $post_id, $taxonomies) { /* * $terms - результат функции, либо массив терминов, либо false, либо WP_Error * $post_id - ID поста (именно ID, здесь уже объекта не может быть) * $taxonomies - название таксономии, либо массив из нескольких названий */ // к примеру мы можем сделать так, чтобы для поста с определенным ID термины не выводились if( $post_id == 341 ) { return false; } } add_filter( 'get_the_terms', 'get_the_terms_filter_cb', 10, 3 ); |
misha.blog
get_taxonomies() - возвращает зарегистрированные таксономии
Блог / Кодекс WordPress / get_taxonomies() — получает список всех зарегистрированных таксономийФункция возвращает массив, состоящий из названий таксономий (или их объектов).
$taksonomii = get_taxonomies(); // так как $taksonomii - это массив, то давайте пропустим его через цикл foreach( $taksonomii as $taksonomiya ) { echo $taksonomiya . '<br />'; } |
Для чистого сайта на WP результат будет следующим:
category post_tag nav_menu link_category post_format |
Хочу отметить, что в большинстве примеров, которые вы найдёте в интернете, действие функции этим и ограничивается.
То есть функция get_taxonomies() в основном используется для получения названий таксономий, которые в дальнейшем можно использовать в других функциях, таких как например get_the_terms().
Однако мы также можем получить и целые объекты таксономий со всей сопутствующей информацией.
Объект таксономии в WP
Суть следующего примера в точности такая же, как и предыдущего — вывести названия всех зарегистрированных таксономий, каждый с новой строки.
Первый параметр оставляем пустым, про него я расскажу чуть позже.
Для того, чтобы функция get_taxonomies() возвращала массив объектов, её второй параметр должен содержать любую строку, отличную от names, то есть:
- names — функия возвращает массив строковых значений, а именно — названий таксономий,
- любая_строка — функция возвращает массив объектов таксономий, в качестве параметра я указал objects чисто для наглядности.
$args = array(); // пустой массив пока что $taksonomii = get_taxonomies( $args, 'objects' ); foreach( $taksonomii as $taksonomiya ) { echo $taksonomiya->name . '<br />'; } |
В примере я использовал echo $taksonomiya->name для вывода названия таксономии, давайте же теперь разберемся со всеми параметрами объекта.
Параметры объекта таксономии
Хочу также отметить что все эти параметры (кроме buitin) вы можете использовать при создании собственной таксономии.
$taksonomiya->labels (объект) Ярлыки (надписи), которые используются в интерфейсе админки WordPress, к примеру для рубрик он выглядит следующим образом: $taksonomiya->label (строка) Множественное число названия таксономии, обычно совпадает с $taksonomiya->labels->name. $taksonomiya->description (строка) Описание таксономии, которое по умолчанию нигде не отображается, но его можно задать при регистрации таксономии. $taksonomiya->hierarchical (логическое) Равно единице, если таксономия имеет иерархию. $taksonomiya->object_type (массив) Массив из названий поддерживаемых типов постов, например для рубрик array('post'). Изменять этот массив для уже зарегистрированных таксономий позволяет функция register_taxonomy_for_object_type(). $taksonomiya->_builtin (логическое) Является ли данная таксономия встроенной в WordPress по умолчанию. 1 — да. $taksonomiya->callback (строка) Название возвратной функции для отображения метабокса данной таксономии. Если при регистрации не задана пользователем, то по умолчанию имеет значение post_categories_meta_box для таксономий с иерархией и post_tags_meta_box для таксономий без иерархии. Если задано false, то метабокс не будет отображаться вообще. $taksonomiya->public (логическое) Из названия данного параметра понятно, что он имеет отношение к отображению таксономии. Сам по себе он мало что значит, но от него напрямую зависят значения по умолчанию следующих далее параметров объекта. $taksonomiya->show_in_nav_menus (логическое) Можно ли выбирать элементы данной таксономии при создании меню. Если не задано, то эквивалентно значению $taksonomiya->public. $taksonomiya->show_ui (логическое) Отображается ли в админке интерфейс для данной таксономии. Если не задано, то эквивалентно значению $taksonomiya->public. $taksonomiya->show_tagcloud (логическое) Можно ли отображать элементы данной таксономии в облаке меток. Если не задано, то эквивалентно значению $taksonomiya->show_ui. $taksonomiya->show_in_quick_edit (логическое) Будет ли отображаться таксономия в панели быстрого редактирования. Если не задано, то эквивалентно значению $taksonomiya->show_ui. $taksonomiya->show_admin_column (логическое) Нужно ли автоматически добавляться колонку этой таксономии в таблицу поддерживаемых ею типов записей. Если не задан, то false по умолчанию. $taksonomiya->rewrite (логическое|массив) Содержит либо массив настроек постоянных ссылок для этой таксономии, либо равен false, если постоянные ссылки для неё отключены:- slug (строка) — собственно то, что отображается в URL, напрмиер /tag/, если не задан, то соответсвует названию таксономии,
- with_front (логическое) — нужно ли в URL использовать $wp_rewrite->front (по умолчанию false), о том, что это такое, подробнее здесь,
- hierarchical (логическое) — будут ли добавляться в URL также ярлыки родительских элементов таксономии (по умолчанию — false),
- ep_mask — маска, по умолчанию EP_NONE.
Фильтр полученных результатов
Вот мы и подошли к тому функционалу функции, использование которого я пока что ещё не видел нигде.
Для начала я хочу вам сказать, что по сути всё, чем занимается функция get_taxonomies() — это работает уже с готовым массивом объектов таксономий $wp_taxonomies. Так что если проблем с объектами PHP у вас нет, то вы также можете использовать этот глобальный массив напрямую.
Так вот, мы уже рассмотрели, как функция может вывести массив названий таксономий, как обратиться к элементам объекта, теперь остановимся на двух параметрах функции, которые позволяют фильтровать полученный результат, к примеру давайте получим все встроенные _builtin таксономии с иерархией hierarchical.
// в $args мы просто перечисляем все параметры объекта таксономии, которые нас интересуют $args = array( 'hierarchical' => true, '_builtin' => true ); // 'and' (И - все значения параметров $args должны соответстовать - по умолчанию), 'or' (ИЛИ - хотя бы одно значение $args должно соответствовать) $operator = 'and'; $taksonomii = get_taxonomies( $args, 'objects', $operator ); |
misha.blog