
Вводная часть
Прежде чем начать рассказывать о том как создать произвольный блок данных в админ-панели на странице редактирования постов, который будет управлять указанными произвольными полями, следует отметить, что WordPress — платформа которая, пожалуй, как никакая другая поддается расширению с наименьшими усилиями. В частности, именно поэтому под WordPress написано так много плагинов — все очень просто, нужно лишь знать азы PHP и понимать принцип работы системы.
Каждый, кто достаточно близко знаком с WordPress неоднократно встречался с понятием "произвольные поля" и с их помощью решал некоторые нетривиальные задачи. Произвольные поля в WordPress — очень удобный инструмент, когда нужно "прикрепить" к конкретному посту какие-либо нестандартные данные. Такими данными может стать что угодно, начиная от логического 1/0, заканчивая объемными текстами, массивами данных и прочим. К примеру, мы можем создать новое произвольное поле Title и в его значение написать текст (альтернативный заголовок поста), затем в коде шаблона использовать следующий код, чтобы вывести этот текст:
<title><?php echo get_post_meta($post->ID, 'Title', true); ?></title>
Следует отметить, что функцию get_post_meta() можно использовать за пределами Цикла WordPress, т.е. где угодно в шаблоне. В данном примере мы используем её в <head> части документа, чтобы дать html странице заголовок отличный от заголовка самой статьи (иногда полезно для SEO).

