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

Содержание

Вводная часть

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

Каждый, кто достаточно близко знаком с WordPress неоднократно встречался с понятием «произвольные поля» и с их помощью решал некоторые нетривиальные задачи.

Произвольные поля в WordPress — очень удобный инструмент, когда нужно «прикрепить» к конкретному посту какие-либо дополнительные данные. Такими данными может быть что угодно, начиная от логических true/false (1/0), заканчивая объемными текстами, массивами и прочим. К примеру, мы можем создать новое произвольное поле Title и в его значение написать текст (альтернативный заголовок поста), затем в коде шаблона использовать следующий код, чтобы вывести этот текст:

<title><?php echo get_post_meta($post->ID, ‘title’, true); ?></title>

Следует отметить, что функцию get_post_meta() можно использовать за пределами Цикла WordPress, т.е. где угодно в шаблоне. В данном примере мы используем её в <head> части документа, чтобы дать html странице заголовок отличный от заголовка самой статьи (иногда полезно для SEO).

Другой пример: используя произвольные поля мы можем выполнять или не выполнять действия, в зависимости от того, какие данные у нас находится в значении произвольного поля. Например, размещая в произвольное поле логические цифры 1 или 0 мы можем выводить или не выводить какую-либо информацию для текущего поста.

Произвольные поля используются в WordPress сплошь и рядом, различными плагинами оценки постов (WP-PostRatings), SEO плагинами (Platinum SEO Pack), позволяющими указать Title, Description, Keywords поста, моим плагином для создания миниатюр (Kama Thumbnail) и многими другими плагинами. Образно говоря, каждая четвертая нестандартная задача решается посредством произвольных полей, поэтому если вы еще не знаете как их использовать, то ознакомьтесь с этим мануалом. А ниже мы поговорим о том, как создать отдельный блок с нужными нам произвольными полями и как сделать это без плагинов.

Мало кто знает, что если создать произвольное поле ключ которого (название) начинается на _ (нижнее подчеркивание), например _my_special_key, то такое поле не будет выводиться в выпадающем списке произвольных полей при редактировании постов и будет считаться «внутренним» произвольным полем, которое используется системой. Создать такое поле можно только запросом к БД, например, используя функции add_post_meta() или update_post_meta().

меню

Прежде чем начать создание

Забегая вперед, скажу что нижеследующие описание будет полезно, только тем кто хоть немного разбирается в HTML, т.е. если вы совсем не в зуб ногой в HTML и PHP, то читать все что ниже — пустая трата времени.

Предположим, что мы делаем сайт на заказ, и при этом на сайте используются произвольные поля. Объяснять заказчику, какое поле выбирать из списка, чтобы добавить ту или иную информацию к посту, проблематично, к тому же это быстро забывается. Именно поэтому уже давно написаны плагины, благодаря которым можно легко создать блок произвольных полей, где не нужно выбирать поле (ключ), и только потом вписывать значение. В таких блоках нужно сразу вписывать значение и есть возможность описать каждое поле, при одном взгляде на которые становится понятно его назначение. Блок, который мы сейчас создадим будет выглядеть так:

А данные такого блока в самих произвольных полях, после сохранения поста, будут записаны так:

Что мы видим? — Ненужные для посторонних глаз ключи произвольных полей (о них я говорил выше), которые к тому же нужно еще и выбирать из выпадающего списка (а их там может быть совсем не 4, а куда больше…): description, robotmeta, select и title. Разумеется, создать мета блок произвольных полей — отличная идея.

меню

Создаем мета блок произвольных полей

Для создания метаблока нам понадобятся всего 2 хука: add_meta_boxes и save_post, функция add_meta_box() и некоторые знания html и php. Добавляем следующий код в файл темы functions.php:

#1. Создадим новый мета блок для постов

Назовем его «Дополнительные поля»:

// подключаем функцию активации мета блока (my_extra_fields) add_action(‘add_meta_boxes’, ‘my_extra_fields’, 1); function my_extra_fields() { add_meta_box( ‘extra_fields’, ‘Дополнительные поля’, ‘extra_fields_box_func’, ‘post’, ‘normal’, ‘high’ ); }

#2. Заполним этот блок полями html формы

Делается это через, указанную в add_meta_box() функцию extra_fields_box_func(). Именно она отвечает за содержание мета блока:

<?php // код блока function extra_fields_box_func( $post ){ ?> <p><label><input type=»text» name=»extra» value=»<?php echo get_post_meta($post->ID, ‘title’, 1); ?>» style=»width:50%» /> ? заголовок страницы (title)</label></p> <p>Описание статьи (description): <textarea type=»text» name=»extra» style=»width:100%;height:50px;»><?php echo get_post_meta($post->ID, ‘description’, 1); ?></textarea> </p> <p>Видимость поста: <?php $mark_v = get_post_meta($post->ID, ‘robotmeta’, 1); ?> <label><input type=»radio» name=»extra» value=»» <?php checked( $mark_v, » ); ?> /> index,follow</label> <label><input type=»radio» name=»extra» value=»nofollow» <?php checked( $mark_v, ‘nofollow’ ); ?> /> nofollow</label> <label><input type=»radio» name=»extra» value=»noindex» <?php checked( $mark_v, ‘noindex’ ); ?> /> noindex</label> <label><input type=»radio» name=»extra» value=»noindex,nofollow» <?php checked( $mark_v, ‘noindex,nofollow’ ); ?> /> noindex,nofollow</label> </p> <p><select name=»extra»> <?php $sel_v = get_post_meta($post->ID, ‘select’, 1); ?> <option value=»0″>—-</option> <option value=»1″ <?php selected( $sel_v, ‘1’ )?> >Выбери меня</option> <option value=»2″ <?php selected( $sel_v, ‘2’ )?> >Нет, меня</option> <option value=»3″ <?php selected( $sel_v, ‘3’ )?> >Лучше меня</option> </select> ? выбор за вами</p> <input type=»hidden» name=»extra_fields_nonce» value=»<?php echo wp_create_nonce(__FILE__); ?>» /> <?php }

Все названия полей я оформил в массив extra, чтобы потом проще было обработать эти данные.

Спрятанное поле name=»extra_fields_nonce», нужно для проверки при сохранении данных.

меню

#3. Сохраняем данные

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

// включаем обновление полей при сохранении add_action( ‘save_post’, ‘my_extra_fields_update’, 0 ); ## Сохраняем данные, при сохранении поста function my_extra_fields_update( $post_id ){ // базовая проверка if ( empty( $_POST ) || ! wp_verify_nonce( $_POST, __FILE__ ) || wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) ) return false; // Все ОК! Теперь, нужно сохранить/удалить данные $_POST = array_map( ‘sanitize_text_field’, $_POST ); // чистим все данные от пробелов по краям foreach( $_POST as $key => $value ){ if( empty($value) ){ delete_post_meta( $post_id, $key ); // удаляем поле если значение пустое continue; } update_post_meta( $post_id, $key, $value ); // add_post_meta() работает автоматически } return $post_id; }

Вот и все, блок произвольных полей готов!

Теперь, изменяя html код, мы можем редактировать содержимое мета блока. Но не забываем, что названия полей имеют вид массива со значением ключа произвольно поля: name=»extra».

меню

Сложности с типом checkbox

Недостатком такого метода является то, что массив extra, обязательно должен быть определен, пусть даже он передает пустое значение иначе поле не будет обработано при сохранении данных. В связи с этим, возникает проблема при использовании типа checkbox: <input type=»checkbox», потому что checkbox передает данные только, если галочка выставлена и вообще ничего не передает, если галки нет. А нам нужно чтобы он передавал пустое значение, чтобы код удалял значение, если оно было сохранено до этого.

Чтобы обойти этот «недуг» я сделал так: перед полем чекбокса создаем hidden поле с name как у чекбокса и пустым значением. И получается, если галочка стоит, то значение hidden поля перебивается, если галки нет, то берется пустое значение hidden поля.

Т.е. checkbox нужно вызывать так:

<input type=»hidden» name=»extra» value=»» /> <input type=»checkbox» name=»extra» value=»1″ />

Такой же трюк иногда может пригодится и для поля с типом radio.

Пример реального кода с типами checkbox:

