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 );
}
}