Произвольные поля в WordPress
Многие мои читатели задаются вопросом как создать «кастомные» или «дополнительные» поля 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
(записи) имеют поддержку произвольных полей по умолчанию!
Как вывести произвольные поля
1. the_meta()
<ul>
. Например для нашего случая код:<p>Метаданные поста:</p> <?php the_meta(); ?> |
Выведет:
<p>Метаданные поста:</p> <ul> <li><span>color:</span> красный, синий, зеленый</li> <li><span>size:</span> большой</li> </ul> |
Параметров у функции нет.
2. get_post_meta()
Про get_post_meta()
я уже подробно писал здесь.
3. get_post_custom()
Возвращает многоуровневый массив всех произвольных полей для текущего поста или поста, ID которого указан в параметрах функции.
print_r( get_post_custom( 541 ) ); |
Получим что-то вроде этого:
[color] => Array ( [0] => красный [1] => синий [2] => зеленый ) [size] => Array ( [0] => большой ) ) |
В отличие от функции the_meta()
, get_post_custom()
возвратит также и все скрытые произвольные поля поста.
4. get_post_custom_keys()
Функция возвращает массив ключей всех произвольных полей поста.
print_r( get_post_custom_keys( 541 ) ); |
Выдаст:
Array ( [0] => color [1] => size ) |
Является производной от get_post_custom()
, а если быть точным, то просто пропускает её результат через php-функцию array_keys()
.
5. get_post_custom_values()
Возвращает один из ключей функции get_post_custom()
в виде массива, вне зависимости от количества аргументов.
print_r( get_post_custom_values( 'size', 541 ) ); |
[size] => Array ( [0] => большой ) ) |
Первый параметр функции обязателен (если вы его не укажите, будет возвращено null
).
Как изменять значения произвольных полей
Ну во-первых, вы можете добавлять и изменять их через админку (об этом было написано выше). Во-вторых, для этих целей существует несколько функций.
1. update_post_meta()
Либо обновляет значение указанного произвольного поля, либо добавляет новое, если его не существует.
update_post_meta( $post_id, $meta_key, $meta_value, $prev_value = '' ) |
- $post_id
- (целое число) ID поста, метаданные которого нужно изменить.
- $meta_key
- (строка) ключ.
- Если пост содержит несколько значений для одного и того же ключа, то, если не указан параметр
$prev_value
, будет обновлено первое найденное значение. - Если пост вообще не содержит метаданых с указанным ключом, тогда они будут добавлены.
- Если пост содержит несколько значений для одного и того же ключа, то, если не указан параметр
- (целое число|строка|массив) устанавливаемое значение.
- $prev_value
- (целое число|строка|массив) предыдущее значение параметра.
Пример:
update_post_meta( 541, 'color', 'белый', 'синий'); |
2. add_post_meta()
Добавляет метаданные для указанного поста.
add_post_meta( 541, 'color', 'желтый' ); // добавляем ещё один цвет к трем имеющимся |
Последний параметр функции позволяет указать, нужно ли добавлять метаданные в том случае, если произвольное поле с указанным ключом уже имеется в базе данных:
false
— нужно (стоит по умолчанию),true
— не нужно, ключ должен быть уникален.add_post_meta( 541, 'size', 'огромный', true );
Предположим, что наш товар может иметь только один размер, поэтому второе произвольное поле с ключом
size
добавлено не будет.
3. delete_post_meta()
Удаляем метаданные для указанного в параметрах поста.
delete_post_meta( 541, 'color' ); // в параметрах - ID поста и ключ произвольного поля |
На случай, если метаданных с указанным ключом несколько, а нужно удалить только одно, конкретное, в третьем параметре функции можно указать, какое именно значение указанного ключа нужно удалить.
delete_post_meta( 541, 'color', 'зеленый' ); |
Фильтр, поиск и сортировка по произвольным полям
Про это уже написан целый пост, вы можете найти его по этой ссылке.
Произвольные поля для рубрик и меток
Сам по себе WordPress не имеет поддержки метаданных для таксономий (рубрик, меток и пр.), но в этом вам может помочь плагин Meta for taxonomies.
Миша
Впервые познакомился с WordPress в 2009 году. С 2014 года меня можно встретить на WordCamp по всему миру — официальной конфе по WordPress, иногда там выступаю. Также периодически школа Epic Skills и LoftSchool приглашают меня вести у них уроки/вебинары.
Если вам нужна помощь с вашим сайтом или может даже разработка с нуля — пишите мне.
misha.blog
Вывод постов по значениям их произвольных полей в WordPress
Пост будет состоять из двух частей, в первой разберемся вообще с тем, что можно сделать при помощи meta_query, а во-второй рассмотрим несколько примеров по работе с произвольными полями без использования meta_query вообще.
Часть 1. Примеры использования meta_query
Вывод постов по значению произвольного поля
Начнем с самого простого примера, предположим, нам нужно вывести все товары синего цвета:
// значение произвольного поля 'color' равно 'blue' $true_args = array( 'meta_query' => array( array( 'key' => 'color', 'value' => 'blue' ) ) ); $true_query = new WP_Query( $true_args ); |
Если вы заглянете на страницу редактирования любого из полученных в данном примере товаров, то в блоке «Произвольные поля» вы увидите следующее:
Хочу заметить, что примеры упрощены, в массиве аргументов по-любому должны быть такие параметры, как posts_per_page
(количество постов, отображаемых на странице) и скорее всего post_type
(отдельный тип поста для товаров). То есть мы рассматриваем чисто meta_query
и ничего лишнего.
Также можно сделать и наоборот — то есть, чтобы выводились все товары,
// значение произвольного поля 'color' не равно 'blue' $true_args = array( 'meta_query' => array( array( 'key' => 'color', 'value' => 'blue', 'compare' => '!=' // оператор сопоставления ) ) ); $true_query = new WP_Query( $true_args ); |
А теперь те же самые примеры, но только добавим еще один цвет. Итак, сначала выводим все товары синего или красного цвета:
// значение произвольного поля 'color' равно 'blue' ИЛИ 'red' $true_args = array( 'meta_query' => array( array( 'key' => 'color', 'value' => array('blue','red'), 'compare' => 'IN' ) ) ); $true_query = new WP_Query( $true_args ); |
А теперь все товары, кроме товаров синего и товаров красного цвета:
// значение произвольного поля 'color' не равно 'blue' И не равно 'red' $true_args = array( 'meta_query' => array( array( 'key' => 'color', 'value' => array('blue','red'), 'compare' => 'NOT IN' ) ) ); $true_query = new WP_Query( $true_args ); |
Вывод постов по диапазону значений произвольного поля
Ну в случае с товарами удобно будет вывести их по диапазону цен, например выведем все товары, которые дороже 1000 и дешевле 3000:
// значение произвольного поля 'price' больше 1000 и меньше 3000 $true_args = array( 'meta_query' => array( array( 'key' => 'price', 'value' => array( 1000, 3000 ), 'type' => 'numeric', 'compare' => 'BETWEEN' ) ) ); $true_query = new WP_Query( $true_args ); |
Сравнивание значений произвольных полей
Разделим предыдущий пример на два примера:
- В первом — цена товаров будет больше 1000 (или равна 1000)
- Во втором — цена товаров будет строго меньше 3000
// значение произвольного поля 'price' больше или равно 1000 $true_args = array( 'meta_query' => array( array( 'key' => 'price', 'value' => 1000, 'type' => 'numeric', 'compare' => '>=' ) ) ); $true_query = new WP_Query( $true_args ); |
// значение произвольного поля 'price' меньше 3000 $true_args = array( 'meta_query' => array( array( 'key' => 'price', 'value' => 3000, 'type' => 'numeric', 'compare' => '<' ) ) ); $true_query = new WP_Query( $true_args ); |
Вывод постов по значениям нескольких произвольных полей
Ничего особо нового придумывать здесь не буду — просто объединю предыдущие примеры, например, чтобы товар был синего цвета И чтобы его цена была от 1000 до 3000, вот как будет выглядеть массив параметров:
// значение произвольного поля 'color' равно 'blue' И значение 'price' находится в диапазоне от 1000 до 3000 $true_args = array( 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'color', 'value' => 'blue' ), array( 'key' => 'price', 'value' => array( 1000, 3000 ), 'type' => 'numeric', 'compare' => 'BETWEEN' ) ) ); $true_query = new WP_Query( $true_args ); |
Часть 2. Работа с произвольными полями без помощи meta_query
Тут особо и не о чем рассказывать, если параметр WP_Query meta_key
(название параметра) и есть meta_value
(значение параметра, для числовых значений — meta_value_num
) . А ещё есть параметр сопоставления meta_compare
.
Теперь рассмотрим пример. Допустим, некоторые из постов мы должны отобразить на главной странице. Давайте выведем эти посты:
$true_args = array( 'meta_key' => 'homepage_show_it', 'meta_value' => 'on' ); $true_query = new WP_Query( $true_args ); |
А теперь получим все остальны посты, т.е. у которых параметр homepage_show_it не равен on.
$true_args = array( 'meta_key' => 'homepage_show_it', 'meta_value' => 'on', 'meta_compare' => '!=' ); $true_query = new WP_Query( $true_args ); |
Миша
Впервые познакомился с WordPress в 2009 году. С 2014 года меня можно встретить на WordCamp по всему миру — официальной конфе по WordPress, иногда там выступаю. Также периодически школа Epic Skills и LoftSchool приглашают меня вести у них уроки/вебинары.
Если вам нужна помощь с вашим сайтом или может даже разработка с нуля — пишите мне.
misha.blog
Произвольные поля в WordPress: Советы, трюки и хаки. Часть 2
Этот пост является продолжением статьи Произвольные поля в WordPress: Советы, трюки и хаки. Часть 1.
А теперь перейдем к самой коллекции советов, трюков и хаков…
Использование Произвольных полей с условными операторами
Использование условных операторов должно быть обязательным и необходимым условием при отображении Произвольных полей в ваших статьях. На пример, если вы забыли заполнить какое-либо поле, то вместо его значения можно выводить любой контент по умолчанию. Посмотрите на пример ниже:
<?php $songs = get_post_meta($post->ID, ‘songs’, true); //Проверка на существование поля Songs if ($songs) { ?> Listening to: <?php echo $songs; ?> <?php } //если такого поля нет тогда отображаем следующее else { ?> Listening to: Nothing (Grooveshark is under maintenance) <?php } ?> |
Использование Произвольных полей в качестве условных операторов
Техника использования полей в качестве условных операторов может быть очень-очень полезной. Мы покажем вам пару примеров того, как вы можете использовать такие поля при оформлении темы WordPress.
Как показать только те посты, где есть определенные Произвольные поля
Самой лучшей частью функции query_posts является параметр для произвольных полей. Таким образом, мы можем использовать его для создания цикла, который будет отображать только те записи, в которых присутствует определенное произвольное поле (или даже его значение).
Для того, чтобы все заработало, нужно перед циклом поставить следующий запрос:
query_posts(‘meta_key=music’); |
Запрос вернет записи с произвольным полем music.
А если вы хотите, чтобы отобразились только те записи, где в произвольном поле music есть значение Eminem, тогда нужно оформить код следующим образом:
query_posts(‘meta_key=music&meta_value=Eminem’); |
Как отобразить кнопку Digg в записях с определенным произвольным полем
Если вам нужно отображать известную кнопку Digg не во всех записях (допустим, что у вас не все записи попадают на главную страницу), а только в выбранных, то в этом случае вам пригодятся Произвольные поля.
Просто вставьте следующий код в файл single.php во внутрь цикла:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php // проверка на digg $digg = get_post_meta($post->ID, ‘Digg’, $single = true); // где отображать кнопку digg if($digg !== ») { ?> <script type=»text/javascript»> (function() { var s = document.createElement(‘SCRIPT’), s1 = document.getElementsByTagName(‘SCRIPT’)[0]; s.type = ‘text/javascript’; s.async = true; s.src = ‘http://widgets.digg.com/buttons.js’; s1.parentNode.insertBefore(s, s1); })(); </script> <a></a> <?php } // если кнопки digg нет else { echo »; } ?> |
Чтобы в записях появилась кнопка Digg, нужно создать произвольное поле с именем “Digg” со значением “true”.
Источник: How to Add a Digg Button Using Custom Fields
По такому же принципу можно сделать кнопку Like для соц. сети Facebook.
Перезапись имени Гостевого Автора с помощью Произвольного поля
Если у вас в блоге есть гостевые статьи, и вы точно знаете, что их авторы отпишутся один-два раза, тогда вам на помощь придут Произвольные поля, где можно завести имя и фамилию автора.
Вставьте следующий код в файл functions.php:
add_filter( ‘the_author’, ‘guest_author_name’ ); add_filter( ‘get_the_author_display_name’, ‘guest_author_name’ );
function guest_author_name( $name ) { global $post;
$author = get_post_meta( $post->ID, ‘guest-author’, true );
if ( $author ) $name = $author;
return $name; } |
И так, когда вы публикуете гостевую запись, не забудьте указать в произвольном поле guest-author
имя и фамилию автора.
Пример:
Источник: How to rewrite Guest Author Name with Custom Fields in WordPress
Как отобразить Произвольные поля вне цикла
Если у вас появилась потребность отображать определенный контент вне основного цикла статьи, тогда вам на помощь прийдет следующий код:
<?php global $wp_query; $postid = $wp_query->post->ID; echo get_post_meta($postid, ‘Your-Custom-Field’, true); wp_reset_query(); ?> |
В коде нужно поменять “Your-Custom-Field” на имя вашего произвольного поля.
Источник: How to Display Custom Fields outside the loop in WordPress
Header, Footer и Sidebar остаются одинаковыми во всех записях и страницах в WordPress. Но, если вы создаете уникальный дизайн и хотите, чтобы у вас были различные меню, заголовки, подвалы в каждой записи, тогда это можно реализовать с помощью произвольных полей. Откройте single.php или page.php и найдите следующий код:
Замените его на следующий:
<?php global $wp_query; $postid = $wp_query->post->ID; $sidebar = get_post_meta($postid, «sidebar», true); get_sidebar($sidebar); wp_reset_query(); ?> |
Теперь, когда вы будете публиковать запись или страницу с уникальным сайдбаром, вам нужно будет добавить произвольное поле “sidebar” и указать в нем имя файла этого сайдбара. На пример, если вы укажете “wpbpage”, то отобразится sidebar-wpbpage.php, как новый сайдбар.
Чтобы завести новый файл сайдбара, просто скопируйте код старого в новый и измените его по вашему вкусу.
Используя эту технику, вы можете изменить и header и footer.
Источник: Display Different Sidebar for Each WordPress Post
Управление RSS-лентой с помощью Произвольных полей
Если вам нужно показывать определенный контент только RSS-подписчикам, тогда вам и здесь помогут Произвольные поля. В первом примере мы вам покажем, как можно использовать Произвольные поля для отображения текста/объектов вашей RSS-ленты. Сначала откройте functions.php и вставьте следующий код в тэги php:
function wpbeginner_postrss($content) { global $wp_query; $postid = $wp_query->post->ID; $coolcustom = get_post_meta($postid, ‘coolcustom’, true); if(is_feed()) { if($coolcustom !== ») { $content = $content.»<br /><br /><div>».$coolcustom.»</div>\n»; } else { $content = $content; } } return $content; } add_filter(‘the_excerpt_rss’, ‘wpbeginner_postrss’); add_filter(‘the_content’, ‘wpbeginner_postrss’); |
Теперь создайте Произвольное поле с именем “coolcustom” и добавьте для него любое значение. Вы можете добавить adsense рекламу или изображение и т.д.
С помощью второй техники мы покажем вам, как добавить дополнительный текст для заголовков статей в RSS. Это очень полезно, если в вашем блоге есть гостевые или спонсорские статьи.
Например, если ваша статья называется Start Microblogging in WordPress with Wumblr и это спонсорская статья, тогда вы можете изменить ее заголовок на Sponsored Post: Start Microblogging in WordPress with Wumblr. Тоже самое для гостевых статей и т.д.
Чтобы применить эту технику, откройте файл functions.php и добавьте в него следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function wpbeginner_titlerss($content) { global $wp_query; $postid = $wp_query->post->ID; $gpost = get_post_meta($postid, ‘guest_post’, true); $spost = get_post_meta($postid, ‘sponsored_post’, true);
if($gpost !== ») { $content = ‘Guest Post: ‘.$content; } elseif ($spost !== »){ $content = ‘Sponsored Post: ‘.$content; } else { $content = $content; } return $content; } add_filter(‘the_title_rss’, ‘wpbeginner_titlerss’); |
Согласно коду выше, если у вас есть Произвольные поля с именем “guest_post” или “sponsored_post” и со значением “true”, тогда в заголовке статьи появится дополнительный текст.
Источник: Completely Manipulate Your WordPress RSS Feeds
Как установить срок действия вашей статьи
Если вы участвуете в конкурсе или у вас заканчивается время скидок, тогда вы можете с помощью Произвольных полей указать время жизни вашей статьи или страницы. После истечения срока статья автоматически перестанет быть доступной.
Для этого вставьте в цикл следующие строки кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php if (have_posts()) : while (have_posts()) : the_post(); ?> $expirationtime = get_post_custom_values(‘expiration’); if (is_array($expirationtime)) { $expirestring = implode($expirationtime); }
$secondsbetween = strtotime($expirestring)-time(); if ( $secondsbetween > 0 ) { // На пример the_title(); the_excerpt(); } endwhile; endif; ?> |
Для того, чтобы код сработал, вам нужно добавить Произвольное поле “expiration” и в него добавить дату следующего формата: mm/dd/yyyy 00:00:00
Также вы можете использовать плагин Post Expiration.
Как сделать отображение статей индивидуальными с помощью Произвольных полей
Хотите, чтобы ваша статья отличалась от основной массы? Вы угадали, дизайн статьи можно поменять с помощью нового CSS класса, а новый класс мы добавим с помощью Произвольного поля.
Для начала создайте поле с именем “post-class” и добавьте в него имя класса. На пример, мы добавили имя “anniversary”. Затем в цикле пропишите следующий код:
<?php $custom_values = get_post_meta($post->ID, ‘post-class’); ?> |
Теперь вам нужно найти функцию post_class в вашем цикле и заменить ее код на следующий:
<?php post_class(‘class-1 class-2 ‘ . $custom_values); ?> |
Кроме того, вы можете добавить новое имя класса через header. Просто откройте файл header.php и вставьте в него следующий код между тэгами head.
<?php if (is_single()) { $customstyle = get_post_meta($post->ID, ‘customstyle’, true); if (!empty($customstyle)) { ?> <style type=»text/css»> <?php echo $customstyle; ?> <style> <?php } } ?> |
После этого создайте поле с именем “customstyle” и добавьте в него любой CSS текст. Например такой:
#coolimageclass{border: 5px solid #ccc;} |
Мы надеемся, что эта статья расширит ваш кругозор относительно WordPress. Если у вас есть замечания или предложения относительно статей, тогда ждем ваших комментариев.
Также вы можете скачать и посмотреть в действии следующие плагины, которые расширяют функциональность WordPress с помощью Произвольных полей:
- Custom Fields Template
- More Fields
Возможно, Вам будет интересно ↓↓↓
2web-master.ru
Основы работы с WordPress: произвольные поля
Произвольные поля – удобный инструмент для внесения индивидуальных данных, соответствующих определенному посту. С их помощью можно решать массу вопросов: выводить миниатры, специальные изображения, составлять прайс-листы, ценники, вставлять рекламу, специальные ссылки, и многое другое. Произвольные поля записываются в базу данных, и в любой момент их значения, соответствующие определенным постам, могут быть из нее извлечены и выведены. Давайте посмотрим, как вводить произвольное поле и выводить значение произвольного поля внутри записи.
Добавление произвольного поля
Чтобы добавить произвольное поле в пост, откройте свойства экрана в редакторе постов, и выведете форму работы с произвольными полями.
После этого можете добавить произвольное поле в пост. У произвольного поля есть название и значение. Название полю лучше давать стандартными латинскими символами.
Значение произвольного поля может быть любым.
Вы можете добавить любое нужное количество произвольных полей. Любое произвольное поле можно в последствии отредактировать: удалить, изменить значение. Все произвольные поля записываются в базе данных, и их можно выбирать из списка уже ранее использованых.
Вывод значения произвольного поля в посте
Вывод произвольного поля связан с постом. Поэтому он осуществляется всегда внутри цикла вывода содержимого поста, либо огранизуется отдельная функция, извлекающая значение произвольного поля по ID поста. Чтобы вывести значение произвольного поля ads, используйте код:
Вывод значения произвольного поля, как видно, можно осуществлять с помощью стандартной функции get_post_custom_values или с помощью функции get_post_meta.
n-wp.ru