<?php // подключаем функцию активации мета блока (my_extra_fields) add_action(‘admin_init’, ‘my_extra_fields’, 1); function my_extra_fields() { add_meta_box( ‘extra_fields’, ‘Дополнительные поля’, ‘extra_fields_box_func’, ‘post’, ‘normal’, ‘high’ ); } // код блока function extra_fields_box_func( $post ){ ?> <p><label><input type=»text» name=»extra» value=»<?php echo get_post_meta($post->ID, ‘title’, 1); ?>» style=»width:50%» /> ? заголовок страницы (title)</label></p> <p>Описание статьи (description): <textarea type=»text» name=»extra» style=»width:100%;height:50px;»><?php echo get_post_meta($post->ID, ‘description’, 1); ?></textarea> </p> <p>Видимость поста: <?php $mark_v = get_post_meta($post->ID, ‘robotmeta’, 1); ?> <label><input type=»radio» name=»extra» value=»» <?php checked( $mark_v, » ); ?> /> index,follow</label> <label><input type=»radio» name=»extra» value=»nofollow» <?php checked( $mark_v, ‘nofollow’ ); ?> /> nofollow</label> <label><input type=»radio» name=»extra» value=»noindex» <?php checked( $mark_v, ‘noindex’ ); ?> /> noindex</label> <label><input type=»radio» name=»extra» value=»noindex,nofollow» <?php checked( $mark_v, ‘noindex,nofollow’ ); ?> /> noindex,nofollow</label> </p> <p><select name=»extra» /> <?php $sel_v = get_post_meta($post->ID, ‘select’, 1); ?> <option value=»0″>—-</option> <option value=»1″ <?php selected( $sel_v, ‘1’ )?> >Выбери меня</option> <option value=»2″ <?php selected( $sel_v, ‘2’ )?> >Нет, меня</option> <option value=»3″ <?php selected( $sel_v, ‘3’ )?> >Лучше меня</option> </select> ? выбор за вами</p> <p> <input type=»hidden» name=»extra» value=»»> <label><input type=»checkbox» name=»extra» value=»1″ <?php checked( get_post_meta($post->ID, ‘white’, 1), 1 )?> /> белый</label> <input type=»hidden» name=»extra» value=»»> <label><input type=»checkbox» name=»extra» value=»1″ <?php checked( get_post_meta($post->ID, ‘red’, 1), 1 )?> /> красный</label> <input type=»hidden» name=»extra» value=»»> <label><input type=»checkbox» name=»extra» value=»1″ <?php checked( get_post_meta($post->ID, ‘black’, 1), 1 )?> /> черный</label> </p> <input type=»hidden» name=»extra_fields_nonce» value=»<?php echo wp_create_nonce(__FILE__); ?>» /> <?php } // включаем обновление полей при сохранении add_action(‘save_post’, ‘my_extra_fields_update’, 0); /* Сохраняем данные, при сохранении поста */ function my_extra_fields_update( $post_id ){ // базовая проверка if ( empty( $_POST ) || ! wp_verify_nonce( $_POST, __FILE__ ) || wp_is_post_autosave( $post_id ) || wp_is_post_revision( $post_id ) ) return false; // Все ОК! Теперь, нужно сохранить/удалить данные $_POST = array_map( ‘sanitize_text_field’, $_POST ); foreach( $_POST as $key => $value ){ if( empty($value) ){ delete_post_meta( $post_id, $key ); // удаляем поле если значение пустое continue; } update_post_meta( $post_id, $key, $value ); // add_post_meta() работает автоматически } return $post_id; } меню

Еще один пример создания метабокса (ООП)

Этот пример показывает как создать одно поле, в котором будет храниться массив данных. Массив можно расширять или уменьшать через нажатие на + или удалить (работает на скрипте).

Это пример создание поля «повторитель», как у плагина ACF (поле repeater в платной версии).

В результате получим такой метабокс:

