Мой сайт о WordPress и PHP
 
30 июня 2007

Выпуск 30. Используем произвольные поля в WordPress

Читали 5035 раз
Рубрика: Плагины и хаки, E-mail рассылка
Навигация: Главная » 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 раньше всех!

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

7 комментариев к “Выпуск 30. Используем произвольные поля в WordPress”

  1. Alexey Maurov:

    а есть ли возможность через XML-RPC заполнять эти поля, при условии, что этот плаг установлен и настроен

  2. Alexey Maurov:

    в смысле, в плагине есть дополнение функциональности xml-rpc.php?

  3. Максим:

    В моей программе (wp-client) можно. В других, насколько я знаю, такой возможности нет.

  4. sonika:

    Я в wp-admin.css еще добавляю такой код:
    /* custom fields gui plugin */
    .editform { margin: 2em 0; width: 100%; border: 1px solid #e1e1e1; }
    .editform td { padding: 3px}
    .editform th { height: 26px; background: #2685af; text-align: center; color: #fff}

    И custom_fields_gui смотрится в админке, как будто там и родился :)

  5. Николай:

    Максим, пожалуйста, Вы могли бы объяснить, как Вы вставляете код Яндекс.Директ, но только чтобы она выводилась на каждой странице сайта и на верху. И как сделать так, чтобы по возможности можно было бы ее заменить, вставить другой код, т.е. чтобы был выбор, что вставить при создании страницы и кода... Где об этом можно узнать или скиньте, пожалуйста инструкцию Вашей вставки на e-mail. Буду Вам очень признателен.

  6. Hajo:

    Максим - респектуха за плаг, а sonika - умница, красоты добавила!

  7. 4et:

    Гениально, Максим. То что я искал.


Оставьте комментарий! (Вы согласны с правилами)

 

:mrgreen: :neutral: :twisted: :arrow: :shock: :smile: :???: :cool: :evil: :grin: :idea: :oops: :razz: :roll: :wink: :cry: :eek: :lol: :mad: :sad: :!: :?:

При добавлении кода (html, php) заменяйте < на &lt; и > на &gt;.
Внимание: антиспам - зверь! Копируйте своё сообщение перед отправкой. На всякий случай.