Metabox — это произвольное поле реализованное в виде специальной формы (оболочка для PostMeta). Создание metabox’а самостоятельно — лучшая альтернатива плагину Advanced custom fields, особенно для релизации доп.полей в плагинах.
Создание metabox’а
Создаем 3 функции: инициализация metabox, функция вывода поля, функция сохранения значения.
slidelink — ID поля, понадобится при вызове.
add_action('add_meta_boxes', 'link_box');
function link_box() {
add_meta_box(
'slidelink_box',
'Ссылка слайда',
'atb_box_func', //привязка функции вывода поля (ниже)
'slide',
'normal',
'high'
);
}
function atb_box_func($post){
$slidelink = get_post_meta($post->ID, 'slidelink', 1);
?>
<label><input style="width:100%;" type="text" name="extra[slidelink]" value="<?php if($slidelink){echo $slidelink;}?>" /></label>
<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;
}
Вывод данных metabox’а
Вывод данных metabox’а аналогиечен выводу данных из PostMeta.
Также можно сделать проверку на наличие данных у metabox
<?php if ( get_post_meta($post->ID, 'thumb', true) ) : ?>
<a href="<?php the_permalink() ?>" rel="bookmark">
<img class="thumb" src="<?php echo get_post_meta($post->ID, 'thumb', true) ?>" alt="<?php the_title(); ?>" />
</a>
<?php endif; ?>
Metabox textarea
Имя поля, при выводе — config
add_action( 'add_meta_boxes', 'myplugin_add_custom_box' );
add_action( 'save_post', 'myplugin_save_postdata' );
// Adds a box to the main column on the Post and Page edit screens
function myplugin_add_custom_box() {
add_meta_box( 'wp_editor_test_1_box', 'Конфигурция зала', 'wp_editor_meta_box' );
}
// Prints the box content
function wp_editor_meta_box( $post ) {
// Use nonce for verification
wp_nonce_field( plugin_basename( __FILE__ ), 'myplugin_noncename' );
$field_value = get_post_meta( $post->ID, 'config', false );
wp_editor( $field_value[0], 'config' );
}
// When the post is saved, saves our custom data
function myplugin_save_postdata( $post_id ) {
// verify if this is an auto save routine.
// If it is our form has not been submitted, so we dont want to do anything
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
// verify this came from the our screen and with proper authorization,
// because save_post can be triggered at other times
if ( ( isset ( $_POST['myplugin_noncename'] ) ) && ( ! wp_verify_nonce( $_POST['myplugin_noncename'], plugin_basename( __FILE__ ) ) ) )
return;
// Check permissions
if ( ( isset ( $_POST['post_type'] ) ) && ( 'page' == $_POST['post_type'] ) ) {
if ( ! current_user_can( 'edit_page', $post_id ) ) {
return;
}
}
else {
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
}
// OK, we're authenticated: we need to find and save the data
if ( isset ( $_POST['config'] ) ) {
update_post_meta( $post_id, 'config', $_POST['config'] );
}
}
Чтобы добавить визуальный редактор — надо включить функцию Визуальный редактор в анонсе
Метабокс с редактором стилей (WYSIWYG)
Данный метод позволяет добавлять подобные поля не нарушаю общую систему обновления метаполей [extra].
// Поле Характеристики
add_action('add_meta_boxes', 'params_box');
function params_box() {
add_meta_box('params_box', 'Характеристики', 'params_box_func', 'post', 'normal', 'high');
}
function params_box_func( $post ) {
wp_nonce_field( plugin_basename( __FILE__ ), 'atb_nonce' );
$params = get_post_meta( $post->ID, 'params', 1 );
wp_editor( $params, 'params' );
}
// Сохранение полей (общий для всех полей)
add_action('save_post', 'fields_box_update');
function fields_box_update($post_id){
if ( ( isset ( $_POST['atb_nonce'] ) ) && ( ! wp_verify_nonce( $_POST['atb_nonce'], plugin_basename( __FILE__ ) ) ) )
return; // Проверка, что передаются нужные поля
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return false; // Проверка, что это не автосохранение
if (!current_user_can('edit_post', $post_id)) return false; // Проверка, что пользователь может изменять этот пост
// Добавляем поля TyniMCE в массив extra
if (!empty($_POST['params'])) { $_POST['extra']['params'] = $_POST['params']; } else { $_POST['extra']['params'] = ''; }
if(!isset($_POST['extra']) ) return false; // Проверка, что поля для обновления есть
foreach($_POST['extra'] as $key=>$value){
if(empty($value) AND $value != 0){
delete_post_meta($post_id, $key);
continue; // Продолжаем
}
update_post_meta($post_id, $key, $value);
}
return $post_id;
}
[site-socialshare]