<?php new My_Best_Metaboxes; class My_Best_Metaboxes { public $post_type = ‘post’; static $meta_key = ‘company_address’; public function __construct() { add_action( ‘add_meta_boxes’, array( $this, ‘add_metabox’ ) ); add_action( ‘save_post_’ . $this->post_type, array( $this, ‘save_metabox’ ) ); add_action( ‘admin_print_footer_scripts’, array( $this, ‘show_assets’ ), 10, 999 ); } ## Добавляет матабоксы public function add_metabox() { add_meta_box( ‘box_info_company’, ‘Информация о компании’, array( $this, ‘render_metabox’ ), $this->post_type, ‘advanced’, ‘high’ ); } ## Отображает метабокс на странице редактирования поста public function render_metabox( $post ) { ?> <table class=»form-table company-info»> <tr> <th> Адреса компании <span class=»dashicons dashicons-plus-alt add-company-address»></span> </th> <td class=»company-address-list»> <?php $input = ‘ <span class=»item-address»> <input type=»text» name=»‘. self::$meta_key .'» value=»%s»> <span class=»dashicons dashicons-trash remove-company-address»></span> </span> ‘; $addresses = get_post_meta( $post->ID, self::$meta_key, true ); if ( is_array( $addresses ) ) { foreach ( $addresses as $addr ) { printf( $input, esc_attr( $addr ) ); } } else { printf( $input, » ); } ?> </td> </tr> </table> <?php } ## Очищает и сохраняет значения полей public function save_metabox( $post_id ) { // Check if it’s not an autosave. if ( wp_is_post_autosave( $post_id ) ) return; if ( isset( $_POST ) && is_array( $_POST ) ) { $addresses = $_POST; $addresses = array_map( ‘sanitize_text_field’, $addresses ); // очистка $addresses = array_filter( $addresses ); // уберем пустые адреса if ( $addresses ) update_post_meta( $post_id, self::$meta_key, $addresses ); else delete_post_meta( $post_id, self::$meta_key ); } } ## Подключает скрипты и стили public function show_assets() { if ( is_admin() && get_current_screen()->id == $this->post_type ) { $this->show_styles(); $this->show_scripts(); } } ## Выводит на экран стили public function show_styles() { ?> <style> .add-company-address { color: #00a0d2; cursor: pointer; } .company-address-list .item-address { display: flex; align-items: center; } .company-address-list .item-address input { width: 100%; max-width: 400px; } .remove-company-address { color: brown; cursor: pointer; } </style> <?php } ## Выводит на экран JS public function show_scripts() { ?> <script> jQuery(document).ready(function ($) { var $companyInfo = $(‘.company-info’); // Добавляет бокс с вводом адреса фирмы $(‘.add-company-address’, $companyInfo).click(function () { var $list = $(‘.company-address-list’); $item = $list.find(‘.item-address’).first().clone(); $item.find(‘input’).val(»); // чистим знанчение $list.append( $item ); }); // Удаляет бокс с вводом адреса фирмы $companyInfo.on(‘click’, ‘.remove-company-address’, function () { if ($(‘.item-address’).length > 1) { $(this).closest(‘.item-address’).remove(); } else { $(this).closest(‘.item-address’).find(‘input’).val(»); } }); }); </script> <?php } } меню

Плагины для создания блоков произвольных полей

В статье я говорил о плагинах, которые создают мета блоки заменяющие произвольные поля, но ни разу не упомянул ни один. Исправляюсь:

  • Advanced Custom Fields (ACF) — пожалуй, самый популярный и гибкий плагин для создания произвольных полей. С хорошей документацией.

  • Custom Field Suite — похож на ACF, только менее навороченный.

  • Carbon Fields — похож на ACF только без визуальной настройки, все делается в коде. Хорошо подойдет для разработчиков. Бесплатный.

  • CMB2 — CMB2 инструмент для разработчиков для создания: метабоксов, метаполей. Позволяет легко управлять записями, элементами таксономий, пользователями, комментариями или создавать произвольные страницы настроек.

  • Custom Field Template — настоящий комбайн. С ним можно создать любую форму, для любых типов постов, указать формы для отдельных постов и рубрик. Думаю в большинстве случаев, можно обойтись без такого комбайна.

  • kc-settings — ураган а не плагин, хоть и не сторонник плагинов, но рекомендую.

меню

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

К тому же, обычно нет нужды создавать по несколько таких блоков и часто их редактировать, как это можно делать используя плагины. К примеру, на этом блоге я использую такой подход и совсем небольшой код в functions.php избавляет меня от необходимости использовать очередной плагин.

Это скорее обучающая статья и для многих плагины реализующие эту задачу будут лучшим решением.

Произвольные поля для рубрик WordPress

Custom Fields — очень полезная функция WordPress. Мало того, произвольные поля для рубрик wordpress очень часто используются администраторами блогов. Благодаря их использованию, на страницах сайта может выводиться в шаблоне нужный контент. Если Вы обратите внимание, изначально модератор имеет возможность заполнять поля: МЕТА, заголовок и текст. Благодаря дополнительным полям, пользователям станут доступны новые блоки. Не так давно, на одном из своих новых проектов мне удалось организовать: контакты, иконки страниц, карту Google и прочее. Давайте поближе рассмотрим wordpress рубрики произвольные поля с помощью плагинов — ACF и CFS.

При наличии свободного времени, произвольные поля можно добавлять вручную. Несмотря на увеличение нагрузки на сайт, расширения намного привлекательнее. Согласитесь, добавили модуль, активировали — получили ожидаемый результат. В любой момент можно отключить ненужные поля. Если Вы решили организовать произвольные поля, предлагаю в тонкостях рассмотреть Custom Field Suite.

Использование произвольных полей в CFS

Предлагаю рассмотреть готовый пример использования Custom Field в WP. Для работы мы будем использовать расширение Custom Field Suite. Порядок действий:

1) Для начала скачиваем с офф. сайта или через сайт WordPress репозитарий CFS. Активируем расширение в панели администрирования.

