Я уже рассказывал об одном из вариантов плагина Custom Field GUI, позволяющем вставить в редактор поста блок нужных вам произвольных полей.
Однако можно создать свой блок произвольных полей и снабдить их удобными формами ввода и выбора значений без использования плагинов. Такой блок можно применять там, где нужно упростить работу авторов с произвольными полями, сократив и ограничив варианты ввода их значений. Давайте рассмотрим создание такого блока на примере пользовательского блока произвольных полей, который я использую в одном из своих блогов – блока полей, отвечающих за вывод и расположение рекламной ссылки (постового).
Как видите, для создания постового используются четыре произвольных поля, значения которых его формируют: текст до ссылки + анкор + ссылка + текст после ссылки. Значения этих произвольных полей являются текстом, который вводит пользователь, и они каждый раз бывают разными, либо вообще отсутствуют, а это значит, что для ввода нужно использовать текстовые формы. В дополнение к ним есть еще два произвольных поля, с помощью которых задается расположение постового в статье, причем они имеют заранее заданные значения, которые пользователю нужно только лишь выбрать. Значит значения этих произвольных полей выбираются пользователем с помощью специальных форм – радио-кнопок или выпадающего меню.
Чтобы создать такой блок произвольных полей, нужно вставить код в файл functions.php.
Создание блока
Чтобы создать блок, вставьте в файл functions.php:
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[ads_before]" value="ID, 'ads_before', 1); ?>" style="width:90%" /> до ссылки</label></p>
<p><label><input type="text" name="extra[ads_anchor]" value="ID, 'ads_anchor', 1); ?>" style="width:90%" /> анкор</label></p><script data-noptimize="" data-wpfc-render="false">
/* <![CDATA[ */
fpm_start( "true" );
/* ]]> */
</script>
<p><label><input type="text" name="extra[ads_url]" value="ID, 'ads_url', 1); ?>" style="width:90%" /> ссылка</label></p>
<p><label><input type="text" name="extra[ads_after]" value="ID, 'ads_after', 1); ?>" style="width:90%" /> после ссылки</label></p>
<p>
<!--вывод радио-кнопок-->
<div style="margin-right:30px">
размещение ID, 'ads_select', 1); ?>
<label><input type="radio" name="extra[ads_select]" value="auto" /> авто</label>
<label><input type="radio" name="extra[ads_select]" value="manual" /> вручную</label>
</div>
<!--вывод выпадающего меню-->
<div>
если выбрано вручную, то расположить
ID, 'ads_position', 1); ?>
----
<option value="top" >вверху
<option value="middle" >в центре
<option value="bottom" >внизу
<option value="hidden" >скрытно
</div>
</p>
<input type="hidden" name="extra_fields_nonce" value="" />
<?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);
}
return $post_id;
}
Эта часть кода проверяет, имеет ли право текущий пользователь редактировать пост, заполнено ли произвольное поле, и если оно заполнено, то сохраняет его значение. Если значение произвольного поля помечено приставкой extra, то такое произвольное поле будет создано в любом случае, даже если оно будет пустым, остальные же произвольные поля будут созданы и сохранены только если они будут заполнены. Эта проверка позволит удалять пустые и не нужные произвольные поля, оставляя только те, которые относятся к выводу рекламной ссылки и заполнены данными.
Код полностью
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[ads_before]" value="ID, 'ads_before', 1); ?>" style="width:90%" /> до ссылки</label></p>
<p><label><input type="text" name="extra[ads_anchor]" value="ID, 'ads_anchor', 1); ?>" style="width:90%" /> анкор</label></p>
<p><label><input type="text" name="extra[ads_url]" value="ID, 'ads_url', 1); ?>" style="width:90%" /> ссылка</label></p>
<p><label><input type="text" name="extra[ads_after]" value="ID, 'ads_after', 1); ?>" style="width:90%" /> после ссылки</label></p>
<p>
<div style="margin-right:30px">
размещение ID, 'ads_select', 1); ?>
<label><input type="radio" name="extra[ads_select]" value="auto" /> авто</label>
<label><input type="radio" name="extra[ads_select]" value="manual" /> вручную</label>
</div>
<div>
если выбрано вручную, то расположить
ID, 'ads_position', 1); ?>
----
<option value="top" >вверху
<option value="middle" >в центре
<option value="bottom" >внизу
<option value="hidden" >скрытно
</div>
</p>
<input type="hidden" name="extra_fields_nonce" value="" />
$value ){
if( empty($value) )
continue delete_post_meta($post_id, $key);
update_post_meta($post_id, $key, $value);
}
return $post_id;
}
Таким образом можно создавать пользовательские блоки с произвольными полями, с помощью которых удобно вводить значения полей или выбирать их из уже установленных. Можно создавать столько блоков, сколько вам нужно, и каждый из них может иметь собственную структуру. Видимость этих блоков можно устанавливать стандартно в настройках экрана.
В написании этого материала мне помогла статья Блок произвольных полей в админке WordPress своими руками. В ней так же рассматривается вариант использования чекбоксов, но с ними не все так гладко, есть нарекания в работе, поэтому я сознательно исключил этот вид переключателей из блока произвольных полей.
Подобный блок произвольных полей удобен еще и тем, что сохраняет все значения произвольных полей, а вот в плагине MaxSite – Произвольные поля возникает хоть и не критическая, но все же ошибка, доставляющая неудобства при дальнейшем редактировании постов – не все значения сохраняются, некоторые приходится вводить заново, на что указал в одном из своих вопросов sk8er.









А как можно вызвать стандартный блок произвольных полей для определенной страницы по её ID?
Произвольное поле – это дополнительные данные, которые вы можете ввести, создавая или редактируя пост. Потом эти данные вы можете использовать, например, выводить их на странице поста.
Произвольное поле можно создать, и добавить в него данные, в редакторе постов в админке. Для этого в редакторе нужно открыть панель Настройки экрана, и отметить чекбокс Произвольные поля.
Чтобы получить значение произвольного поля, зная ID поста, можно использовать функцию get_post_meta или get_post_custom_values.
Я имел ввиду можно ли как то вызвать стандартный блок редактирования произвольных полей для определенной страницы по её ID, см.скрыншот.
Здравствуйте, подскажите, пожалуйста, хочу использовать такое решение ещё и для вывода блоков перелинковки в середине текста с ссылкой на запись, анкором и миниатюрой записи, на которую ведет ссылка. Можно подключить вывод миниатюры по вставленной ссылке? Спасибо!
Также интересна возможность вставки такого блока в любое место статьи с помощью шорт-кода.