Многие мои читатели задаются вопросом как создать «кастомные» или «дополнительные» поля WordPress. Для того, чтобы в дальнейшем не возникало подобных вопросов, предлагаю раз и на всегда помочь вам разобраться с вопросом произвольных полей в WordPress.
В WordPress по умолчанию имеется возможность для каждого поста (любого типа, будь то запись post
, страница page
или какой-нибудь произвольный тип постов) задавать неограниченное количество параметров. На этот случай имеется даже отдельная таблица в базе данных wp_postmeta
.
Эти параметры называются произвольными полями или метаданными поста. Метаданные состоят из пар ключ=>значение
, например color=>красный
, size=>большой
.
Также один пост может иметь несколько произвольных полей с одним и тем же ключом: color=>красный
, color=>синий
, color=>зелёный
.
Задавать значения произвольных полей в WordPress можно тремя способами:
Итак, пошагово:
В версии WordPress 3.1 и выше этот блок может быть скрыт. Включите его в настройках экрана (о том как — читайте далее).
В первую очередь проверьте «Настройки экрана» — галочка напротив «Произвольные поля» должна быть отмечена.
Если же в настройках экрана вы ничего подобного не нашли, то вероятнее всего тип поста, с которым вы работаете, не поддерживает использование произвольных полей — это легко поправимо при помощи 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
(записи) имеют поддержку произвольных полей по умолчанию!
Функция позволяет вывести все произвольные поля текущего поста в виде маркированного списка <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>
Параметров у функции нет.
Про get_post_meta()
я уже подробно писал здесь.
Возвращает многоуровневый массив всех произвольных полей для текущего поста или поста, ID которого указан в параметрах функции.
print_r( get_post_custom( 541 ) );
Получим что-то вроде этого:
[color] => Array ( [0] => красный [1] => синий [2] => зеленый ) [size] => Array ( [0] => большой ) )
В отличие от функции the_meta()
, get_post_custom()
возвратит также и все скрытые произвольные поля поста.
Функция возвращает массив ключей всех произвольных полей поста.
print_r( get_post_custom_keys( 541 ) );
Выдаст:
Array ( [0] => color [1] => size )
Является производной от get_post_custom()
, а если быть точным, то просто пропускает её результат через php-функцию array_keys()
.
Возвращает один из ключей функции get_post_custom()
в виде массива, вне зависимости от количества аргументов.
print_r( get_post_custom_values( 'size', 541 ) );
[size] => Array ( [0] => большой ) )
Первый параметр функции обязателен (если вы его не укажите, будет возвращено null
).
Ну во-первых, вы можете добавлять и изменять их через админку (об этом было написано выше). Во-вторых, для этих целей существует несколько функций.
Либо обновляет значение указанного произвольного поля, либо добавляет новое, если его не существует.
update_post_meta( $post_id, $meta_key, $meta_value, $prev_value = '' )
$prev_value
, будет обновлено первое найденное значение.Пример:
update_post_meta( 541, 'color', 'белый', 'синий');
Добавляет метаданные для указанного поста.
add_post_meta( 541, 'color', 'желтый' ); // добавляем ещё один цвет к трем имеющимся
Последний параметр функции позволяет указать, нужно ли добавлять метаданные в том случае, если произвольное поле с указанным ключом уже имеется в базе данных:
false
— нужно (стоит по умолчанию),true
— не нужно, ключ должен быть уникален.
add_post_meta( 541, 'size', 'огромный', true );
Предположим, что наш товар может иметь только один размер, поэтому второе произвольное поле с ключом size
добавлено не будет.
Удаляем метаданные для указанного в параметрах поста.
delete_post_meta( 541, 'color' ); // в параметрах - ID поста и ключ произвольного поля
На случай, если метаданных с указанным ключом несколько, а нужно удалить только одно, конкретное, в третьем параметре функции можно указать, какое именно значение указанного ключа нужно удалить.
delete_post_meta( 541, 'color', 'зеленый' );
Про это уже написан целый пост, вы можете найти его по этой ссылке.
Сам по себе WordPress не имеет поддержки метаданных для таксономий (рубрик, меток и пр.), но в этом вам может помочь плагин Meta for taxonomies.
Очень интиреснно , почти все понял )
А в доп поля можно вставлять мета данные про публикацию, например в гугла ести система разметки страницы , с помощью их разметки можно пометить например цену к товару СЕРП может вывести её в результатах поиска.
Надеюсь я правильно сформировал вопрос.
Текст набран с моб. сори з опечатки.
Да, можно)
Допустим, выводим произвольное поле с гарантией.
Нужно сделать так, чтобы при гарантии "24 месяца" выводился "определённый текст", а при гарантии "12 месяцев" выводился "другой текст". То есть, если гарантия = (строго равно) "24 месяца", выводится "текст1". Если гарантия = "12 месяцев", выводится "текст2". Помогите, пожалуйста, разобраться. Заранее благодарю.
Сорри за задержку с ответом, был в отъезде.
Примерно так:
Большое спасибо!
в каком файле прописывать надо?
Смотря что.
Здравствуйте! Подскажите пожалуйста, есть настроенные произвольные поля на WP, но они отображаются на одной странице, можно ли сделать так, чтобы эти поля отображались автоматически на всех страницах сайта?
Здравствуйте!
А в какой части страницы они отображаются и как?
Здравствуйте! Они отображаются текстом/ссылками, картинками в шапке сайта и в подвале.
Ну примерный алгоритм действий:
if
, напримерif(is_single()):
— если да, то попробовать удалить условие.$post->ID
, убедиться, что она везде существует.хочу вывести доп поля в полной новости, мне в каком файле надо дописать?
single.php
, если я вас правильно понял.спс, файл нашел, только теперь не понял что вставлять, и куда
Значит вам нужно внимательнее поразбираться с разделом статьи «Как вывести произвольные поля» — там есть всё необходимое.
А как сделать, чтобы произвольное поле добавлялось по клику на "+" неограниченное количество раз? Хочу так картинки для поста добавлять и выводить их слайдером.
Записывайте данные с этого "резинового" произвольного поля в виде массива.
А само добавление этого поля как сделать?
Готового кода у меня для вас нет 🙂 Я хотел написать об этом пост ещё в прошлом году, но потом забросил.
Создаю закрытую часть сайта, где будет выводиться инфа о проектах. Юзер может эти проекты к себе добавить, далее потом уже в своих проектах он может по ним производить действия вклад, вывод... денег, может смотреть статистику по этому делу всему. Вопрос как это на wp сделать?
Нужно ли мне создавать вообще новую таблицу Projects, таблицу Users, таблицу связи projeects_usrs, таблицу статистики events. вИли этосе делается как то встроенными возможностями wp, кастомные типы постов, кастомные поля для записей и тд
Спасибо, за годный материал! В worpress c версии 5, нет произвольных полей, только через плагин, как я понял ?!
Все дело было в плагине ACF, он не давал включить.
acf такой acf!
А что, если надо к товарам добавить конфиденциальные данные и чтобы они были видны только лишь в письмах, сформированные вукоммерс, к купившим товар!
Есть ли решение такому?
Возможно вам нужно это.
Здравствуйте, не подскажите как отображать произвольное поле на страницах, я добавил его для двух своих страниц, собственно само поле должно выводится в шапке сайта, на странице индекс все работает без проблем, а вот на странице achive-progect никак не получается, попытался получить id записи через get_queried_object_id, не вышло, получилось только на странице индекс, а на странице с записями получаю значение id равное 0. Повторюсь пытаюсь вывести произвольное поле в шапке, подключенной к страницам через get_header
Добрый день, можете попробовать инициализировать первый пост на странице с записями через the_post().