2) Переходим в категорию «Группа полей» через админ-панель. В разделе перечислены все активные элементы и имеется пункт «Добавить новый». Добавляйте свои собственные элементы.

4)Каждое поле нуждается в настройке: название, значение, тип и прочее. Аналогичные настройки присутствуют в любом другом плагине, да и поля в большинстве случаев повторяются.

5) Если Вам мало, то тут есть настройки Extras и PR. Наиболее интересный блок с настройками Placement Rules, если Вы хотите добавить условия.

6) Когда Вы закончите настраивать новые произвольные поля через панель администратора, сохраняем настройки и выходим. Заполняем на нужной странице данные и проверяем через сайт отображение полей. Если Вы видите, что отображение полей происходит некорректно — возвращаемся в настройки Custom Field Suite.

Расширение Advanced Custom Fields

Расширение Advanced Custom Fields

В свой распоряжение пользователь ACF получает полноценный сайт разработчика. Там собраны подсказки, обзоры расширения и help. Если Вам недостаточно бесплатного функционала, можно оформить коммерческую подписку. Обратите внимание на количество загрузок. Плагин скачали более 1 млн. чел.

Если Вы планируете организовать произвольные поля, то присмотритесь к ACF. У расширения доступная и понятная пользовательская панель. Если Вам этого мало, то обратите внимание на 6 доступных групп полей.

Advanced Custom Fields обладает простым интерфейсом и легок в освоении. Если Вам недостаточно стандартного функционала, дополнительные модули доступны на сайте разработчика.

По большому счету, можно сказать, что данное расширение — идеально. Но тут же возникает один нюанс. Добавить дополнительные поля в виде галереи и элементов с повторением, можно исключительно через версию professional. По этой причине, я использовал расширения CFS + OC 2. Если же сайт коммерческой направленности, то 25 долларов США — это небольшая сумма денег. За пожизненный вариант в 100 долларов США не жалко денег.

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

13 февраля 2015 / WordPress

Многие мои читатели задаются вопросом как создать «кастомные» или «дополнительные» поля WordPress. Для того, чтобы в дальнейшем не возникало подобных вопросов, предлагаю раз и на всегда помочь вам разобраться с вопросом произвольных полей в WordPress.

В WordPress по умолчанию имеется возможность для каждого поста (любого типа, будь то запись post, страница page или какой-нибудь произвольный тип постов) задавать неограниченное количество параметров. На этот случай имеется даже отдельная таблица в базе данных wp_postmeta.

Эти параметры называются произвольными полями или метаданными поста. Метаданные состоят из пар ключ=>значение, например color=>красный, size=>большой.

Также один пост может иметь несколько произвольных полей с одним и тем же ключом: color=>красный, color=>синий, color=>зелёный.

Задавать значения произвольных полей в WordPress можно тремя способами:

  1. Стандартный способ через админку.
  2. При помощи функций.
  3. При помощи метабоксов (перейдите по ссылке, чтобы почитать про этот способ подробнее, в данной статье я его рассматривать не буду).

Произвольные поля в админке

Итак, пошагово:

  1. Переходим на страницу редактирования или создания нового поста.
  2. Прокручиваем вниз до блока «Произвольные поля».

    В версии WordPress 3.1 и выше этот блок может быть скрыт. Включите его в настройках экрана (о том как — читайте далее).

  3. Укажите имя (вы можете выбрать из списка один из уже используемых ключей либо ввести новый) и его значение и нажмите «Добавить произвольное поле».

Что делать, если в админке их нет?

В первую очередь проверьте «Настройки экрана» — галочка напротив «Произвольные поля» должна быть отмечена.

Если же в настройках экрана вы ничего подобного не нашли, то вероятнее всего тип поста, с которым вы работаете, не поддерживает использование произвольных полей — это легко поправимо при помощи 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 class=»post-meta»> <li><span class=»post-meta-key»>color:</span> красный, синий, зеленый</li> <li><span class=»post-meta-key»>size:</span> большой</li> </ul>

