Выпуск 30. Используем произвольные поля в WordPress
Произвольные поля в WordPress
Про произвольные поля (метаполя) я уже рассказывал в одном из выпусков рассылки. Сегодня я хочу немного развить эту тему.
Произвольные поля отображаются в редакторе WordPress. Их можно использовать для того, чтобы хранить какое-то значение для записей. Например, можно придумать поле "Настроение" и выводить его рядом с записью. То есть мы можем задать для него любое значение ("Веселое", "Мрачное" и т.п.) и каким-то образом это использовать.
Типы произвольных полей
На самом деле у произвольных полей всего один тип - текстовый. То есть вы задаёте ключ (имя) и вводите его текстовое значение. Понятно, что вы можете указать в значении и текст, и числа, и булево значение (true, false). Но в этом случае вам нужно интерпретировать значение в нужный вам тип.
Для программистов скажу, что можно хранить в произвольных полях даже значения php-переменных. Для этого используют php-функции: serialize и unserialize.
![]()
Однако на практике управлять произвольными полями в редакторе не совсем удобно. Даже с учетом того, что для этого сейчас используется AJAX, то есть работа происходит без перезагрузки страницы.
Гораздо удобней было бы иметь отдельное поле в редакторе, где можно было бы внести нужные значения. Например как это делается, когда вы указывате трекбак, короткую ссылку или пароль. Кроме этого, было бы идеально выводить не только обычные текстовые поля, но и чекбокс (checkbox), список (select), группу (radio).
Плагин "rc:custom_field_gui"
Существует плагин rc:custom_field_gui в котором все это реализовано. Принцип его работы прост.
В каталоге плагина нужно сделать конфигурационный файл conf.ini, где вы отмечаете нужные вам секции, например:
[Plan] type = textfield size = 35 [Favorite Post] type = checkbox default = checked [Miles Walked] type = radio value = 0-9 # 10-19 # 20+ default = 10-19 [Temper Level] type = select value = High # Medium # Low default = Low [Hidden Thought] type = textarea rows = 4 cols = 40
То есть в квадратных скобках (это начало секции) указывается название поля. В секции используются параметры. Для каждого типа (type) свои. Думаю, что с этим проблем не возникнет.
После стандартной установки плагина, нужно отредактировать conf.ini и он автоматически появится в вашем редакторе.
Проблемы "rc:custom_field_gui"
Как это обычно бывает, англоязычные пользователи не в курсе, то есть еще и другие страны и языки (впрочем, как и москвичи, которые не в курсе, что есть другие города), поэтому когда вы вводите название секции по-русски, то получаете её транслитерацию (при включенном плагине RusToLat). Поэтому метаполе получается совершенно с другим именем, чем то, которое вы задали. Это не совсем удобно. Если же задать секцию по английски, то её название в админ-панели отображается тоже по-английски. Лично для меня это уже минус.
Поэтому я решил немного переделать этот плагин.
Плагин "MaxSite - Произвольняе поля"
Собственно это тот же самый плагин, только несколько модифицированный. Также я сделал так, чтобы этот плагин появлялся и в постоянных страницах.
Главное отличие - это дополнительный параметр "mymeta", где можно указать имя метаполя.
[Лучшие страницы] type = textfield size = 60 mymeta = top_pages [Избранный пост] type = checkbox default = checked mymeta = izbran_post [Выберите возраст] type = radio value = 0-9 # 10-19 # 20+ default = 10-19 mymeta = vybor_radio [Уровень] type = select value = High # Medium # Low default = Low mymeta = uroven [Ваш текст] type = textarea rows = 5 cols = 60 mymeta = vash_text
То есть теперь то, что вы заключаете в квадратные скобки, служит только заголовком. Само же название метаполя хранится отдельно. Правда, если вы не укажете "mymeta", то плагин будет работать, как и оригинальный.
Скачать мой вариант можно по этой ссылке (5Кб).
Применение
Вернемся к нашему настроению.
Создадим conf.ini с таким содержимым:
[Настроение] type = radio value = "Отличное # Супер # Женюсь!" default = Отличное mymeta = nastr
Обратите внимание на кавычки в параметре value. Дело в том, что по правилам ini-файлов все не алфавитно-числовые символы, необходимо заключать в двойные кавычки.
После сохранения файла у нас в редакторе появится список:
- Отличное
- Супер
- Женюсь!
Выберите нужное значение и сохраните запись. Теперь нам нужно вывести результат на странице.
Вывод значений мета-полей
В предыдущей рассылке я рассказывал про вывод метаполей с помощью переменных, но разработчики WordPress сделали небольшой сюрприз и изменили формат данных метаполей. Поэтому старые примеры в общем-то работают, но нужно указать дополнительный индекс - [1] (это номер блога). Впрочем, об этом я написал в комментариях.
Поэтому сегодня мы откажемся от такого подхода, и сделаем вывод с помощью стандартных функций WordPress, которые должны работать и в будущих версиях.
Для начала нужно четко понять, где именно выводить метаполя. Делать нужно в цикле TheLoop.
Я часто упоминаю про цикл TheLoop. Под этим подразумевается цикличный вывод записей. Обычно он начинается со строк:
if (have_posts()) : while (have_posts()) : the_post();
и заканчивается
endwhile; else: echo 'Извините, ничего не найдено...'; endif;
То есть всё, что заключено между этих строк и есть цикл TheLoop.
Технически TheLoop означает последовательный перебор выбранных записей из базы данных. При каждой итерации цикла происходит заполнение всех переменных значениями текущего поста. Поэтому отпадает необходимость их получения дополнительными функциями. Например номер записи всегда хранится в переменной $ID.
Для получения списка всех метаполей текущей записи мы воспользуемся WordPress-функцией get_post_custom.
В качестве параметра этой функции нужно указать номер записи, для которой следует получить все метаполя.
<?php $all_meta = get_post_custom($ID); ?>
В данном случае мы получили все метаполя записи $ID (это текущая запись) в виде массива в переменной $all_meta. Дальше нужно пройтись по полученному массиву и отобразить все записи.
Чтобы у вас не было путаницы, я сразу привожу готовый код, а после, как обычно, мы его разберем.
<?php
# вывод всех мета
$all_meta = get_post_custom($ID);
if ( $all_meta )
foreach ( $all_meta as $key => $val )
{
if ( strpos($key, '_') === 0 ) continue;
echo '<br /><strong>' . $key . '</strong>: ';
foreach ( $val as $val_key => $val_val ) echo $val_val . ' ';
}
?>
После того, как мы получили (get_post_custom) все мета-поля в $all_meta, проверяем, что данные действительно есть (if ). Запускаем цикл, где перебираем поля как ключ=значение (foreach).
Дальше интересней. Если в ключе первый символ равен "_" (символ подчеркивания), то мы не выводим это метаполе и сразу переходим к следующему (continue). Дело в том, что в WordPress'е принято, что мета-поля, начинающиеся с символа подчеркивания, являются служебными. Они используются для самых разных целей и нам они не нужны. Так, что этой проверкой (if ( strpos($key, '_') === 0 )), мы просто их игнорируем.
Соответственно, если это обычное метаполе, то мы выводим его название ($key) и все его значения ($val_val) в другом цикле.
Почему у нас получилось два цикла? Все просто. В WordPress'е метаполя хранятся в виде многомерного массива, то есть массив в массиве.
Таким образом у нас получилось вывести значения всех метаполей. Но, как вы помните, нам было бы интересней вывести значение только одного поля: "Настроение".
Вывод произвольного метаполя
Получить произвольное метаполе можно с помощью функции get_post_custom_values, где в качестве параметров нужно указать ключ (в нашем случае "nastr") и номер записи ($ID).
<?php
# вывод определенного поля
$my_meta = get_post_custom_values( 'nastr', $ID );
if ( $my_meta)
{
echo '<strong>Настроение</strong>: ';
foreach ( $my_meta as $val_key => $val_val ) echo $val_val . ' ';
}
?>
Как видите, ничего сложного.
Думаю, что для вас не составит труда расширить это пример. Так же попробуйте использовать не radio-боксы, а выпадающий список select. Тогда он займет меньше места в редакторе. Ну а для самых пытливых умов предлагаю сделать отображение keywords и description для каждой страницы индивидуально.
Подпишитесь на рассылкуИспользуем WordPress для создания своего сайта
и получайте её на e-mail раньше всех!
Постоянная ссылка: http://maxsite.org/?p=245
Версия для печати
