WordPress как на ладони
rgbcode is looking for WordPress developers.

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

Taxonomy Metadata
Скачать последнюю версию с каталога WordPress
Скачано: 103, размер: 3.6 KB

Смотреть в каталоге плагинов 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.

Заметки

  1. После удаления плагин не удаляет созданную таблицу $wpdb->taxonomymeta.

  2. Возможно стоит задуматься о том, чтобы установить этот плагин как mu-plugins. Для этого нужно:

  3. Установить и активировать плагин на сайте - он создаст таблицу в БД.

  4. Деактивировать плагин.

  5. Скопировать файл плагина taxonomy-metadata.php в каталог /wp-content/mu-plugins/.

  6. Удалить плагин.

Мой вариант

Хотел было использовать этот плагин. Но как обычно, не понравилось, переделал.

Не понравилось:

  • Название таблицы. У нас по сути метаданные терминов а таблица называние 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 );
	}
}
9 комментариев
    Войти