Taxonomy Metadata: метаданные для таксономий
В WordPress для таксономий не предусмотрены метаданные. Плагин из этой статьи поможет все исправить...
C версии 4.4 уже не актуально. Все что тут описано было добавлено в ядро WordPress и теперь доступно из коробки. Эта статья интересна как теоретическая информация работы метаданных в WordPress.
Таксономии - это рубрики, метки и другие произвольные коллекторы записей, которые удобно создаются плагином Custom Post Type UI.
Теория
По умолчанию в WordPress существуют метаданные (метаполя): для записей (post), пользователей (user) и комментариев (comment). Такие данные хранятся в соответствующих таблицах базы данных: wp_postmeta, wp_usermeta, wp_commentmeta. Структура всех таблиц однотипная (все таблицы имеют 4 поля: meta_id, object_id, meta_key, meta_value) и все они обрабатываются одними функциями:
Обычно мы не используем эти функции напрямую, а используем их обертки:
Бывают ситуации, когда такие метаполя будут крайне полезны для таксономий, особенно это нужно, когда базовая функциональность движка расширяется дополнительными типами записей и таксономий. Представим, что мы хотим для каждой рубрики указать свою картинку, ссылку на такую картинку удобнее всего записывать в метаданные таксономии (рубрики). Или мы хотим создавать полноценный контент для рубрик, использовать поле "описание рубрики" не удобно, для этой цели, а метаполя подойдут идеально.
Плагин Taxonomy Metadata

