В статье я расскажу, как создать дополнительные поля на WordPress для статей или страниц. Лично я использую дополнительные поля для статей или станиц в выводе цены, скидок, различных надписей «продано» и т. д.
Ближе к делу.
Немного расскажу о самом коде, что я знаю и что я понял. А потом дам весь код целиком.
Код вставляется в файл «functions.php»
Создание блока в произвольных полях:
- для постов
Вставьте вот такой код:
// подключаем функцию активации блока (my_extra_plgin_post) add_action('add_meta_boxes', 'my_extra_plgin_post'); function my_extra_plgin_post() { add_meta_box( 'extra_plgin_post', // название должно быть уникальным 'Дополнительное поле', // Выводится в админке название дополнительного поля 'extra_plgin_post_func', // Функция, которая вызывается. (HTML поля) 'post', // Тип записи (post - для записи, page - для страниц) 'normal' // Расположение блока ('normal' - вверху, 'advanced' - внизу или 'side' - сбоку) ); }
- для страниц
Вставьте вот такой код:
// подключаем функцию активации блока (my_extra_plgin_page) add_action('add_meta_boxes', 'my_extra_plgin_page'); function my_extra_plgin_page() { add_meta_box( 'extra_plgin_page', // название должно быть уникальным 'Дополнительное поле', // Выводится в админке название дополнительного поля 'extra_plgin_page_func', // Функция, которая вызывается. (HTML поля) 'page', // Тип записи (post - для записи, page - для страниц) 'normal' // Расположение блока ('normal' - вверху, 'advanced' - внизу или 'side' - сбоку) ); }
Можно два способа объединить вот таким образом:
// подключаем функцию активации блока (my_extra_plgin_post) add_action('add_meta_boxes', 'my_extra_plgin_post'); function my_extra_plgin_post() { add_meta_box( 'extra_plgin_post', // название должно быть уникальным 'Дополнительное поле', // Выводится в админке название дополнительного поля 'extra_plgin_post_func', // Функция, которая вызывается. (HTML поля) 'post', // Тип записи (post - для записи, page - для страниц) 'normal' // Расположение блока ('normal' - вверху, 'advanced' - внизу или 'side' - сбоку) ); add_meta_box( 'extra_plgin_page', // название должно быть уникальным 'Дополнительное поле', // Выводится в админке название дополнительного поля 'extra_plgin_page_func', // Функция, которая вызывается. (HTML поля) 'page', // Тип записи (post - для записи, page - для страниц) 'normal' // Расположение блока ('normal' - вверху, 'advanced' - внизу или 'side' - сбоку) ); }
Создание HTML формы произвольных полей
В подсказке было указано, какую функцию нужно выводить для вызова HTML полей. Смотрите строку №8, №15 верхнего кода:
'extra_plgin_post_func', // Функция, которая вызывается. (HTML поля - для записи)
'extra_plgin_page_func', // Функция, которая вызывается. (HTML поля - для страниц)
Естественно вы можете дать свои названия для вызова функции. Но для примера я буду использовать именно эти.
Выводим HTML форму:
- для постов
<!-- макет --> function extra_plgin_post_func($post){ ?> <!-- здесь пишем HTML код --> <input ENGINE="hidden" name="atb_nonce" value="<?php echo wp_create_nonce(__FILE__); ?>" /> <?php }
Вот пример:
function extra_plgin_post_func($post){ ?> <p>Цена: <? $atb_sting1 = get_post_meta($post->ID, 'atb_sting1', 1); ?> <label><input type="number" step="0.1" name="extra[atb_sting1]" value="<? if($atb_sting1){echo $atb_sting1;}?>" /></label> </p> <input type="hidden" name="atb_nonce" value="<?php echo wp_create_nonce(__FILE__); ?>" /> <?php }
Строка №7 - спрятанное поле name="atb_nonce", нужно для проверки при сохранении данных.
- для страниц:
function extra_plgin_page_func($post){ ?> <p>Цена: <? $atb_sting2 = get_post_meta($post->ID, 'atb_sting2', 1); ?> <label><input type="number" step="0.1" name="extra[atb_sting2]" value="<? if($atb_sting2){echo $atb_sting2;}?>" /></label> </p> <input type="hidden" name="atb_nonce" value="<?php echo wp_create_nonce(__FILE__); ?>" /> <?php }
Строка №7 - спрятанное поле name="atb_nonce", нужно для проверки при сохранении данных.
Также обратите внимание на строку №3.
<? $atb_sting2 = get_post_meta($post->ID, 'atb_sting2', 1); ?>
Функция get_post_meta должна стоять обязательно для получения значения произвольных полей. Естественно, сколько полей, столько должно быть и функций с правильно указанными параметрами.
Вот, например, в поле, если стоит значение
<input type="number" step="0.1" name="extra[atb_sting_post]" value="<? if($atb_sting_post){echo $ atb_sting_post;}?>" />
то, в функции должно быть вот так:
<? $atb_sting_post = get_post_meta($post->ID, 'atb_sting_post', 1); ?>
Сохраняем данные с полей
// сохранение данных add_action('save_post', 'atb_box_update'); // Вызываем функцию при сохранении function atb_box_update($post_id){ if (!wp_verify_nonce($_POST['atb_nonce'], __FILE__)) return false; // Проверка, что сохраняется нужная страница. if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return false; // выходим, если это автосохранение if (!current_user_can('edit_post', $post_id)) return false; // выходим, если юзер не имеет право редактировать запись if(!isset($_POST['extra']) ) return false; // Проверка, что нам пришли все поля (выходим если данных нет) // Все ОК! Далее сохранить/удалить данные foreach($_POST['extra'] as $key=>$value){ if(empty($value) AND $value != 0){ // Если значение пустое и не равно 0 delete_post_meta($post_id, $key); // Удаляем поле, если значение пустое continue; // Продолжаем } update_post_meta($post_id, $key, $value); // Обновляем или добавляем данные } return $post_id; }
Готовый код:
// для записей // подключаем функцию активации блока (my_extra_plgin_post) add_action('add_meta_boxes', 'my_extra_plgin_post'); function my_extra_plgin_post() { add_meta_box( 'extra_plgin_post', // название должно быть уникальным 'Дополнительное поле', // Выводится в админке название дополнительного поля 'extra_plgin_post_func', // Функция, которая вызывается. (HTML поля) 'post', // Тип записи (post - для записи, page - для страниц) 'normal' // Расположение блока ('normal' - вверху, 'advanced' - внизу или 'side' - сбоку) ); } function extra_plgin_post_func($post){ $atb_sting1 = get_post_meta($post->ID, 'atb_sting1', 1); ?> <p>Цена: <label><input type="number" step="0.1" name="extra[atb_sting1]" value="<? if($atb_sting1){echo $atb_sting1;}?>" /></label> </p> <input type="hidden" name="atb_nonce" value="<?php echo wp_create_nonce(__FILE__); ?>" /> <?php } // для страниц // подключаем функцию активации блока (my_extra_plgin_page) add_action('add_meta_boxes', 'my_extra_plgin_page'); function my_extra_plgin_page() { add_meta_box( 'extra_plgin_page', // название должно быть уникальным 'Дополнительное поле', // Выводится в админке название дополнительного поля 'extra_plgin_page_func', // Функция, которая вызывается. (HTML поля) 'page', // Тип записи (post - для записи, page - для страниц) 'normal' // Расположение блока ('normal' - вверху, 'advanced' - внизу или 'side' - сбоку) ); } function extra_plgin_page_func($post){ $atb_sting2 = get_post_meta($post->ID, 'atb_sting2', 1); ?> <p>Цена: <label><input type="number" step="0.1" name="extra[atb_sting2]" value="<? if($atb_sting2){echo $atb_sting2;}?>" /></label> </p> <input type="hidden" name="atb_nonce" value="<?php echo wp_create_nonce(__FILE__); ?>" /> <?php } // сохранение данных add_action('save_post', 'atb_box_update'); // Вызываем функцию при сохранении function atb_box_update($post_id){ if (!wp_verify_nonce($_POST['atb_nonce'], __FILE__)) return false; // Проверка, что сохраняется нужная страница. if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return false; // выходим, если это автосохранение if (!current_user_can('edit_post', $post_id)) return false; // выходим, если юзер не имеет право редактировать запись if(!isset($_POST['extra']) ) return false; // Проверка, что нам пришли все поля (выходим, если данных нет) // Все ОК! Далее сохранить/удалить данные foreach($_POST['extra'] as $key=>$value){ if(empty($value) AND $value != 0){ // Если значение пустое и не равно 0 delete_post_meta($post_id, $key); // Удаляем поле, если значение пустое continue; // Продолжаем } update_post_meta($post_id, $key, $value); // Обновляем или добавляем данные } return $post_id; }
В итоге у вас должно получиться вот так:
На сайте, чтобы вывести результат из дополнительного поля, пропишите вот такой код:
- для записей:
<? $atb_sting1 = get_post_meta($post->ID, 'atb_sting1', 1); echo $atb_sting1; ?>
Либо вот так:
<?php echo get_post_meta($post->ID, 'atb_sting1', 1); ?>
- для страниц:
<? $atb_sting2 = get_post_meta($post->ID, 'atb_sting2', 1); echo $atb_sting2; ?>
Либо вот так:
<?php echo get_post_meta($post->ID, 'atb_sting2', 1); ?>
В подарок хочу оставить вам еще один кодик:
// для записей // подключаем функцию активации блока (my_extra_plgin_post) add_action('add_meta_boxes', 'my_extra_plgin_post'); function my_extra_plgin_post() { add_meta_box( 'extra_plgin_post', // название должно быть уникальным 'Дополнительное поле', // Выводится в админке название дополнительного поля 'extra_plgin_post_func', // Функция, которая вызывается. (HTML поля) 'post', // Тип записи (post - для записи, page - для страниц) 'normal' // Расположение блока ('normal' - вверху, 'advanced' - внизу или 'side' - с боку) ); } function extra_plgin_post_func($post){ ?> <p>Заголовок товара (title)<? $title_post = get_post_meta($post->ID, 'title_post', 1); ?> <label><input type="text" name="extra[title_post]" value="<? if($title_post){echo $title_post;}?>" style="width:50%" /></label></p> <p>Описание товара: <textarea type="text" name="extra[description]" style="width:100%;height:50px;"><?php echo get_post_meta($post->ID, 'description', 1); ?></textarea> </p> <p>Скидка<? $skidka = get_post_meta($post->ID, 'skidka', 1); ?> <label><input type="number" step="0.1" name="extra[skidka]" value="<? if($skidka){echo $skidka;}?>" style="width:10%" /></label> %</p> <p>Выберите валюту:<? $atb_radio2 = get_post_meta($post->ID, 'atb_radio2', 1); ?> <label><input type="radio" checked="checked" name="extra[atb_radio2]" value="1" <?php checked($atb_radio2, '1'); ?> /> $</label> <label><input type="radio" name="extra[atb_radio2]" value="0" <?php checked($atb_radio2, '0'); ?> /> Руб.</label> <label><input type="radio" name="extra[atb_radio2]" value="2" <?php checked($atb_radio2, '2'); ?> /> Грн.</label> </p> <p>Цена: <? $atb_sting1 = get_post_meta($post->ID, 'atb_sting1', 1); ?> <label><input type="number" step="0.1" name="extra[atb_sting1]" value="<? if($atb_sting1){echo $atb_sting1;}?>" /></label> <!-- вывод валюты --> <? if($atb_radio2 == 1){echo"$";} else{if($atb_radio2 == 0){echo"РУБ";} else{if($atb_radio2 == 2){echo"ГРН.";}}}?> </p> <p>Наличие товара:<select name="extra[select]" /><?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>Сейчас товар: <? if($sel_v == 1){echo"Продано";} else{if($sel_v == 2){echo"Есть в наличие";} else{if($sel_v == 3){echo"В дороге";}}}?></p> <input type="hidden" name="atb_nonce" value="<?php echo wp_create_nonce(__FILE__); ?>" /> <?php } // сохранение данных add_action('save_post', 'atb_box_update'); // Вызываем функцию при сохранении function atb_box_update($post_id){ if (!wp_verify_nonce($_POST['atb_nonce'], __FILE__)) return false; // Проверка, что сохраняется нужная страница. if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return false; // выходим, если это автосохранение if (!current_user_can('edit_post', $post_id)) return false; // выходим, если юзер не имеет право редактировать запись if(!isset($_POST['extra']) ) return false; // Проверка, что нам пришли все поля (выходим, если данных нет) // Все ОК! Далее сохранить/удалить данные foreach($_POST['extra'] as $key=>$value){ if(empty($value) AND $value != 0){ // Если значение пустое и не равно 0 delete_post_meta($post_id, $key); // Удаляем поле, если значение пустое continue; // Продолжаем } update_post_meta($post_id, $key, $value); // Обновляем или добавляем данные } return $post_id; }
В результате в админке будет вот так:
Чтобы вывести на сайте, откройте файл «single.php» или в «index.php» и вставьте в нужное место для товара вот такие кода:
Заголовок товара (title) <? $title_post = get_post_meta($post->ID, 'title_post', 1); echo $title_post; ?> Описание товара: <?php echo get_post_meta($post->ID, 'description', 1); ?> СКИДКА: <? $skidka = get_post_meta($post->ID, 'skidka', 1); echo $skidka; ?> Цена и валюта: <? $atb_sting1 = get_post_meta($post->ID, 'atb_sting1', 1); echo $atb_sting1; ?> <? $atb_radio2 = get_post_meta($post->ID, 'atb_radio2', 1); if($atb_radio2 == 1){echo"$";} else{if($atb_radio2 == 0){echo"РУБ";} else{if($atb_radio2 == 2){echo"ГРН.";}}}?> Сейчас товар: <? $sel_v = get_post_meta($post->ID, 'select', 1); if($sel_v == 1){echo"Продано";} else{if($sel_v == 2){echo"Есть в наличие";} else{if($sel_v == 3){echo"В дороге";}}}?>
В итоге вот, что у меня получилось:
Понравился пост? Помоги другим узнать об этой статье, кликни на кнопку социальных сетей ↓↓↓
Последние новости категории:
Похожие статьи
Популярные статьи:
-
Как узнать id компьютера
Дата: 29 марта 2013
Прокомментировано:90
просмотров: 330348 -
Размеры форматов листов А0 – А7
Дата: 23 января 2013
Прокомментировано:3
просмотров: 274701 -
Смешные логические загадки с подвохом, отгадки прилагаются
Дата: 12 ноября 2014
Прокомментировано:5
просмотров: 222536 -
Готовые макеты блоков для веб-страниц на HTML и CSS
Дата: 25 июня 2014
Прокомментировано:23
просмотров: 187748 -
Установка windows 7 на ноутбук
Дата: 18 декабря 2012
Прокомментировано:169
просмотров: 186564
4 Ответов на комментарий - Как создать дополнительные поля на WordPress для статей и страниц
Добавить комментарий
Метки: wordpress
Сумбурно как-то получилось.
Надо было сначала объяснить что это за поля и зачем их нужно использовать (лично я не очень понял это из статьи), а затем уже как это реализовать.
В последнем примере не понятно нафига используются дополнительные поля, если всё это можно в самой записи сделать…
Знаю что доп. поля в WPесть, да – они по умолчанию выключены, да – ими не все пользуются, да – это довольно мощный инструмент.
Как их использовать с максимальной эффективностью осталось загадкой…
“Лично я использую дополнительные поля для статей или станиц в выводе цены, скидок, различных надписей «продано» и т. д.” – этого не достаточно было?
Как сделать дополнительное поле с отзывами для каждой страницы разными?
почитайте “Как создать шаблон страницы WordPress“