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

Рубрика: WordPress -> Архив рассылки
Воскресенье, 1 июля 2007 г.
Просмотров: 4450
Подписаться на комментарии по RSS
]]>
]]>

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

Про произвольные поля (метаполя) я уже рассказывал в одном из выпусков рассылки. Сегодня я хочу немного развить эту тему.

Произвольные поля отображаются в редакторе WordPress. Их можно использовать для того, чтобы хранить какое-то значение для записей. Например, можно придумать поле "Настроение" и выводить его рядом с записью. То есть мы можем задать для него любое значение ("Веселое", "Мрачное" и т.п.) и каким-то образом это использовать.

Типы произвольных полей

На самом деле у произвольных полей всего один тип - текстовый. То есть вы задаёте ключ (имя) и вводите его текстовое значение. Понятно, что вы можете указать в значении и текст, и числа, и булево значение (true, false). Но в этом случае вам нужно интерпретировать значение в нужный вам тип.

Для программистов скажу, что можно хранить в произвольных полях даже значения php-переменных. Для этого используют php-функции: serialize и unserialize. grin

Однако на практике управлять произвольными полями в редакторе не совсем удобно. Даже с учетом того, что для этого сейчас используется AJAX, то есть работа происходит без перезагрузки страницы.

Гораздо удобней было бы иметь отдельное поле в редакторе, где можно было бы внести нужные значения. Например как это делается, когда вы указывате трекбак, короткую ссылку или пароль. Кроме этого, было бы идеально выводить не только обычные текстовые поля, но и чекбокс (checkbox), список (select), группу (radio).

Плагин "rc:custom_field_gui"

Существует плагин rc:custom_field_gui в котором все это реализовано. Принцип его работы прост.

В каталоге плагина нужно сделать конфигурационный файл conf.ini, где вы отмечаете нужные вам секции, например:

  1.  [Plan]
  2.  type = textfield
  3.  size = 35
  4.  
  5.  [Favorite Post]
  6.  type = checkbox
  7.  default = checked
  8.  
  9.  [Miles Walked]
  10.  type = radio
  11.  value = 0-9 # 10-19 # 20+
  12.  default = 10-19
  13.  
  14.  [Temper Level]
  15.  type = select
  16.  value = High # Medium # Low
  17.  default = Low
  18.  
  19.  [Hidden Thought]
  20.  type = textarea
  21.  rows = 4
  22.  cols = 40

То есть в квадратных скобках (это начало секции) указывается название поля. В секции используются параметры. Для каждого типа (type) свои. Думаю, что с этим проблем не возникнет.

После стандартной установки плагина, нужно отредактировать conf.ini и он автоматически появится в вашем редакторе.

Проблемы "rc:custom_field_gui"

Как это обычно бывает, англоязычные пользователи не в курсе, то есть еще и другие страны и языки (впрочем, как и москвичи, которые не в курсе, что есть другие города), поэтому когда вы вводите название секции по-русски, то получаете её транслитерацию (при включенном плагине RusToLat). Поэтому метаполе получается совершенно с другим именем, чем то, которое вы задали. Это не совсем удобно. Если же задать секцию по английски, то её название в админ-панели отображается тоже по-английски. Лично для меня это уже минус.

Поэтому я решил немного переделать этот плагин.

Плагин "MaxSite - Произвольняе поля"

Собственно это тот же самый плагин, только несколько модифицированный. Также я сделал так, чтобы этот плагин появлялся и в постоянных страницах.

Главное отличие - это дополнительный параметр "mymeta", где можно указать имя метаполя.

  1.  [Лучшие страницы]
  2.  type = textfield
  3.  size = 60
  4.  mymeta = top_pages
  5.  
  6.  [Избранный пост]
  7.  type = checkbox
  8.  default = checked
  9.  mymeta = izbran_post
  10.  
  11.  [Выберите возраст]
  12.  type = radio
  13.  value = 0-9 # 10-19 # 20+
  14.  default = 10-19
  15.  mymeta = vybor_radio
  16.  
  17.  [Уровень]
  18.  type = select
  19.  value = High # Medium # Low
  20.  default = Low
  21.  mymeta = uroven
  22.  
  23.  [Ваш текст]
  24.  type = textarea
  25.  rows = 5
  26.  cols = 60
  27.  mymeta = vash_text

То есть теперь то, что вы заключаете в квадратные скобки, служит только заголовком. Само же название метаполя хранится отдельно. Правда, если вы не укажете "mymeta", то плагин будет работать, как и оригинальный.

Скачать мой вариант можно по этой ссылке (5Кб).

Применение

Вернемся к нашему настроению. grin Создадим conf.ini с таким содержимым:

  1.  [Настроение]
  2.  type = radio
  3.  value = "Отличное # Супер # Женюсь!"
  4.  default = Отличное
  5.  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.

В качестве параметра этой функции нужно указать номер записи, для которой следует получить все метаполя.

  1.  <?php
  2.   $all_meta = get_post_custom($ID);
  3.  ?>

В данном случае мы получили все метаполя записи $ID (это текущая запись) в виде массива в переменной $all_meta. Дальше нужно пройтись по полученному массиву и отобразить все записи.

Чтобы у вас не было путаницы, я сразу привожу готовый код, а после, как обычно, мы его разберем.

  1.  <?php
  2.   # вывод всех мета
  3.   $all_meta = get_post_custom($ID);
  4.   if ( $all_meta )
  5.   foreach ( $all_meta as $key => $val )
  6.   {
  7.   if ( strpos($key, '_') === 0 ) continue;
  8.   echo '<br /><strong>' . $key . '</strong>: ';
  9.   foreach ( $val as $val_key => $val_val ) echo $val_val . ' ';
  10.   }
  11.  ?>

После того, как мы получили (get_post_custom) все мета-поля в $all_meta, проверяем, что данные действительно есть (if). Запускаем цикл, где перебираем поля как ключ=значение (foreach).

Дальше интересней. Если в ключе первый символ равен "_" (символ подчеркивания), то мы не выводим это метаполе и сразу переходим к следующему (continue). Дело в том, что в WordPress'е принято, что мета-поля, начинающиеся с символа подчеркивания, являются служебными. Они используются для самых разных целей и нам они не нужны. Так, что этой проверкой (if ( strpos($key, '_') === 0 )), мы просто их игнорируем.

Соответственно, если это обычное метаполе, то мы выводим его название ($key) и все его значения ($val_val) в другом цикле.

Почему у нас получилось два цикла? Все просто. В WordPress'е метаполя хранятся в виде многомерного массива, то есть массив в массиве.

Таким образом у нас получилось вывести значения всех метаполей. Но, как вы помните, нам было бы интересней вывести значение только одного поля: "Настроение".

Вывод произвольного метаполя

Получить произвольное метаполе можно с помощью функции get_post_custom_values, где в качестве параметров нужно указать ключ (в нашем случае "nastr") и номер записи ($ID).

  1.  <?php
  2.   # вывод определенного поля
  3.   $my_meta = get_post_custom_values( 'nastr', $ID );
  4.   if ( $my_meta)
  5.   {
  6.   echo '<strong>Настроение</strong>: ';
  7.   foreach ( $my_meta as $val_key => $val_val ) echo $val_val . ' ';
  8.   }
  9.  ?>

Как видите, ничего сложного. grin

Думаю, что для вас не составит труда расширить это пример. Так же попробуйте использовать не radio-боксы, а выпадающий список select. Тогда он займет меньше места в редакторе. Ну а для самых пытливых умов предлагаю сделать отображение keywords и description для каждой страницы индивидуально. grin

]]>twitter.com Google Buzz google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru]]>

Комментариев: 9

Вы можете получать новые комментарии к этой записи по RSS или оформить подписку на все комментарии сайта. Или даже на все новые записи сайта. Не знаете, как это сделать?
  1. 2007-07-01 в 05:51:10 | Alexey Maurov

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

  2. 2007-07-01 в 05:52:25 | Alexey Maurov

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

  3. 2007-07-01 в 13:45:50 | Максим

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

  4. 2007-07-03 в 01:44:55 | 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 смотрится в админке, как будто там и родился smile

  5. 2007-08-09 в 02:48:51 | Николай

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

  6. 2008-03-25 в 20:10:26 | Hajo

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

  7. 2008-05-18 в 17:34:53 | 4et

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

  8. 2008-10-13 в 13:37:50 | marat

    Интересно, а можно ли в админке для записи в каждой рубрике — настроить свои произвольные поля?

    Допустим, в рубрике Новости — одни поля показываются/заполняются в админке.

    В рубрике Каталог сайтов — другие.

  9. 2008-12-15 в 18:45:39 | flex

    Как сделать, чтобы в теме WP-Max при парсинге rss-лент в произвольные поля автоматом записывалось Image и путь к картинке?!

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

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)



grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)