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

Многие мои читатели задаются вопросом как создать «кастомные» или «дополнительные» поля WordPress. Для того, чтобы в дальнейшем не возникало подобных вопросов, предлагаю раз и на всегда помочь вам разобраться с вопросом произвольных полей в WordPress.

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

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии — 23

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

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

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

    • Миша 13 августа 2015 #

      Да, можно)

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

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

    <?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 #

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

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

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

        Большое спасибо!

  • Евгений 25 августа 2015 #

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

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

      Смотря что.

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

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

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

      Здравствуйте!
      А в какой части страницы они отображаются и как?

  • Фаина 1 сентября 2015 #

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

    • Миша 2 сентября 2015 #

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

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

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

    • Миша 2 сентября 2015 #

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

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

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

        • Миша 4 сентября 2015 #

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

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

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

    • Миша 20 сентября 2015 #

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

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

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

        • Миша 21 сентября 2015 #

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

  • Валентин 10 февраля 2020 #

    Создаю закрытую часть сайта, где будет выводиться инфа о проектах. Юзер может эти проекты к себе добавить, далее потом уже в своих проектах он может по ним производить действия вклад, вывод... денег, может смотреть статистику по этому делу всему. Вопрос как это на wp сделать?
    Нужно ли мне создавать вообще новую таблицу Projects, таблицу Users, таблицу связи projeects_usrs, таблицу статистики events. вИли этосе делается как то встроенными возможностями wp, кастомные типы постов, кастомные поля для записей и тд

  • Denis 2 апреля 2020 #

    Спасибо, за годный материал! В worpress c версии 5, нет произвольных полей, только через плагин, как я понял ?!

    • Denis 2 апреля 2020 #

      Все дело было в плагине ACF, он не давал включить.

      • Миша 4 апреля 2020 #

        acf такой acf!

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

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, если же код – меньше одной строчки, то можно и в <code></code>.