Параметров у функции нет.

2. get_post_meta()

Про get_post_meta() я уже подробно писал .

3. get_post_custom()

Возвращает многоуровневый массив всех произвольных полей для текущего поста или поста, ID которого указан в параметрах функции.

print_r( get_post_custom( 541 ) );

Получим что-то вроде этого:

=> Array ( => красный => синий => зеленый ) => Array ( => большой ) )

В отличие от функции the_meta(), get_post_custom() возвратит также и все скрытые произвольные поля поста.

4. get_post_custom_keys()

Функция возвращает массив ключей всех произвольных полей поста.

print_r( get_post_custom_keys( 541 ) );

Выдаст:

Array ( => color => size )

Является производной от get_post_custom(), а если быть точным, то просто пропускает её результат через php-функцию array_keys().

5. get_post_custom_values()

Возвращает один из ключей функции get_post_custom() в виде массива, вне зависимости от количества аргументов.

print_r( get_post_custom_values( ‘size’, 541 ) );

=> Array ( => большой ) )

Первый параметр функции обязателен (если вы его не укажите, будет возвращено null).

Как изменять значения произвольных полей

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

1. update_post_meta()

Либо обновляет значение указанного произвольного поля, либо добавляет новое, если его не существует.

update_post_meta( $post_id, $meta_key, $meta_value, $prev_value = » )

$post_id (целое число) ID поста, метаданные которого нужно изменить. $meta_key (строка) ключ.

  • Если пост содержит несколько значений для одного и того же ключа, то, если не указан параметр $prev_value, будет обновлено первое найденное значение.
  • Если пост вообще не содержит метаданых с указанным ключом, тогда они будут добавлены.

$meta_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. Будем выводить поля заданные плагином Advanced Custom Fields (ACF). В прошлом уроке мы научились создавать мета поля установив плагин Advanced Custom Fields. Это важно, потому что для вывода будем использовать функции которые заданы этим плагином. То есть если вы создали поля без установки этого плагина, то вам следует использовать другие функции. С пояснениями закончили, приступим.

Этот урок является частью цикла уроков, посвященных произвольным типам записей в WordPress. Обязательно посмотрите все уроки из данного цикла. Ссылки на них представлены ниже. Порядок имеет значение. Лучше начинать с первого урока этого цикла, чтобы все было понятно.

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

  1. Добавление произвольных типов записей в WordPress
  2. Вывод произвольных типов записей в WordPress
  3. Добавление произвольных полей к записям в WordPress
  4. Вывод произвольных полей в записях WordPress

В плагине ACF есть замечательная документация. Рекомендую обращаться к ней при выводе мета полей в шаблоне WordPress. Знакомство начнем с двух функций.

Часть первая. Теория

Если чувствуете себя уверенно, можно сразу перейти ко второй части.

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

Функция — get_field()

Возвращает значение заданного поля.

Это очень универсальная функция. Ее можно использовать чтобы получить значение, вывести значение (через echo), и взаимодействовать со значением. Обратите внимание, что тип возвращаемой переменной будет соответствовать типу поля (для текстового поля — это будет строка, для изображения — массив, в некоторых случаях — это может быть многомерный массив). Источник

Параметры

<?php $field = get_field($field_name, $post_id, $format_value); ?>

  • $field_name: имя поля из которого будут получены данные, пример: “page_content” Обязательный параметр.
  • $post_id: ID записи в которой было задано данное значение. По умолчанию равно текущему посту в которой применяется данная функция. Необязательный параметр. Также это может быть ID опции, таксономии, пользователя, и т.п.
  • $format_value: форматировать или нет значение полученное из БД. По умолчанию — true. Необязательный параметр.

Использование

<?php /* * get a field value from the current post */ $value = get_field( «text_field» ); /* * get a field value from another post */ $value = get_field( «text_field», 123 ); /* * use get_field with conditional statements */ $value = get_field( «text_field» ); if( $value ) { } else { }

Функция — the_field()

Отображает значение заданного поля. Эта функция аналогична выражению “echo get_field($field_name)”. Источник

<?php the_field($field_name, $post_id); ?>

  • $field_name:имя поля из которого будут получены данные, пример: “page_content” Обязательный параметр.
  • $post_id: ID записи в которой было задано данное значение. По умолчанию равно текущему посту в которой применяется данная функция. Необязательный параметр. Также это может быть ID опции, таксономии, пользователя, и т.п.

<?php /* * display a field value from the current post */ the_field( «text_field» ); /* * display a field value from another post */ the_field( «text_field», 123 ); /* * use the_field / get_field with conditional statements */ if( get_field( «text_field» ) ): ?> <p><?php the_field( «text_field» ); ?></p> <?php endif;>

В принципе этих функций вполне достаточно, чтобы понять описанные выше готовые конструкции по отображения разных мета полей в шаблонах WordPress. Все примеры этих конструкций можно найти в документации к ACF, вот пример из документации как выводить в шаблоне поле с изображением.

Часть вторая. Практическая

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

Текстовое поле, текстовый блок

<?php the_field(‘text’); ?> <?php the_field(‘textarea’); ?>

Изображение

Базовый способ. Отображение картинки.

<?php $image = get_field(‘image’); if( !empty($image) ): ?> <img src=»<?php echo $image; ?>» alt=»<?php echo $image; ?>» /> <?php endif; ?>

Продвинутый способ. Разбор массива по переменным.

<?php $image = get_field(‘image’); if( !empty($image) ): // vars $url = $image; $title = $image; $alt = $image; $caption = $image; // thumbnail $size = ‘thumbnail’; $thumb = $image; $width = $image; $height = $image; if( $caption ): ?> <div class=»wp-caption»> <?php endif; ?> <a href=»<?php echo $url; ?>» title=»<?php echo $title; ?>»> <img src=»<?php echo $thumb; ?>» alt=»<?php echo $alt; ?>» width=»<?php echo $width; ?>» height=»<?php echo $height; ?>» /> </a> <?php if( $caption ): ?> <p class=»wp-caption-text»><?php echo $caption; ?></p> </div> <?php endif; ?> <?php endif; ?>

Упрощенный способ, когда нужно получить только конкретный размер изображения, и конкретный дополнительные параметры:

<?php $image = get_field(‘image’); $size = ‘full’; // (thumbnail, medium, large, full or custom size) if( $image ) { echo wp_get_attachment_image( $image, $size ); } ?>

Файл

Простой способ. Вывод ссылки на файл.

<?php $myfile = get_field(‘file’); ?> <a href=»<?php echo $myfile; ?>» >Download File</a>

Расширенный способ. Вывод ссылки, заголовка, подписи и описания файла.

<?php $myfile = get_field(‘file’); if( !empty($myfile) ): ?> <p> <a href=»<?php echo $myfile; ?>» > Download File «<?php echo $myfile; ?>» </a><br> <?php echo $myfile; ?><br> <?php echo $myfile; ?> </p> <?php endif; ?>

Дебаг для поля с файлом

<?php //Return value = Object, requires ACF 3.3.7+ $file = get_field(‘field_name’); // view array of data var_dump($file); ?>

Календарь

Для вывода даты заданной через date picker, используем:

<?php /* * Create PHP DateTime object from Date Piker Value * this example expects the value to be saved in the format: yymmdd (JS) = Ymd (PHP) */ $date = DateTime::createFromFormat(‘Ymd’, get_field(‘date_picker’)); echo $date->format(‘d-m-Y’); ?>

Сортировка постов по дате заданной через поле выбора даты.