Блок произвольных полей в WordPress
Другой пример: используя произвольные поля мы можем выполнять или не выполнять действия, в зависимости от того, какие данные у нас находится в значении произвольного поля. Например, размещая в произвольное поле логические цифры 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 хука (admin_init, save_post) и функция add_meta_box(), и разумеется немного знаний html и php. Добавляем следующий код в файл темы functions.php:
1. Создадим новый мета блок для постов (записей типа post) с названием "Дополнительные поля":
<?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' );
}
2. Заполним этот блок полями html формы, делается это через, указанную в add_meta_box() функцию extra_fields_box_func(). Именно она отвечает за содержание мета блока:
// код блока
function extra_fields_box_func( $post ){
?>
<p><label><input type="text" name="extra[title]" value="<?php echo get_post_meta($post->ID, 'title', 1); ?>" style="width:50%" /> ← заголовок страницы (title)</label></p>
<p>Описание статьи (description):
<textarea type="text" name="extra[description]" 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[robotmeta]" value="" <?php checked( $mark_v, '' ); ?> /> index,follow</label>
<label><input type="radio" name="extra[robotmeta]" value="nofollow" <?php checked( $mark_v, 'nofollow' ); ?> /> nofollow</label>
<label><input type="radio" name="extra[robotmeta]" value="noindex" <?php checked( $mark_v, 'noindex' ); ?> /> noindex</label>
<label><input type="radio" name="extra[robotmeta]" value="noindex,nofollow" <?php checked( $mark_v, 'noindex,nofollow' ); ?> /> noindex,nofollow</label>
</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>
<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 ( !wp_verify_nonce($_POST['extra_fields_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; // выходим если данных нет
// Все ОК! Теперь, нужно сохранить/удалить данные
$_POST['extra'] = array_map('trim', $_POST['extra']); // чистим все данные от пробелов по краям
foreach( $_POST['extra'] as $key=>$value ){
if( empty($value) )
continue delete_post_meta($post_id, $key); // удаляем поле если значение пустое
update_post_meta($post_id, $key, $value); // add_post_meta() работает автоматически
}
return $post_id;
}
?>
Вот и все, блок произвольных полей готов!
Теперь, изменяя html код, мы можем редактировать содержимое мета блока. Но не забываем, что названия полей имеют вид массива со значением ключа произвольно поля: name="extra[meta_key]".
Весь код, целиком
// подключаем функцию активации мета блока (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[title]" value="<?php echo get_post_meta($post->ID, 'title', 1); ?>" style="width:50%" /> ← заголовок страницы (title)</label></p>
<p>Описание статьи (description):
<textarea type="text" name="extra[description]" 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[robotmeta]" value="" <?php checked( $mark_v, '' ); ?> /> index,follow</label>
<label><input type="radio" name="extra[robotmeta]" value="nofollow" <?php checked( $mark_v, 'nofollow' ); ?> /> nofollow</label>
<label><input type="radio" name="extra[robotmeta]" value="noindex" <?php checked( $mark_v, 'noindex' ); ?> /> noindex</label>
<label><input type="radio" name="extra[robotmeta]" value="noindex,nofollow" <?php checked( $mark_v, 'noindex,nofollow' ); ?> /> noindex,nofollow</label>
</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>
<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 ( !wp_verify_nonce($_POST['extra_fields_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;
// Все ОК! Теперь, нужно сохранить/удалить данные
$_POST['extra'] = array_map('trim', $_POST['extra']);
foreach( $_POST['extra'] as $key=>$value ){
if( empty($value) )
continue delete_post_meta($post_id, $key); // удаляем поле если значение пустое
update_post_meta($post_id, $key, $value); // add_post_meta() работает автоматически
}
return $post_id;
}
Блок произвольных полей для произвольного типа записей
Если нужно создать блок для другого типа записей, допустим page (для страниц), то регистрируем еще один мета блок и описываем его html код в новой функции, которую так же нужно указать при регистрации блока (extra_fields_box_page_func). Функцию обработки полей при сохранении поста создавать уже не надо, главное указать названия полей в виде массивов extra[]:
function my_extra_fields() {
add_meta_box( 'extra_fields', 'Дополнительные поля', 'extra_fields_box_func', 'post', 'normal', 'high' );
add_meta_box( 'extra_fields', 'Дополнительные поля', 'extra_fields_box_page_func', 'page', 'normal', 'high' );
}
// html код блока для типа записей page
function extra_fields_box_page_func(){
?>
---------- Здесь поля html формы -----------
<?php
}
Подводные камни
Простота в настройке блока произвольных полей при создании его таким способом определенно теряется и я ни в коем случае не хочу сказать, что создавать блоки таким способом гораздо лучше использования плагинов. Однако, такой подход более гибок, потому что мы может создать абсолютно любые поля и расположить их как нам вздумается. К тому же, обычно нет нужды создавать по несколько таких блоков и часто их редактировать, как это можно делать используя плагины. К примеру, на этом блоге я использую такой подход и совсем небольшой код в functions.php избавляет меня от необходимости использовать очередной плагин.
Так или иначе, это скорее обучающая статья, чем реальный пример для использования. Для многих плагины реализующие эту задачу будут лучшим решением.
Нельзя использовать поля типа checkbox
Так же, недостатком такого метода является то, что массив extra[], обязательно должен быть определен, пусть даже он передает пустое значение иначе поле не будет обработано при сохранении данных. В связи с этим, невозможно использовать поля ввода данных типа checkbox (<input type="checkbox"), потому что checkbox передает данные если галочка выставлена и не передает если нет (другие типы полей передают пустое значение).
Чтобы обойти этот "недуг" я приделал пару костылей к функции (<input type="hidden" name="need_check"). Весь код, с костылями:
<var>// подключаем функцию активации мета блока (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[title]" value="<?php echo get_post_meta($post->ID, 'title', 1); ?>" style="width:50%" /> ← заголовок страницы (title)</label></p>
<p>Описание статьи (description):
<textarea type="text" name="extra[description]" 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[robotmeta]" value="" <?php checked( $mark_v, '' ); ?> /> index,follow</label>
<label><input type="radio" name="extra[robotmeta]" value="nofollow" <?php checked( $mark_v, 'nofollow' ); ?> /> nofollow</label>
<label><input type="radio" name="extra[robotmeta]" value="noindex" <?php checked( $mark_v, 'noindex' ); ?> /> noindex</label>
<label><input type="radio" name="extra[robotmeta]" value="noindex,nofollow" <?php checked( $mark_v, 'noindex,nofollow' ); ?> /> noindex,nofollow</label>
</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>
<label><input type="checkbox" name="extra[white]" value="1" <?php checked( get_post_meta($post->ID, 'white', 1), 1 )?> /> белый</label>
<label><input type="checkbox" name="extra[red]" value="1" <?php checked( get_post_meta($post->ID, 'red', 1), 1 )?> /> красный</label>
<label><input type="checkbox" name="extra[black]" value="1" <?php checked( get_post_meta($post->ID, 'black', 1), 1 )?> /> черный</label>
</p>
<input type="hidden" name="need_check" value="white,red,black" />
<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 ( !wp_verify_nonce($_POST['extra_fields_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;
//extra[white] указываем поля (checkbox), могут не определиться и не удаляться
$need_check = array_map( 'trim', explode(',', $_POST['need_check']) );
foreach( $need_check as $val )
$_POST['extra'][$val] = $_POST['extra'][$val];
// Все ОК! Теперь, нужно сохранить/удалить данные
$_POST['extra'] = array_map('trim', $_POST['extra']);
foreach( $_POST['extra'] as $key=>$value ){
if( empty($value) )
continue delete_post_meta($post_id, $key); // удаляем поле если значение пустое
update_post_meta($post_id, $key, $value); // add_post_meta() работает автоматически
}
return $post_id;
}
Здесь, в html коде блока нужно указать еще спрятанное поле need_check и в его значении, через запятую перечислить названия полей checkbox'ов (value="white,red,black").
Плагины для создания блоков произвольных полей:
В статье я говорил о плагинах, которые создают мета блоки заменяющие произвольные поля, но ни разу не упомянул ни один. Исправляюсь:
- Custom Field Template — настоящий комбайн. С ним можно создать любую форму, для любых типов постов, указать формы для отдельных постов и рубрик. Думаю в большинстве случаев, можно обойтись без такого комбайна.
- Magic-fields — отличный плагин, но очень объемный (весит как пол WordPress), благодаря которому можно создавать целые произвольные страницы создания новой записи. При создании такой страницы в плагине, можно выбирать какие блоки будут на ней использоваться. Так, например, можно создать страницу где будет вводится только заголовок и нужные произвольные поля. В какую категорию попадает запись после публикации с такой страницы задается заранее. Этот плагин заслуживает отдельного описания.
Подскажите еще названия хороших плагинов, плз! Заглянул в раздел плагинов, ничего вразумительного не нашел 
- Предыдущие по меткам
- Предыдущие записи
- Sypex Dumper 2 for WordPress ← 16.Дек.2010 // 6
- Удаление виджетов из Консоли WordPress ← 4.Ноя.2010 // 20
- Плагин для легкого управления сайтом на WordPress (версия 3) ← 30.Июл.2010 // 76
- Плагин для легкого управления сайтом на WordPress ← 23.Апр.2010 // 37
- Динамический архив блога с использованием jQuery (Ajax) ← 12 Май 2011 // 34
- Самые Хлебные крошки (breabcrumbs для WordPress) ← 19 Апрель 2011 // 99
- Плагин для подсчета количества загрузок файла – Kama’s Click Counter ← 28 Март 2011 // 48
Подскажите как можно вывести все посты относящиеся к определенному значению одного из произвольных полей.
<?php query_posts('showposts=300&meta_key=zna4enie-proizwolnogo-polya&order=ASC'); ?> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <?php $infopole = get_post_meta($post->ID, 'zna4enie-proizwolnogo-polya', true); if($infopole !== '') { ?> <?php echo $infopole ?> <?php } ?> <?php endwhile; endif; ?> <?php rewind_posts(); ?>Этот код выводит 300 записей содержащих произвольное поле (zna4enie-proizwolnogo-polya)
Привет. Не подскажите где мне изменить чтобы заработало. Весь код без изменений кроме этой части:
в селектах у меня 3 предустановленных значения произвольного поля. а в textarea - тоже самое произвольное поле но для заполнения вручную. И вот с textarea у меня и проблемы - не записывается оно туда потому что в коде стоит проверка на пустой селект и удаляется произвольное поле:
Как мне обойти эту проблему. Удалить проверку я не могу - потому что иногда при публикации записи я не выбираю ни селект ни textarea не заполняю...
Надо как-то определить один раз что это за значение. Так чет ничего мне в голову не приходит. Переменная не может иметь 2 значения одновременно, поэтому форма отправит только 1 значение
Я думаю нужно создать скрытое поле zzz_news_select и Javascriptom вставлять в него значение textarea (если оно не пустое) по событию onСhange/onKeyup и тоже самое сделать для select. А сами эти поля будут просто пустышками (т.е. без name аттрибута), будут как бы вводом значения для созданного скрытого поля.
Спасибо. Думаю проще тогда будет назначить textarea второму произвольному полю, а выводить уже в цикле произв.поле 1 и произв.поле 2
Назначил 2 произв.поля и вывожу так:
<?php query_posts('showposts=70&meta_key=zzz_news_select&orderby=modified&order=desc'); ?> <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> // потом вывожу 2 произвольных поля: <?php $infopole = get_post_meta($post->ID, 'zzz_news_select', true); if($infopole !== '') { ?> <?php echo $infopole ?>: <?php } ?> <?php $infopole = get_post_meta($post->ID, 'zzz_news_select2', true); if($infopole !== '') { ?> <?php echo $infopole ?>: <?php } ?>Вот тут загвоздка- вывожу после query_posts произв.поля: "zzz_news_select" и "zzz_news_select2"
всё хорошо до тех пор, пока у меня не встречается одно лишь zzz_news_select2 - тогда не выводится запись (ну это и понятно в query_posts я выбираю по одному значению zzz_news_select)
как сделать запрос в массиве не понял. смотрел на кодексе - но там это запутанно
там написано:
как применить в свой случай не знаю
У меня выдает почему-то при сохранении такую ошибку:
Warning: Cannot modify header information - headers already sent by (output started at /wp-content/themes/.../functions.php:5) in /wp-includes/pluggable.php on line 868
с чем это может быть связано, как исправить это?
Подскажите пожалуйста,
есть код для вордпресса, там в input нужно внести данные, нажать сохранить и они внесутся в бд. Мне нужно сделать еще на подобии checkbox, что бы пользователь мог выбрать из списка, а не писать вручную.
Что и куда нужно добавить, помогите пожалуйста. Вот код
<?php $new_meta_boxes = array( "gmap" => array( "name" => "gmap", "std" => "false", "title" => __('Google Map','decondo'), "description" => __('Check the box if you want to hide the Google map for this property.','decondo'), "type" => 'checkbox'), "address" => array( "name" => "address", "std" => "", "title" => __('Адрес','decondo'), "description" => __('Сюда вводится адрес объекта (Без номера дома)','decondo')), "state" => array( "name" => "state", "std" => "", "title" => __('Этаж','decondo'), "description" => __('Этаж дома (например 3 в 5 эт. доме)','decondo')), "city" => array( "name" => "city", "std" => "", "title" => __('Тип жилья','decondo'), "description" => __('Новостройка (эконом-класс, бизнем-класс, элит-класс). Вторичное жилье (Сталинка, Брежневка и т.д.)','decondo')), "beds" => array( "name" => "beds", "std" => "", "title" => __('Кол-во комнат','decondo'), "description" => __('Кол-во комнат','decondo')), "baths" => array( "name" => "baths", "std" => "", "title" => __('Площадь','decondo'), "description" => __('Площадь','decondo')), "feet" => array( "name" => "feet", "std" => "", "title" => __('Артикул','decondo'), "description" => __('Ремонт от застройщика, евро ремонт, бабушкино состояние','decondo')), "price" => array( "name" => "price", "std" => "", "title" => __('Цена объекта','decondo'), "description" => __('Цена объекта в рублях','decondo')), "secs1" => array( "name" => "secs1", "std" => "", "title" => __('Новое меню','decondo'), "description" => __('Проверка нового меню','decondo')) ); if(!get_option('dco_gmaps_key') || get_option('dco_gmaps_dsp')) unset($new_meta_boxes['gmap']); function new_meta_boxes() { global $post, $new_meta_boxes; foreach($new_meta_boxes as $meta_box) { $meta_box_value = get_post_meta($post->ID, $meta_box['name'].'_value', true); if($meta_box_value == "") $meta_box_value = $meta_box['std']; if($meta_box['name'] == 'img' || $meta_box['name'] == 'gmap') { $meta_full = ' meta-full'; } else { $meta_full = ''; } echo'<div class="meta-field'. $meta_full.'">'; echo'<input type="hidden" name="'.$meta_box['name'].'_noncename" id="'.$meta_box['name'].'_noncename" value="'.wp_create_nonce( plugin_basename(__FILE__) ).'" />'; echo'<p><strong>'.$meta_box['title'].'</strong></p>'; if($meta_box['type'] != 'checkbox') { echo'<input type="text" name="'.$meta_box['name'].'_value" id="'.$meta_box['name'].'_value" value="'.$meta_box_value.'" /><br />'; echo'<p><label for="'.$meta_box['name'].'_value">'.$meta_box['description'].'</label></p>'; } else { if($meta_box_value == 'true') { $checked = "checked=\"checked\""; } elseif($meta_box['std'] == "true") { $checked = "checked=\"checked\""; } else { $checked = ""; } echo'<p><input type="checkbox" name="'.$meta_box['name'].'_value" id="'.$meta_box['name'].'_value" value="true" '.$checked.' /> '; echo'<label for="'.$meta_box['name'].'_value">'.$meta_box['description'].'</label></p>'; } echo'</div>'; } // end foreach echo'<br style="clear:both" />'; } // end new_meta_boxes function create_meta_box() { global $theme_name; if ( function_exists('add_meta_box') ) { add_meta_box( 'new-meta-boxes', __('Параметры объекта','decondo'), 'new_meta_boxes', 'post', 'normal', 'high' ); } } function save_postdata( $post_id ) { global $post, $new_meta_boxes; foreach($new_meta_boxes as $meta_box) { // Verify if ( !wp_verify_nonce( $_POST[$meta_box['name'].'_noncename'], plugin_basename(__FILE__) )) { return $post_id; } if ( 'page' == $_POST['post_type'] ) { if ( !current_user_can( 'edit_page', $post_id )) return $post_id; } else { if ( !current_user_can( 'edit_post', $post_id )) return $post_id; } $data = $_POST[$meta_box['name'].'_value']; if(get_post_meta($post_id, $meta_box['name'].'_value') == "") add_post_meta($post_id, $meta_box['name'].'_value', $data, true); elseif($data != get_post_meta($post_id, $meta_box['name'].'_value', true)) update_post_meta($post_id, $meta_box['name'].'_value', $data); elseif($data == "" || $data == $meta_box['std'] ) delete_post_meta($post_id, $meta_box['name'].'_value', get_post_meta($post_id, $meta_box['name'].'_value', true)); } // end foreach } // end save_postdata add_action('admin_menu', 'create_meta_box'); add_action('save_post', 'save_postdata'); /* ################################## CUSTOM META BOX (PAGES) ################################## */ $new_meta_boxes_2 = array( "img" => array( "name" => "img", "std" => "", "title" => __('Main Photo','decondo'), "description" => __('Please enter URL of an image (600x260px) for this page.','decondo')) ); function new_meta_boxes_2() { global $post, $new_meta_boxes_2; foreach($new_meta_boxes_2 as $meta_box) { $meta_box_value = get_post_meta($post->ID, $meta_box['name'].'_value', true); if($meta_box_value == "") $meta_box_value = $meta_box['std']; if($meta_box['name'] == 'img' || $meta_box['name'] == 'gmap') { $meta_full = ' meta-full'; } else { $meta_full = ''; } echo'<div class="meta-field'. $meta_full.'">'; echo'<input type="hidden" name="'.$meta_box['name'].'_noncename" id="'.$meta_box['name'].'_noncename" value="'.wp_create_nonce( plugin_basename(__FILE__) ).'" />'; echo'<p><strong>'.$meta_box['title'].'</strong></p>'; if($meta_box['type'] != 'checkbox') { echo'<input type="text" name="'.$meta_box['name'].'_value" id="'.$meta_box['name'].'_value" value="'.$meta_box_value.'" /><br />'; echo'<p><label for="'.$meta_box['name'].'_value">'.$meta_box['description'].'</label></p>'; } else { if($meta_box_value == 'true') { $checked = "checked=\"checked\""; } elseif($meta_box['std'] == "true") { $checked = "checked=\"checked\""; } else { $checked = ""; } echo'<p><input type="checkbox" name="'.$meta_box['name'].'_value" id="'.$meta_box['name'].'_value" value="true" '.$checked.' /> '; echo'<label for="'.$meta_box['name'].'_value">'.$meta_box['description'].'</label></p>'; } echo'</div>'; } // end foreach echo'<br style="clear:both" />'; } // end new_meta_boxes_2 function create_meta_box_2() { global $theme_name; if ( function_exists('add_meta_box') ) { add_meta_box( 'new-meta-boxes', __('Page Image','decondo'), 'new_meta_boxes_2', 'page', 'normal', 'high' ); } } function save_postdata_2( $post_id ) { global $post, $new_meta_boxes_2; foreach($new_meta_boxes_2 as $meta_box) { // Verify if ( !wp_verify_nonce( $_POST[$meta_box['name'].'_noncename'], plugin_basename(__FILE__) )) { return $post_id; } if ( 'page' == $_POST['post_type'] ) { if ( !current_user_can( 'edit_page', $post_id )) return $post_id; } else { if ( !current_user_can( 'edit_post', $post_id )) return $post_id; } $data = $_POST[$meta_box['name'].'_value']; if(get_post_meta($post_id, $meta_box['name'].'_value') == "") add_post_meta($post_id, $meta_box['name'].'_value', $data, true); elseif($data != get_post_meta($post_id, $meta_box['name'].'_value', true)) update_post_meta($post_id, $meta_box['name'].'_value', $data); elseif($data == "" || $data == $meta_box['std'] ) delete_post_meta($post_id, $meta_box['name'].'_value', get_post_meta($post_id, $meta_box['name'].'_value', true)); } // end foreach } // end save_postdata add_action('admin_menu', 'create_meta_box_2'); add_action('save_post', 'save_postdata_2'); ?>спасибо, очень полезная статья
Здраствуйте. У меня специфический шаблон, в редакторе записи которого нет блока спроизвольными полями. Как самому добавить их? Т.е. обычный блок произвольных полей который присутствует по умолчанию.
Добрый день,
скажите есть кто за деньги поможет прикрутить такие поля и поиск по ним.
это разбираться надо пару дней и проще заплатить....
спасибо
А как добавить такие произвольные поля для страниц? Более точнее textarea. Подскажите пожалуйста.