Смотреть в каталоге плагинов WordPress.
Рассматриваемая версия 0.4.
Заметка от автора: рекомендую использовать мою версию, смотрите в конце этой статьи.
Этот плагин расширяет функциональность WordPress, путем добавления метаданных для терминов таксономий. Вы сможете добавлять произвольные метаданные (используя ключ) к меткам, категориям и любым другим таксономиям.
Этот плагин будет интересен скорее разработчикам, потому что он ничего не делает, а просто расширяет функциональность, он не создает никакого UI для таксономий. Это не плагин комбайн, а очень маленький плагин, все что он делает - создает дополнительную таблицу $wpdb->taxonomymeta
в базе данных и регистрирует функции обработчики метаданных таксономий:
add_term_meta( $term_id, $meta_key, $meta_value, $unique = false );
Аналог add_post_meta(). Добавляет метаданные термина, с возможностью указать $unique.
- (число) $term_id - ID термина.
- (строка) $meta_key - ключ-идентификатор метаданных.
- (любой) $value - значение поля.
- (логический) $unique - по умолчанию false. true - запрещает создание нескольких полей с одинаковыми ключами.
- Возвращает логические true или false.
delete_term_meta( $term_id, $meta_key, $meta_value = '' );
Аналог delete_post_meta(). Удаляет метаданные указанного термина по ключу или по ключу и значению. Удаление по ключу и значению позволит удалять разные метаданные с одинаковыми ключами (параметр $unique в предыдущей функции).
- (число) $term_id - ID термина, метаданные которого нужно удалить.
- (строка) $meta_key - ключ-идентификатор метаданных, которые нужно удалить.
- (любой) $value - значение поля, которое нужно удалить.
- Возвращает логические true или false.
get_term_meta( $term_id, $key, $single = false );
Получает метаданные указанного термина (рубрики) таксономии.
-
(число) $term_id - ID термина, метаданные которого нужно получить.
-
(строка) $meta_key - ключ-идентификатор метаданных, которые нужно получить.
-
(логический) $single - вернуть единственное значение поля, как переменную (true) или вернуть в виде массива всех значений (false).
- Возвращает массив значений поля, если $single = false. Или значение поля $single = true (если у поля несколько значений, вернет первое из массива).
update_term_meta( $term_id, $meta_key, $meta_value, $prev_value = '' );
Обновляет метаданные указанного термина. Если указанные данные еще не созданы, то функция их создаст. (см. add_term_meta()). Параметр $prev_value нужен, когда у одного ключа есть несколько значений, чтобы точно указать какое именно значение мы хотим обновить.
-
(число) $term_id - ID термина, с метаданными которого нужно работать.
-
(строка) $meta_key - ключ-идентификатор метаданных.
-
(любой) $value - новое значение поля.
-
(любой) $prev_value - предыдущее значение поля.
- Возвращает логические true или false.
Заметки
-
После удаления плагин не удаляет созданную таблицу $wpdb->taxonomymeta.
-
Возможно стоит задуматься о том, чтобы установить этот плагин как mu-plugins. Для этого нужно:
-
Установить и активировать плагин на сайте - он создаст таблицу в БД.
-
Деактивировать плагин.
-
Скопировать файл плагина taxonomy-metadata.php в каталог /wp-content/mu-plugins/.
- Удалить плагин.
Мой вариант
Хотел было использовать этот плагин. Но как обычно, не понравилось, переделал.
Не понравилось:
-
Название таблицы. У нас по сути метаданные терминов а таблица называние taxonomymeta (так длине и не логичнее), к тому же функции управления называются get/add/delete_term_meta(). Изменил название на termmeta
-
Плагин не учитывает удаление метаданных при удалении термина, а это важно и прописывать такой код наверное будут не все. А ведь, он просто обязан быть в плагине! Добавил.
-
С версии 4.2 строковые данные в таблицах WP были переведены на кодировку ut8mb4, а плагин спустя месяц с релиза все еще не обновился. Добавил поправки в свой код...
- В остальном все тоже самое, только еще удалил поддержку мультисатовости, мне не нужна, была...
Вот мой вариант плагина:
<?php /* Plugin Name: Kama Taxonomy Metadata Description: Infrastructure plugin which implements metadata functionality for taxonomy terms, including for tags and categories. Version: 0.2 Author: Kama, mitcho (Michael Yoshitaka Erlewine), sirzooro Author URI: http://mitcho.com/ */ /** * * Используйте в WordPress функции * add_term_meta() delete_term_meta() get_term_meta() update_term_meta() */ // установим таблицу в $wpdb global $wpdb; $wpdb->termmeta = "{$wpdb->prefix}termmeta"; ## Функция создания таблицы метаданных таксономий, вешается на register_activation_hook() # register_activation_hook( __FILE__, 'create_meta_table'); function create_meta_table( $type = 'term' ){ global $wpdb; $collate = ''; if ( ! empty($wpdb->charset) ) $collate = "DEFAULT CHARACTER SET $wpdb->charset"; if ( ! empty($wpdb->collate) ) $collate .= " COLLATE $wpdb->collate"; /* * Indexes have a maximum size of 767 bytes. Historically, we haven't need to be concerned about that. * As of 4.2, however, we moved to utf8mb4, which uses 4 bytes per character. This means that an index which * used to have room for floor(767/3) = 255 characters, now only has room for floor(767/4) = 191 characters. */ $max_index_length = 191; $table_name = $wpdb->prefix . $type . 'meta'; if ( ! count( $wpdb->get_results("show tables like '$table_name'") ) ) { $wpdb->query( "CREATE TABLE $table_name ( meta_id bigint(20) unsigned NOT NULL auto_increment, {$type}_id bigint(20) unsigned NOT NULL default '0', meta_key varchar(255) default NULL, meta_value longtext, PRIMARY KEY (meta_id), KEY {$type}_id ({$type}_id), KEY meta_key (meta_key($max_index_length)) ) $collate;" ); } } ## ничего не делаем уже установлен или есть его аналог if( ! function_exists('add_term_meta') ){ ## Удаляет все метаполя термина при удалении термина // do_action('delete_term', $term, $tt_id, $taxonomy, $deleted_term ); add_action('delete_term', 'delete_termmeta_on_delete_term' ); function delete_termmeta_on_delete_term( $term_id ){ global $wpdb; $wpdb->delete( $wpdb->termmeta, array('term_id' => $term_id ), array('%d') ); } // // Taxonomy meta functions // /** * Add meta data field to a term. * * @param int $term_id Post ID. * @param string $key Metadata name. * @param mixed $value Metadata value. * @param bool $unique Optional, default is false. Whether the same key should not be added. * @return bool False for failure. True for success. */ function add_term_meta( $term_id, $meta_key, $meta_value, $unique = false ) { return add_metadata('term', $term_id, $meta_key, $meta_value, $unique ); } /** * Remove metadata matching criteria from a term. * * You can match based on the key, or key and value. Removing based on key and * value, will keep from removing duplicate metadata with the same key. It also * allows removing all metadata matching key, if needed. * * @param int $term_id term ID * @param string $meta_key Metadata name. * @param mixed $meta_value Optional. Metadata value. * @return bool False for failure. True for success. */ function delete_term_meta( $term_id, $meta_key, $meta_value = '' ) { return delete_metadata('term', $term_id, $meta_key, $meta_value ); } /** * Retrieve term meta field for a term. * * @param int $term_id Term ID. * @param string $key The meta key to retrieve. * @param bool $single Whether to return a single value. * @return mixed Will be an array if $single is false. Will be value of meta data field if $single * is true. */ function get_term_meta( $term_id, $meta_key = '', $single = false ) { return get_metadata('term', $term_id, $meta_key, $single ); } /** * Update term meta field based on term ID. * * Use the $prev_value parameter to differentiate between meta fields with the * same key and term ID. * * If the meta field for the term does not exist, it will be added. * * @param int $term_id Term ID. * @param string $key Metadata key. * @param mixed $value Metadata value. * @param mixed $prev_value Optional. Previous value to check before removing. * @return bool False on failure, true if success. */ function update_term_meta( $term_id, $meta_key, $meta_value, $prev_value = '' ){ return update_metadata('term', $term_id, $meta_key, $meta_value, $prev_value ); } }