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

В 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.

Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

По теме:

Комментарии 19

  • Алексей13 августа 2015 в 01:08 #

    Очень интиреснно , почти все понял )
    А в доп поля можно вставлять мета данные про публикацию, например в гугла ести система разметки страницы , с помощью их разметки можно пометить например цену к товару СЕРП может вывести её в результатах поиска.

    Надеюсь я правильно сформировал вопрос.
    Текст набран с моб. сори з опечатки.

  • Денис25 августа 2015 в 11:08 #

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

    <?php
    $my_meta = get_post_custom_values( 'garant', $ID );
    if ( $my_meta)
    {
    echo '<div class="nomer"><h2>Гарантия:</h2><p>';
    foreach ( $my_meta as $val_key => $val_val ) echo $val_val . '</p></div>';
    }
    ?>

    Нужно сделать так, чтобы при гарантии "24 месяца" выводился "определённый текст", а при гарантии "12 месяцев" выводился "другой текст". То есть, если гарантия = (строго равно) "24 месяца", выводится "текст1". Если гарантия = "12 месяцев", выводится "текст2". Помогите, пожалуйста, разобраться. Заранее благодарю.

    • Миша31 августа 2015 в 14:08 #

      Сорри за задержку с ответом, был в отъезде.

      Примерно так:

      $garant = get_post_meta( $ID, 'garant', true);
      if( $garant == 12 ) {
      echo 'Текст 1';
      } else if( $garant == 24 ) {
      echo 'Текст 2';
      }
  • Евгений25 августа 2015 в 17:08 #

    в каком файле прописывать надо?

  • Фаина30 августа 2015 в 11:08 #

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

  • Фаина1 сентября 2015 в 17:09 #

    Здравствуйте! Они отображаются текстом/ссылками, картинками в шапке сайта и в подвале.

    • Миша2 сентября 2015 в 21:09 #

      Ну примерный алгоритм действий:

      1. Проверить, не выводятся ли поля внутри какого-либо условия if, например if(is_single()): — если да, то попробовать удалить условие.
      2. Проверить, сколько файлов хедера и футера в папке с темой, если несколько, то убедиться, что вывод произвольных полей присутствует в каждом файле.
      3. Так как функция вывода произвольных полей требует, чтобы была задана переменная $post->ID, убедиться, что она везде существует.
  • Евгений2 сентября 2015 в 20:09 #

    хочу вывести доп поля в полной новости, мне в каком файле надо дописать?

    • Миша2 сентября 2015 в 21:09 #

      single.php, если я вас правильно понял.

      • Евгений3 сентября 2015 в 22:09 #

        спс, файл нашел, только теперь не понял что вставлять, и куда

        • Миша4 сентября 2015 в 07:09 #

          Значит вам нужно внимательнее поразбираться с разделом статьи «Как вывести произвольные поля» — там есть всё необходимое.

  • Виталий20 сентября 2015 в 01:09 #

    А как сделать, чтобы произвольное поле добавлялось по клику на "+" неограниченное количество раз? Хочу так картинки для поста добавлять и выводить их слайдером.

    • Миша20 сентября 2015 в 08:09 #

      Записывайте данные с этого "резинового" произвольного поля в виде массива.

      • Виталий20 сентября 2015 в 09:09 #

        А само добавление этого поля как сделать?

        • Миша21 сентября 2015 в 07:09 #

          Готового кода у меня для вас нет :) Я хотел написать об этом пост ещё в прошлом году, но потом забросил.

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.

  • Артем: Ага, понял. Вот только почему $args? Она же нигде не определена, по логике должна быть переменная $true_field_params или...