Статьи

Введение в WordPress Term Meta и WP_Term

В WordPress вы можете легко сохранять метаданные для своих постов, страниц и других пользовательских типов контента, однако сохранение метаданных для использования с вашими таксономиями раньше было слишком сложным процессом (я даже написал предыдущую статью об этом здесь! ).

Чтобы все это заработало, вам нужно сохранить метаданные термина в виде поля внутри таблицы wp_options для каждого фрагмента данных, а это означает, что потенциально у вас может быть сотни, если не тысячи дополнительных записей, если у вас приличное количество терминов или просто несколько индивидуальных таксономий.

Однако, начиная с WordPress 4.4 и выше , термины теперь являются объектами, такими же, как посты, страницы и пользовательские типы контента. Это изменение значительно упрощает добавление, удаление и обновление ваших метаданных.

Предыстория с термином Meta

Сообщество стремится к простому способу управления метаданными терминов с тех пор, как в WordPress 2.8 . Это был медленный процесс, но, наконец, термины были переработаны с нуля, чтобы использовать структуру классов. Это плюс несколько различных изменений в WordPress 4.4 означает, что теперь термины в таксономии (такие как «теги», «категории» или «пользовательские») теперь могут иметь свои собственные мета-меты.

Метаданные Манипуляции по старому пути

До WordPress 4.4 не было четкого способа простого сохранения метаданных для элементов терминов, это было неотъемлемым ограничением для терминов по сравнению с тем, как они создавались. Если бы вы расширяли таксономии или термины, вам пришлось бы сохранять свои данные непосредственно как вариант сайта, используя update_option . Это не было идеальным (поскольку это загромождало таблицу параметров).

Я писал о расширении таксономий раньше , однако, в основном, когда вы были готовы сохранить свои метаданные, вы вызывали функцию, которая выглядела примерно так:

 //saving new fields for category function save_extra_taxonomy_fields($term_id){ $term = get_term($term_id); $term_slug = $term->slug; //collect category image id from posted values $term_category_image_id = isset($_POST['category_image_id']) ? sanitize_text_field($_POST['category_image_id']) : ''; //update value and save it as an option update_option('category_image_id_' . $term_slug, $term_category_image_id); } add_action('create_category','save_extra_taxonomy_fields'); 

В приведенном выше примере мы выполняем функцию, прикрепленную к create_category (который срабатывает, когда мы создаем новый термин категории). Это будет искать наше значение и после очистки сохранит его в качестве опции. Хотя это работает, это не очень красиво.

Добавление, обновление и удаление мета-терминов

Для работы с термином meta вы будете использовать функции add_term_meta , update_term_meta и delete_term_meta . Эти функции в сочетании с новыми элементами пользовательского интерфейса позволят вам сохранять и обновлять новые метаданные для ваших терминов.

Добавление термина мета

Добавление метаданных для термина включает функцию add_term_meta . Вам нужно указать три параметра с необязательным четвертым.

  • $term_id — идентификатор термина, в который вы хотите сохранить эти метаданные
  • $meta_key — Ключевое имя метаданных. Вот как вы будете ссылаться на данные
  • $meta_value — сами данные (не забудьте очистить)
  • $unique (необязательно) — если ключ метаданных должен быть уникальным. По умолчанию это установлено в false и означает, что если другой ключ имеет то же имя, функция переопределит его. Установите значение true чтобы обеспечить уникальность.

В качестве примера представьте, что для каждого термина в нашей category таксономии мы хотим назначить новый фрагмент метаданных на основе того, сколько сообщений назначено этой категории. В WordPress 4.4 мы можем выполнить цикл по всем терминам и сохранить эти новые метаданные (для последующего использования в нашей теме или плагинах).

 function add_featured_to_categories(){ //get all terms from the category taxonomy $taxonomy_name = 'category'; $term_args = array( 'orderby' => 'name', 'hide_empty' => false, 'fields' => 'ids' ); $terms = get_terms($taxonomy_name, $term_args); if($terms){ $term_key = 'term_size'; $term_value = 'empty'; $term_unique = true; //go through all terms and set the new term meta foreach($terms as $term_id){ $term = get_term($term_id, $taxonomy_name); $term_count = $term->count; //determine new meta value if($term_count > 10){ $term_value = 'big'; }else if($term_count >= 5 && $term_count < 10){ $term_value = 'medium'; }else if($term_count >= 1 && $term_count < 5){ $term_value = 'small'; } //save meta value add_term_meta($term_id, $term_key, $term_value, $term_unique); } } } add_action('init', 'add_featured_to_categories'); 

Чтение Термин Мета

Мы можем прочитать сохраненный термин meta, используя функцию get_term_meta . Эта функция работает аналогично функции get_post_meta которая используется для получения метаданных из сообщений. Чтобы использовать эту функцию, нужно указать один обязательный параметр с необязательными двумя доступными параметрами.

  • $term_id — идентификатор термина для выборки метаданных из
  • $key (необязательно) — один указанный ключ, который вы хотите вернуть. Если не указан, то возвращаются все метаданные.
  • $single (необязательно) — если будет возвращено одно значение или пара ключей или значений. По умолчанию используется одно значение.

Давайте посмотрим на другой сценарий, где вы можете найти это полезным.

Рассмотрим ситуацию, в которой мы уже сохранили мета-термины для каждого из наших терминов в нашей category таксономии. Эти сохраненные данные содержат URL-адрес изображения, которое должно отображаться при просмотре термина. Мы хотим, чтобы это изображение отображалось в виде баннера под описанием термина или заголовком, но над списком публикаций.

 //given a term, collect its saved image to be displayed function display_term_meta_image($term_id, $term_taxonomy){ //get supplied term $term = get_term($term_id, $term_taxonomy); if($term){ $term_image_id = get_term_meta($term_id, 'term_image_id', true); if($term_image_id){ //get the medium image size for display $term_image = wp_get_attachment_image_src($term_image_id, 'medium', false); echo '<img src="' . $term_image[0] . '" title="' . $term->name . ' image"/>'; } } } 

Теперь внутри нашего category.php или другого файла шаблона дочерней темы, мы можем изменить функциональность, в которой отображаются данные нашего термина.

В моей ситуации с Twenty Fourteen я редактирую файл category.php и вызываю нашу новую функцию сразу после отображения информации описания терминов.

 //get the current object (term) $term_obj = get_queried_object(); //display meta data image for term if(function_exists('display_term_meta_image')){ display_term_meta_image($term_obj->term_id, $term_obj->taxonomy); } 

Это будет отображать нашу фотографию прямо под описанием, как это:

мета-баннер

Удаление термина мета

Мы можем удалить метаданные термина точно так же, как и для сообщений. Когда мы используем функцию delete_term_meta нам нужно предоставить два обязательных параметра с опцией третий, если потребуется.

  • $term_id — идентификатор термина для работы.
  • $meta_key$meta_key который будет удален из термина.
  • $meta_value (необязательно) — удаляйте метаданные, только если значение соответствует этому значению. Используйте это, когда вы хотите, чтобы эти данные были удалены только тогда, когда они соответствуют установленному значению.

Еще раз давайте посмотрим на сценарий, в котором вы могли бы использовать это. Представьте, что вы на полпути к большому проекту, и вы уже сохранили несколько фрагментов метаданных для каждого термина категории. Вы обнаружили, что некоторые из этих данных вам больше не нужны, поэтому вам, вероятно, следует очистить их, чтобы они не загромождали вашу базу данных.

 //removed metadata we no longer need for each category term function delete_old_meta_data_from_category(){ //get all category terms $terms = get_terms('category', array('hide_empty' => false, 'fields' => 'ids')); if($terms){ //list of allowed term keys $allowed_term_keys = array('term_image_id', 'term_size'); //go through all category terms foreach($terms as $term_id){ $term_meta = get_term_meta($term_id); //go through all meta for each term foreach($term_meta as $meta_key => $meta_value){ //if this meta key doesn't exist in our allowed term keys, delete it if(!array_key_exists($meta_key, $allowed_term_keys)){ delete_term_meta($term_id, $meta_key); } } } } } add_action('init', 'delete_old_meta_data_from_category'); 

Эта функция будет проходить и удалять любые дополнительные метаданные, которые мы не указали в нашей переменной $allowed_term_keys , сокращая $allowed_term_keys пространство в базе данных (полезно, когда у нас есть десятки записей метаданных, которые нам больше не нужны).

Обратная совместимость с WordPress 4.3 и старше

Если вы действительно заинтересованы в продвижении вперед с этими новыми мета-функциями, но хотите прикрыть себя более старыми версиями, вы можете создать некоторую условную функциональность, чтобы все это работало.

 //add a piece of metadata for a term function add_term_meta_compat($term_id, $term_key, $term_value){ if(function_exists('add_term_meta')){ //WP4.4+ add_term_meta($term_id, $term_key, $term_value, true); }else{ //Pre WP4.4 //get term object and data $term_object = get_term($term_id); $term_taxonomy = $term_object->taxonomy; //build final key to save (tax + termid + key) $term_final_key = ($term_taxonomy . '_' . $term_id . '_' . $term_key); //ensure key isn't longer than 64 characters (max limit) $term_final_key = strlen($term_final_key > 64) ? substr($term_final_key, 0, 63) : $term_final_key; //add our new option add_option($term_final_key, $term_value); } } 

Мы начнем с вызова function_exists чтобы убедиться, что определена новая функция add_term_meta . Это будет верно только для WordPress 4.4 и новее. Если у нас есть поддержка, мы используем простую функцию add_term_meta для назначения метаданных нашему термину.

Если у нас нет поддержки, мы берем сам термин «объект» (с помощью переданного идентификатора термина), и из этого мы извлекаем данные $term_taxonomy и используем их для построения окончательного значения ключа. Поскольку мы сохраняем таблицу параметров, нам необходимо убедиться, что ключ уникален, мы делаем это, добавляя имя таксономии, идентификатор термина и, наконец, ключ ключа в одну переменную. Мы должны убедиться, что длина ключа не превышает 64 символов, и если это так, обрежьте его. После того, как мы сделали все это, мы можем вызвать нашу функцию add_option чтобы сохранить наше значение.

Как видите, это занимает немного времени, но вы получаете дополнительную гибкость для поддержки старых и новых версий WordPress.

Завершение всего этого

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

Благодаря гибкости и легкости новых терминов мета-функций вы можете начать реализовывать это в своих новых проектах уже сегодня!