<?php /* * Order Posts based on Date Picker value * this example expects the value to be saved in the format: yymmdd (JS) = Ymd (PHP) */ $posts = get_posts(array( ‘meta_key’ => ‘custom_order’, // name of custom field ‘orderby’ => ‘meta_value_num’, ‘order’ => ‘ASC’ )); if( $posts ) { foreach( $posts as $post ) { setup_postdata( $post ); // … } wp_reset_postdata(); // IMPORTANT — reset the $post object so the rest of the page works correctly } /* * Format examples */ $js = «yymmdd» $php = «Ymd» $js = «dd/mm/yy» $php = «d/m/Y» $js = «yy_mm_dd» $php = «Y_m_d» ?>

Карта Google

Для отображения карты Google с маркером предлагаю использовать следующий код. Есть два варианта.

Первый способ, с официального сайта по документации по ACF

Первая часть. Отвечает только за генерацию карты Google.

<style type=»text/css»> .acf-map { width: 100%; height: 400px; border: #ccc solid 1px; margin: 20px 0; } </style> <script src=»https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false»></script> <script type=»text/javascript»> (function($) { /* * render_map * * This function will render a Google Map onto the selected jQuery element * * @type function * @date 8/11/2013 * @since 4.3.0 * * @param $el (jQuery element) * @return n/a */ function render_map( $el ) { // var var $markers = $el.find(‘.marker’); // vars var args = { zoom : 16, center : new google.maps.LatLng(0, 0), mapTypeId : google.maps.MapTypeId.ROADMAP }; // create map var map = new google.maps.Map( $el, args); // add a markers reference map.markers = ; // add markers $markers.each(function(){ add_marker( $(this), map ); }); // center map center_map( map ); } /* * add_marker * * This function will add a marker to the selected Google Map * * @type function * @date 8/11/2013 * @since 4.3.0 * * @param $marker (jQuery element) * @param map (Google Map object) * @return n/a */ function add_marker( $marker, map ) { // var var latlng = new google.maps.LatLng( $marker.attr(‘data-lat’), $marker.attr(‘data-lng’) ); // create marker var marker = new google.maps.Marker({ position : latlng, map : map }); // add to array map.markers.push( marker ); // if marker contains HTML, add it to an infoWindow if( $marker.html() ) { // create info window var infowindow = new google.maps.InfoWindow({ content : $marker.html() }); // show info window when marker is clicked google.maps.event.addListener(marker, ‘click’, function() { infowindow.open( map, marker ); }); } } /* * center_map * * This function will center the map, showing all markers attached to this map * * @type function * @date 8/11/2013 * @since 4.3.0 * * @param map (Google Map object) * @return n/a */ function center_map( map ) { // vars var bounds = new google.maps.LatLngBounds(); // loop through all markers and create bounds $.each( map.markers, function( i, marker ){ var latlng = new google.maps.LatLng( marker.position.lat(), marker.position.lng() ); bounds.extend( latlng ); }); // only 1 marker? if( map.markers.length == 1 ) { // set center of map map.setCenter( bounds.getCenter() ); map.setZoom( 16 ); } else { // fit to bounds map.fitBounds( bounds ); } } /* * document ready * * This function will render each map when the document is ready (page has loaded) * * @type function * @date 8/11/2013 * @since 5.0.0 * * @param n/a * @return n/a */ $(document).ready(function(){ $(‘.acf-map’).each(function(){ render_map( $(this) ); }); }); })(jQuery); </script>

Вторая часть. Выводит на карте единичный маркер.

<?php $location = get_field(‘location’); if( !empty($location) ): ?> <div class=»acf-map»> <div class=»marker» data-lat=»<?php echo $location; ?>» data-lng=»<?php echo $location; ?>»></div> </div> <?php endif; ?>

Другой вариант второй части, для вывода нескольких маркеров на карте.

<?php if( have_rows(‘locations’) ): ?> <div class=»acf-map»> <?php while ( have_rows(‘locations’) ) : the_row(); $location = get_sub_field(‘location’); ?> <div class=»marker» data-lat=»<?php echo $location; ?>» data-lng=»<?php echo $location; ?>»> <h4><?php the_sub_field(‘title’); ?></h4> <p class=»address»><?php echo $location; ?></p> <p><?php the_sub_field(‘description’); ?></p> </div> <?php endwhile; ?> </div> <?php endif; ?>

Источник

Второй способ, вариант с форума поддержки WordPress.

<div id=»view1″> <?php $location = get_field(‘carte_google’); if( ! empty($location) ): ?> <div id=»map» style=»width: 100%; height: 350px;»></div> <script src=’http://maps.googleapis.com/maps/api/js?sensor=false’ type=’text/javascript’></script> <script type=»text/javascript»> //<!; ?>; var lng = <?php echo $location; ?>; // coordinates to latLng var latlng = new google.maps.LatLng(lat, lng); // map Options var myOptions = { zoom: 9, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP }; //draw a map var map = new google.maps.Map(document.getElementById(«map»), myOptions); var marker = new google.maps.Marker({ position: map.getCenter(), map: map }); } // call the function load(); //]]> </script> <?php endif; ?> </div>

Источник

В этом уроке были рассмотрены основные принципы и способы вывода в шаблоне базовых мета полей в WordPress заданных через плагин Advanced Custom Field. Как вывести не описанные здесь поля — можно найти в документации плагина.

Этот урок является частью цикла уроков, посвященных произвольным типам записей в WordPress. Обязательно посмотрите все уроки из данного цикла.

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *