Произвольные поля

В WordPress по умолчанию имеется возможность для каждого поста (любого типа, будь то запись post, страница page или какой-нибудь произвольный тип постов) задавать неограниченное количество параметров. На этот случай имеется даже отдельная таблица в базе данных wp_postmeta.

Эти параметры называются произвольными полями или метаданными поста. Метаданные состоят из пар ключ=>значение, например color=>красный, size=>большой.

Также один пост может иметь несколько произвольных полей с одним и тем же ключом: color=>красный, color=>синий, color=>зелёный.

Задавать значения произвольных полей в WordPress можно тремя способами:

  1. Стандартный способ через админку.
  2. При помощи функций.
  3. При помощи метабоксов (перейдите по ссылке, чтобы почитать про этот способ подробнее, в данной статье я его рассматривать не буду).

Произвольные поля в админке

Итак, пошагово:

  1. Переходим на страницу редактирования или создания нового поста.
  2. Прокручиваем вниз до блока «Произвольные поля».

    В версии WordPress 3.1 и выше этот блок может быть скрыт. Включите его в настройках экрана (о том как — читайте далее).

  3. Укажите имя (вы можете выбрать из списка один из уже используемых ключей либо ввести новый) и его значение и нажмите «Добавить произвольное поле».
Произвольные поля в админке на странице редактирования записи

Что делать, если в админке их нет?

В первую очередь проверьте «Настройки экрана» — галочка напротив «Произвольные поля» должна быть отмечена.

Включение метабокса произвольных полей в настройках экрана

Если же в настройках экрана вы ничего подобного не нашли, то вероятнее всего тип поста, с которым вы работаете, не поддерживает использование произвольных полей — это легко поправимо при помощи add_post_type_support(). Код для functions.php:

function true_custom_fields() {
	add_post_type_support( 'book', 'custom-fields'); // в качестве первого параметра укажите название типа поста
}
 
add_action('init', 'true_custom_fields');

Типы постов page (страницы) и post (записи) имеют поддержку произвольных полей по умолчанию!

Как вывести произвольные поля

1. the_meta()

Функция позволяет вывести все произвольные поля текущего поста в виде маркированного списка <ul>. Например для нашего случая код:

<p>Метаданные поста:</p>
<?php the_meta(); ?>

Выведет:

<p>Метаданные поста:</p>
<ul class="post-meta">
<li><span class="post-meta-key">color:</span> красный, синий, зеленый</li>
<li><span class="post-meta-key">size:</span> большой</li>
</ul>

Параметров у функции нет.

2. get_post_meta()

Про get_post_meta() я уже подробно писал здесь.

3. get_post_custom()

Возвращает многоуровневый массив всех произвольных полей для текущего поста или поста, ID которого указан в параметрах функции.

print_r( get_post_custom( 541 ) );

Получим что-то вроде этого:

[color] => Array ( [0] => красный [1] => синий [2] => зеленый )
[size] => Array ( [0] => большой ) )

В отличие от функции the_meta(), get_post_custom() возвратит также и все скрытые произвольные поля поста.

4. get_post_custom_keys()

Функция возвращает массив ключей всех произвольных полей поста.

print_r( get_post_custom_keys( 541 ) );

Выдаст:

Array ( [0] => color [1] => size )

Является производной от get_post_custom(), а если быть точным, то просто пропускает её результат через php-функцию array_keys().

5. get_post_custom_values()

Возвращает один из ключей функции get_post_custom() в виде массива, вне зависимости от количества аргументов.

print_r( get_post_custom_values( 'size', 541 ) );
[size] => Array ( [0] => большой ) )

Первый параметр функции обязателен (если вы его не укажите, будет возвращено null).

Как изменять значения произвольных полей

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

1. update_post_meta()

Либо обновляет значение указанного произвольного поля, либо добавляет новое, если его не существует.

update_post_meta( $post_id, $meta_key, $meta_value, $prev_value = '' )
$post_id
(целое число) ID поста, метаданные которого нужно изменить.
$meta_key
(строка) ключ.

  • Если пост содержит несколько значений для одного и того же ключа, то, если не указан параметр $prev_value, будет обновлено первое найденное значение.
  • Если пост вообще не содержит метаданых с указанным ключом, тогда они будут добавлены.
$meta_value
(целое число|строка|массив) устанавливаемое значение.
$prev_value
(целое число|строка|массив) предыдущее значение параметра.

Пример:

update_post_meta( 541, 'color', 'белый', 'синий');

2. add_post_meta()

Добавляет метаданные для указанного поста.

add_post_meta( 541, 'color', 'желтый' ); // добавляем ещё один цвет к трем имеющимся

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

  • false — нужно (стоит по умолчанию),
  • true — не нужно, ключ должен быть уникален.
    add_post_meta( 541, 'size', 'огромный', true );

    Предположим, что наш товар может иметь только один размер, поэтому второе произвольное поле с ключом size добавлено не будет.

3. delete_post_meta()

Удаляем метаданные для указанного в параметрах поста.

delete_post_meta( 541, 'color' ); // в параметрах - ID поста и ключ произвольного поля

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

delete_post_meta( 541, 'color', 'зеленый' );

Фильтр, поиск и сортировка по произвольным полям

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

Произвольные поля для рубрик и меток

Сам по себе WordPress не имеет поддержки метаданных для таксономий (рубрик, меток и пр.), но в этом вам может помочь плагин Meta for taxonomies.

Миша Рудрастых Разработчик WordPress WooCommerce

Миша Рудрастых

Впервые познакомился с WordPress в 2009 году, и после двух лет мучений с Joomla и самописными движками это был просто бальзам на душу. С 2014 года меня можно встретить на WordCamp — официальной конфе по WP в Москве, иногда там выступаю. Также в настоящее время веду курсы по WordPress в Epic Skills в Питере.

По теме: