Custom fields в WordPress — примеры продвинутого использования

[ ←Вернуться к стандартному виду ]

Печатная версия

Несмотря на то, что некоторые плагины предлагают свои «готовые» функции для вывода custom fields в шаблонах Темы, существует еще много разных «вкусностей», о которых в Кодексе WordPress написано крайне скудно.

Что такое custom fields (произвольные поля) в WordPress?

Многие видели такой бокс в админ. панели при написании/редактировании поста или страницы:

Custom fields WordPress 2.3.3 и ниже

Custom fields WordPress 2.3.3 и ниже

Custom fields WordPress 2.5. и выше

Custom fields WordPress 2.5. и выше

Произвольное поле (custom field) состоит из ключа (key) и его значения (value), и с помощью произвольных полей можно вывести практически любую информацию на странице записи (post) или Страницы (Page). Например, в боковой колонке, в шапке или в подвале блога. По сути механизм произвольных полей дает нам свободу в организации и расположении информации на странице записи и помогает выйти за пределы поля для написания/редактирования записи — все зависит от потребностей, структуры блога и вашей фантазии. Другими словами, мы можем располагать часть контента за пределами Цикла (Loop).

В имени ключа можно использовать латиницу, кириллицу, цифры, нижнее подчеркивание и пробелы — как вам удобно. Дефис в названии ключа (key) лучше не использовать.

Регистр букв в имени ключа имеет значение!

Проведенные здесь коды будут работать как вне Цикла, так и внутри его. Однако следует учитывать, что если в исходном коде одиночной записи/страницы между Циклом и выводом произвольного поля есть еще Циклы (например вывод «Еще из этой рубрики:» с помощью get_posts или query_posts), то тут результат непредсказуем и значение такого произвольного поля выведется из какой-нибудь другой записи, упомянутой в таком дополнительном Цикле, но не из текущей записи.

Полезные ссылки:

  • Using_Custom_Fields
  • The_Loop
  • плагины для работы с произвольными полями: раз, два (wp 2.3.3 и ниже), три (wp 2.5 и выше)
  • Иерархия шаблонов WordPress — рекомендуется к ознакомлению всем, кто собрался курочить Тему, а ниже мы этим как раз и займемся :) Если кратко, то за вывод одиночной записи отвечает шаблон single.php, а за вывод страницы — page.php

Пример 1

Работа с изображениями

Например, настроение (привет жж) можно вывести не только текстом, но и рисунком или смайликом. Для этого создаем папку moods в папке wp-content/uploads/, загружаем туда картинки happy.gif, sorry.gif, eh.gif и т.п., теперь в записи можно создавать ключ mood

А в нужном месте шаблона single.php (в папке Темы) прописываем:

<img src="<?php bloginfo('home') ?>/wp-content/uploads/moods/<?php echo get_post_meta($post->ID, 'mood', true) ?>.gif" alt="мое настроение" />

Если выбрать при создании/редактировании записи ключ mood и вписать значение happy, то получается:
мое настроение

Пример 2

Это все хорошо, но если в какой-либо записи настроение не указывать, то ссылка на файл получится битая:
мое настроение

Поэтому логично для каждого произвольного поля перед выводом проверять наличие значения для него:

<?php $image = get_post_meta($post->ID, 'mood', true); if($image !== '') { ?>
<img src="<?php bloginfo('home') ?>/wp-content/uploads/moods/<?php echo $image ?>.gif" alt="мое настроение" />
<?php } ?>

Пример 3

Можно также проверять на наличие значения для произвольного поля mood, и если оно отсутствует, то выводить дефолтовую катринку mymood.gif:

<?php $image = get_post_meta($post->ID, 'mood', $single = true); ?>
<?php if($image !== '') { ?>
<img src="<?php bloginfo('home') ?>/wp-content/uploads/moods/<?php echo $image; ?>" alt="мое настроение" />
<?php }
 else { ?>
<img src="<?php bloginfo('home') ?>/wp-content/uploads/moods/mymood.gif" alt="без настроения" />
<?php } ?>

Пример 4

Вариантов может быть множество, вот пример с выводом через произвольные поля картинки, css класса для img и alt. В отличие от предыдущего варианта тут мы будет указывать абсолютный урл картинки — для разнообразия, вы можете прописать урл к картинке как вам угодно: только имя файла happy, имя файла с расширением happy.gif или абсолютный урл http://site.ru/wp-content/uploads/moods/happy.gif — главное, чтобы в результате всех манипуляций собрался полный урл к картинке.

Первый шаг:

Получаем значения произвольных полей урл картинки, css класс и alt картинки (как видите, в ключах произвольных полей можно использовать не только латиницу, но и кириллицу и пробелы — как вам удобно):

<?php $image = get_post_meta($post->ID, 'урл картинки', $single = true);
$image_class = get_post_meta($post-&gt;ID, 'css класс', $single = true);
$image_alt = get_post_meta($post-&gt;ID, 'alt картинки', $single = true); ?>

Второй шаг:

Выводим значения произвольных полей, при этом перед выводом проверяем наличие значения для произвольного поля урл картинки, т.к. бессмысленно выводить изображение с битой ссылкой (пустым значением поля урл картинки), а вот если у изображения будет отсутствовать заполненный alt или css класс — то тут в общем ничего страшного не случится.

<?php if($image !== '') { ?>
<img src="<?php echo $image; ?>" alt="" /> class="<?php if($image_class !== '') { echo $image_class; } else { echo "alignleft"; } ?>"
alt="<?php if($image_alt !== '') { echo $image_alt; } else { echo the_title(); } ?>" />
<?php }
else { echo 'фото отсутствует'; } ?>

В результате мы получаем: если значение для произвольного поля урл картинки существует (главное условие), то выводим картинку. При этом если заполнено поля css класс, то выводим его, если не заполнено, то css класс «по умолчанию» = alignleft. Аналогично с alt к картинке, если значение поля alt картинки существует, то выводим его, иначе вместо него выводится заголовок текущей записи.

Скриншоты:

Если нет картинки

Если нет картинки

Заполняем произвольные поля

Заполняем произвольные поля

Что получилось

Что получилось

Итак

Пример с выводом настроения — условный (ни разу не видела, чтобы кто-то в WordPress блоге выводил настроение, как в жж) и иллюстирует принцип работы с произвольными полями и в частности с картинками.

Пример 5

Пример чуть сложнее.

Допустим, мы хотим выводить в сайдбаре при просмотре одиночной записи (или страницы) ссылку, т.е. у нас будет 2 произвольных поля: урл ссылки и анкор ссылки. Анкор без ссылки — это просто текст, а вот ссылка без анкора — это уже нехорошо, поэтому будет проверять в первую очередь на существование значения ключа «анкор ссылки»:

  • если анкор существует, а урл — нет, то выведется только анкор (т.е. просто текст)
  • если анкор и урл существуют, то выведется полноценная ссылка
  • если анкора не существует, а урл заполнен, то не выведется ничего — кому нужна ссылка без текста?
<?php
$url = get_post_meta($post->ID, 'url ссылки', true);
$ancor = get_post_meta($post->ID, 'анкор ссылки', true);
?>
<?php if($ancor !== '') { ?>
<?php if($url !== '') { ?>
<a href="<?php echo $url ?>">
<?php } ?>
<?php echo $ancor ?>
<?php if($url !== '') echo '</a>'; ?>
<?php } ?>
</a>

Пример 6

Один ключ и несколько значений

Если у произвольного поля один ключ и несколько значений у этого ключа, то вышеописанные способы не подходят — выведется только первое значение ключа. Как может случиться, что у одного ключа получается несколько значений? Например, при использовании любого из плагинов для вывода custom fields в админ. панели можно создать список-множественный выбор значений произвольного поля, на картинке справа список значений ключа «В номере» создан посредством плагина Custom Write Panel (работает до wp 2.3.3 включительно, для wp 2.5 и выше есть аналог этого плагина — FreshPost).

Вот таким кодом можно вывести все значения для ключа «В номере» (обратите внимание на то, что «В номере» и «в номере» — это разные ключи, регистр букв имеет значение!), значения будут разделяться запятыми:

<?php
$inroom = get_post_meta($post->ID, "В номере", false);
if ($inroom[0]=="") { }
else{ echo implode(", ",$inroom); }
?>

UPD Другой вариант, значения ключа songs выводятся в виде ненумерованного списка:

<?php $songs = get_post_meta($post->ID, 'songs', false); ?>
<h3>Слушаю треки:</h3>
<ul>
<?php foreach($songs as $song) { echo '<li>'.$song.'</li>'; } ?>
</ul>

Пример 7

Выводим nextgen gallery в боковой колонке

С помощью механизма произвольных полей можно вывести каждому посту свою галерею в боковой колонке. Что нам для этого надо? Создать галерею (речь идет о Nextgen Gallery) и посмотреть какой ID ей присвоен, затем создать ключ gallery-id и в значение записать ID галереи, все готово!

В sidebar.php, естественно, должен быть такой код (большое спасибо за него Максиму), который помимо всего прочего «страхует» нас от неправильного указания ID, который может состоят только из цифр, но не в коем случае букв:

<?php $myid = $wp_query->post->ID;
$my_meta = get_post_custom_values( 'gallery-id', $myid );
if ( $my_meta) {
echo '<strong>Галерея</strong>: ';
foreach ( $my_meta as $val_key =&gt; $val_val )
$val_val = (int) trim( $val_val );
echo nggShowGallery($val_val);
} ?>

Пример 8

Каждой одиночной записи — своя шапка, или картинка в боковой колонке или что угодно!

Если у записи (поста) не заполнено значение произвольного поля шапка (полный урл к картинке), то берется картинка-шапка header.jpg из папки img активной Темы, а если такое произвольное поле существует, то выводится индивидуальная картинка-шапка при просмотре этой записи вместо стандартной шапки:

<?php
 if (is_single() || is_page() ) {
$shapka = trim(get_post_meta($post-&gt;ID, 'шапка', true));
if ( strlen($shapka) > 0 )
echo '<img src="' . $shapka . '" alt="" width="530px" height="240px" />';
else  echo '<img src="' . TEMPLATEPATH . '/img/header.jpg" alt="" width="530px" height="240px" />'; }
else  { echo '<img src="' . TEMPLATEPATH . '/img/header.jpg" alt="" width="530px" height="240px" />'; }
?>

Пример 9

Дополнительные слова в title записи

Привожу полностью свой любимый title для WordPress, вывод доп. слов в заголовок одиночной записи (поста) осуществляется с помощью произвольного поля с ключом seo-title:

<?php
 if (is_home () ) {  bloginfo('name'); }
 elseif ( is_category() ) { single_cat_title(); }
elseif (is_single() ) { wp_title(' '); echo ' '; single_cat_title(); $key="seo-title"; echo get_post_meta($post->;ID, $key, true); }
elseif (is_search() ) { bloginfo('name'); echo " результаты поиска: "; echo wp_specialchars($s);}
elseif (is_tag() ) { echo "Тег: "; wp_title(' '); echo '  '; bloginfo('name'); }
else { wp_title(); }
 ?>

Пример 10

Вывод google map с помощью custom fields

Способ, описанный в этой статье Custom Fields & Google Maps API (англ.) я пробовала — отлично работает!
Суть его в том, что создается произвольное поле gps и в значение записывается координата маркера, например 43.743321,39.721069 для Сочи. Скриншоты смотрите в статье.

Пример 11

Цикл (Loop), основанный на custom fields

Из Кодекса WordPress пример Цикла, который выведет посты из рубрик с ID=1,2 и 3, у которых есть произвольное поле paragraf, посты будут отсортированы по алфавиту значений ключа paragraf:

SELECT * FROM $wpdb->posts
LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id)
LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->;term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->term_taxonomy.term_id = 1,2,3
AND $wpdb->term_taxonomy.taxonomy = 'category'
AND $wpdb->posts.post_status = 'publish'
AND $wpdb->postmeta.meta_key = 'paragraf'
ORDER BY $wpdb->postmeta.meta_value ASC

Пример 12

Сортировка записей в соответствии со значением определенного ключа custom fields.

Этим решением с нами поделился Александр Мальцев (mayuxi).

Пример: у нас есть посты с произвольным полем rating, допустим, у записи «Привет, мир!» значение произ. поля rating равно 3, у записи «Как дила?» 69, а у записи «Ахтунг, мухтар» 1, тогда они выведутся в таком порядке:

  1. «Ахтунг, мухтар»
  2. «Привет, мир!»
  3. «Как дила?»
<?php
usort($posts, 'rating_sort');
function rating_sort($a, $b) {
$ar = get_post_meta($a->ID, 'rating', true);
$br = get_post_meta($b->ID, 'rating', true);
if ($ar == $br) return 0;
return ($ar < $br) ? -1 : 1;
}
if (have_posts()) : while (have_posts()) : the_post();
?>
Далее идет стандартный Цикл, примеры см. выше

Еще примеры циклов с использованием custom fields смотрите в статье «Чекбокс «Опубликовать на главной»

Пример 13

Добавляем css к конкретной записи (при просмотре одиночной записи)

Такой код вставить сразу после <?php while (have_posts()) : the_post(); ?> в index.php или в single.php — без условия if (is_single())

<?php if (is_single()) { ?>
<?php $newcss = get_post_meta($post ->ID, 'post-css', true); ?>
<?php } // конец условия is_single ?>

Произвольное поле: post-css, в значение пишем css правила, например:

body {background:#ff0000!important;} .post {color:Green!important; font-size:14px} .entry p strong {color:#ccc!important;}

Пример 14

Организуем посты в серии с помощью custom fields

Источник: WordPress Custom Fields: Listing A Series Of Posts

Что значит серия? Это когда несколько постов объединены в общий сет, и при просмотре одиночной записи из определенной серии выводятся все посты из этой серии. Аналог — плагины типа related posts. Отличие — плагины типа related posts как бы сами «решают» какие записи являются связанными (подходящими) для конкретного поста, а тут мы имеем полный контроль над тем, какие посты должны быть в конкретной серии.

Т.е. мы создаем произвольное поле Серия, а в значение ему пишем наше название серии.

Код можно вставить в sidebar.php

<?php if (is_single() ) {
 // проверяем принадлежит ли пост какой-нибудь серии
// получаем имя серии
($series_name = get_post_meta($post->ID, 'Серия', $single = true);
// если пост в этой серии
if($series_name !== '') {
// выводим название серии
echo '<div class="single-offers"><h4>' . $series_name . ' — смотрите также:</h4>';
// формируем запрос в базу для вывода постов из этой серии
$query_string = "
SELECT *
FROM $wpdb->posts
LEFT JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
WHERE $wpdb->postmeta.meta_key = 'Серия'
AND $wpdb->postmeta.meta_value = '$series_name'
AND $wpdb->posts.post_status = 'publish'
AND $wpdb->posts.post_type = 'post'
ORDER BY $wpdb->posts.post_date ASC";
// выводим список постов
$series_posts = $wpdb->get_results($query_string, OBJECT);
if ($series_posts):
echo '<ul>';
foreach ($series_posts as $post):
echo '<li>'; ?>
<a title="<?php echo the_title(); ?>" href="<?php echo the_permalink(); ?>">
<?php echo the_title(); echo '</a></li>';
endforeach;
echo '</ul></div>';
endif;
rewind_posts();
}
// все, закончили с постами в серии
}
// закончили условие is_single()
?>

Пример 15

Цикл, в котором выводим посты с определенными произвольными полями, т.е. список постов, у которых есть хотя бы одно из указанных произвольных полей (в примере использованы имена произвольных полей Links и MyData).

Источник: How to Only Retrieve Posts With Custom Fields

Думаю нет смысла дублировать здесь код, см. в конце статьи ссылку на загрузку файлов-примеров sidebar.php и functions.php «Downloadable Code for Posts and Custom Fields»

Пример 16

Разные сайдбары для записей (постов)

(условимся, что сайдбары в папке Темы существуют, предназначены для вывода в одном месте лейаута блога и отличаются друг от друга содержимым, пример названий: sidebar.php, sidebar-var2.php и sidebar-var3.php). См. в кодексе про get_sidebar.

Находим в файлах Темы вызов сайдбара:

и заменяем его на:

<?php $sidebar = get_post_meta($post ->ID, "sidebar", true); get_sidebar($sidebar); ?>

Теперь в каждой записи создаете произвольное поле sidebar, а в значение пишете ему часть имени (после sidebar-) того сайдбара, который хотите показывать при просмотре этой записи: var2 или var3. Если у одиночной записи нет произвольного поля sidebar, то выведется сайдбар «по-умолчанию» sidebar.php

Источник: WordPress hack: Choose the sidebar to use, post by post

Пример 17

Выводим что-либо в зависимости от значения определенного ключа custom field

<?php $value = get_post_meta($post ->ID, 'hobbies', true);
if($value == 'gaming') {
echo '<a href="http://domain.tld/gaming/">Gaming Stuff</a>';
} elseif($value == 'sleeping') {
echo '<a href="http://domain.tld/sleeping/">Nap Supplies</a>';
} elseif($value == 'eating') {
echo '<a href="http://domain.tld/eating/">Dieting Advice</a>';
} else {
echo '<a href="http://domain.tld/">Home Page</a>';
}
?>

Пример 18

Выводим индивидуальный текст для more

Индивидуальный more (вместо стандартного «Читать далее») можно вывести несколькими способами, в том числе и с помощью произвольного поля. Вручную это делается так: <!--more Узнать чем дело закончилось!-->, но для этого нужно переключаться в режим «код» в виз. редакторе.

А вот способ с использованием custom field: ищем в single.php (файле, отвечающем за вывод одиночной записи) строчку

<?php the_content("Читать далее »"); ?>

и заменяем на:

<?php $custommore = get_post_meta($post ->ID, 'custom_more', true); ?>
<?php if (!$custommore) { $custommore = 'Читать далее »'; } ?>
<?php the_content($custommore); ?>

В записи создаем ключ произвольного поля custom_more и в значение пишем свой текст.

Пример 19

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

Нашла в Кодексе новый параметр для произвольных полей в query_posts

meta_compare= оператор для meta_value=, по умолчанию '=', другие возможные значения '!=', '>', '>=', '<', и '<='

Примеры использования:

Вывод записей и страниц с ключем произвольного поля color и любым значением, кроме blue:

<?php query_posts('post_type=any&meta_key=color&meta_compare=!=&meta_value=blue'); ?>

Вывод записей с ключем miles и числовым значением, которое меньше чем 22 (на заметку: значение 99 будет больше, чем 100, т.к. по сути это не числа; выход: давать значения такие как : 001, 055, 099):

<?php query_posts('meta_key=miles&meta_compare=<=&meta_value=22'); ?>

Пример 20

Выводим посты с 2 определенными произвольными полями и их значениями

Источник: Customize Posts Order in WordPress via Custom Fields

Пример Цикла для вывода всех постов, которые одновременно содержат 2 произвольных поля и их определенные значения: 'ключ1' —> 'значениеключа1' и 'ключ2' —> 'значениеключа2'

<?php $querystr = "
SELECT wposts.*
FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta, $wpdb->postmeta wpostmeta2
WHERE wposts.ID = wpostmeta.post_id
AND wposts.ID = wpostmeta2.post_id
AND wpostmeta.meta_key = 'ключ1'
AND wpostmeta.meta_value = 'значениеключа1'
AND wpostmeta2.meta_key = 'ключ2'
AND wpostmeta2.meta_value = 'значениеключа2'
AND wposts.post_type = 'post'
AND wposts.post_status = 'publish'
";
$pageposts = $wpdb->get_results($querystr, OBJECT);
if ($pageposts)
{
foreach ($pageposts as $post)
{
setup_postdata($post);
?>
<!--вывод постов-->
<div>id="post-<?php the_ID(); ?>">
<h2><a title="Permanent Link to <?php the_title_attribute(); ?>" rel="bookmark" href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
<div class="entry"><?php the_content('Read the rest of this entry &raquo;'); ?></div>
<p class="postmetadata">
<?php the_tags('Tags: ', ', ', '<br />'); ?> Posted in <?php the_category(', ') ?> |
<?php edit_post_link('Edit', '', ' | '); ?> <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?>
</div>
<!--закончили вывод постов-->
<?php  }  }  ?>

Нужные вещи

Плагин Mass Custom Fields Manager позволяет из админки массово управлять произвольными полями, больше не нужно открывать каждую запись / страницу чтобы внести изменения в custom filelds, с помощью этого плагина все делается на одной странице в админ. панели ВордПресса.

Про плагины, работающие с custom fields и облегчающие заполнение произвольных полей для записи / страницы я уже писала.


Комментариев: 130, оставить свой »

Страницы: [13] 12 11 10 9 8 7 6 5 4 3 … 1 » Показать все

  1. # 130 Максим 24.06.2013 в 15:38

    А как можно массово присвоить произвольные поля для записей блога?

  2. # 129 Оксана 15.05.2013 в 00:13

    Очень полезная статья! Подскажите можно ли добавить в произвольное поле другую галерею Image Gallery Reloaded, это замена стандартной. Я пробовала вашим методом - выдает ошибку

  3. # 128 Nick (1) 04.05.2013 в 20:59

    ПРИМЕР № 13
    При вставке в сингл все работает, а при вставке в index нет. Как выяснилось этот код вообще не появляется на странице одиночной записи или страницы если вставлен в index. Вставил в single.php и в page.php.все работает на ура. Спасибо.

  4. # 127 Alexey (1) 02.01.2013 в 17:41

    Извиняюсь за глупый вопрос, куда вставить код: Пример 11 .
    Нужно срочно сделать сортировку недвижимости по цене, плагин WP-Property  http://wordpress.org/extend/plugins/wp-property/screenshots/

  5. # 126 Alexey 19.09.2012 в 14:12

    Подскажите как можно сделать из произвольных полей поисковик для сайта недвижимости. В поисковик должно входить несколько значений, таких как : город, цена ,площадь, комнат и ещё пару значений.
    Очень срочно нужно! Помогите!

  6. # 125 Дмитрий (1) 14.07.2012 в 09:43

    Подскажите пожалуйста! Если существует определённое произвольное поле, то как программно его удалить, если это возможно?
    Спасибо за ответ.

  7. # 124 Саньок 24.06.2012 в 14:18

    Учите php, новички, блин!

  8. # 123 Gulnara Samigulina (1) 06.06.2012 в 20:55

    ни ответа- ни привета!

  9. # 122 Виталий (1) 06.06.2012 в 12:11

    Интересный пост, но написано как "для своих". Посещаемость наверное очень хорошая у блога, потому этим стоит ограничиться ??
    Собственно возникает много вопросов, несмотря на то, что статья очень грамотная. В последних комментариях раскрытия темы не увидел. Пост заброшен??

  10. # 121 Gulnara (1) 02.05.2012 в 20:22

    Здравствуйте. А все эти советы действуют только для записей или для страниц тоже? И непонятно, если в плагинах есть возможности создавать дополнительные поля, то зачем вписывать коды ? Я дилетант, конечно, но нельзя ли объяснить для новичков, как пользоваться этими полями и конкретно, что это даёт для поисковых систем или чего-то там ещё

Страницы: [13] 12 11 10 9 8 7 6 5 4 3 … 1 » Показать все

Написать комментарий


Ручная модерация комментов. Все саттелиты — в топку! Даже не сомневайтесь. Для вопросов о вордпресс не по теме поста есть два русскоязычных форума по wordpress.


Подписаться, не комментируя

[ ←Вернуться к стандартному виду ]

Печатная версия