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'] ); } }
Чтобы добавить визуальный редактор — надо включить функцию Визуальный редактор в анонсе