Метабокси в WordPress
Що таке метабокси?
Щоб не бути голослівним скажу, що WordPress є стандартні метабокси і ви часто їх використовуєте. Найчастіше ви бачите метабокси “Discussion» (Обговорення) та Custom Fields (Довільні поля). Ті, хто вже деякий час працював з WordPress, знають що відключати і підключати стандартні метабокси можна в пункті Screen Options (Налаштування екрану).
Коли ви розробляєте сайти, ви використовуєте плагіни і багато хто з них використовують API метабоксів. Цією технологією часто користуються в SEO плагінах для додавання полів введення заголовка, опису та ключових слів. До речі перевірено експериментально мета тег ключових слів на сторінках можна зовсім не додавати на видачу не помітив, щоб впливало.
Приклад метабоксу в плагінах.
Перед тим як створювати свої метабокси, необхідно навчитися видаляти зайві.
remove_meta_box() – видалення метабоксу.
1 |
remove_meta_box( $id, $page, $context ); |
$page (рядок) – тип постів, на сторінці створення / редагування яких потрібно видалити метабокс, наприклад, пост, page.
$context (рядок) – розташування метабоксу, наприклад normal, просунутий або бік.
Для роботи функції її необхідно розмістити у functions.php. Для прикладу приберемо шар з ім’ям автора authordiv.
1 2 3 4 5 |
function remove_author_div() { remove_meta_box( 'authordiv' , 'post' , 'side' ); // удалим метабокс с рубриками } add_action( 'admin_menu' , 'remove_author_div' ); |
Якщо ви вставите цей код, то в Scrin Optn (налаштуваннях екрана) не буде вибору метабоксу автора. Також і під час редагування статті ви не побачите цей метабокс.
Розглянемо ще які стандартні метабокси можуть бути використані для розробки плагінів.
Ідентифікатори метабоксів можна було б знайти і в коді, але є ряд стандартних, які думаю, важливо перерахувати. Перерахую айдішники стандартних метабоксів.
commentstatusdiv – налаштування обговорення.
commentsdiv – відображає коментарі до поточної посади.
slugdiv – ярлик запису.
revisionsdiv – редакції.
authordiv – автор запису.
postcustom – додавання / редагування довільних полів.
postexcerpt – цитата.
trackbacksdiv – зворотні посилання.
categorydiv – метабокс список рубрик WordPress.
tagsdiv-post_tag – мітки.
postimagediv – мініатюра запису.
pageparentdiv – метабокс із вибором батьківської сторінки та шаблону сторінок.
submitdiv – блок із кнопкою «опублікувати».
Додавання метабоксів за допомогою register_post_type()
Додавання метабоксів register_post_type()
Думаю ви чули про типи матеріалів у WordPress. Стандартні типи – це сторінки, пости і ті, які ви можете створити самі. Так ось, для створення типом матеріалів використовується ця функція. У ній же можна відразу визначити які метабокси створені типи будуть підтримувати.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
function codex_custom_init() { $labels = array( 'name' => _x('Books', 'post type general name', 'your_text_domain'), 'singular_name' => _x('Book', 'post type singular name', 'your_text_domain'), 'add_new' => _x('Add New', 'book', 'your_text_domain'), 'add_new_item' => __('Add New Book', 'your_text_domain'), 'edit_item' => __('Edit Book', 'your_text_domain'), 'new_item' => __('New Book', 'your_text_domain'), 'all_items' => __('All Books', 'your_text_domain'), 'view_item' => __('View Book', 'your_text_domain'), 'search_items' => __('Search Books', 'your_text_domain'), 'not_found' => __('No books found', 'your_text_domain'), 'not_found_in_trash' => __('No books found in Trash', 'your_text_domain'), 'parent_item_colon' => '', 'menu_name' => __('Books', 'your_text_domain') ); $args = array( 'labels' => $labels, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => array( 'slug' => _x( 'book', 'URL slug', 'your_text_domain' ) ), 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => null, 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ) ); register_post_type('book', $args); } add_action( 'init', 'codex_custom_init' ); |
Рядок Support показує, які метабокси має використовувати новий тип даних.
1 |
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ) |
Також можна для нового типу даних додавати категорію та теги за допомогою масиву taxonomies.
1 |
'taxonomies' => array('category', 'post_tag'), |
Повний вид коду для нашого нового типу даних:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
function codex_custom_init() { $labels = array( 'name' => _x('Books', 'post type general name', 'your_text_domain'), 'singular_name' => _x('Book', 'post type singular name', 'your_text_domain'), 'add_new' => _x('Add New', 'book', 'your_text_domain'), 'add_new_item' => __('Add New Book', 'your_text_domain'), 'edit_item' => __('Edit Book', 'your_text_domain'), 'new_item' => __('New Book', 'your_text_domain'), 'all_items' => __('All Books', 'your_text_domain'), 'view_item' => __('View Book', 'your_text_domain'), 'search_items' => __('Search Books', 'your_text_domain'), 'not_found' => __('No books found', 'your_text_domain'), 'not_found_in_trash' => __('No books found in Trash', 'your_text_domain'), 'parent_item_colon' => '', 'menu_name' => __('Books', 'your_text_domain') ); $args = array( 'labels' => $labels, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => array( 'slug' => _x( 'book', 'URL slug', 'your_text_domain' ) ), 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'taxonomies' => array('category', 'post_tag'), 'menu_position' => null, 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ), ); register_post_type('book', $args); } add_action( 'init', 'codex_custom_init' ); |
Також метабокси можна додавати за допомогою функції register_taxonomy_for_object_type()
Функція надає таксономію до потрібного типу записів, додається і метабокс:
1 2 3 4 |
$taxonomy = 'post_tag'; // таксономія, у цьому випадку мітки $post_type = 'game'; // тип посту register_taxonomy_for_object_type($taxonomy, $post_type); |
Цю функцію можна використовувати, якщо таксономія спочатку визначати не треба.
Можна також додати підтримувані метабокси не відразу під час функції register_post_type(), а при подальшій обробці коду. Для додавання підтримки метабоксів використовуйте функцію add_post_type_support() замість масиву supports.
1 2 3 4 5 6 7 8 |
function add_some_std_metaboxes() { add_post_type_support('game', 'excerpt'); // добавляем метабокс с цитатой для типа записей game add_post_type_support('movie', array('comments', 'thumbnail', 'excerpt')); // метабокс с комментами, миниатюрой и цитатой для типа записей movie } add_action('init', 'add_some_std_metaboxes'); |
Додаємо свої метабокси add_meta_box()
Ви зможете додати абсолютно будь-який власний метабокс, неважливо, чи це будуть поля для вказівки мета-тегів або завантажувач зображень в галерею.
1 |
add_meta_box($id, $title, $callback, $post_type, $context, $priority, $args); |
$id (рядок) (обов’язкове) – HTML-атрибут id для блоку div майбутнього метабоксу,
$title (рядок) (обов’язкове) - Заголовок,
$callback (функція) (обов’язкове) – функція яка заповнюватиме метабокс, потрібно вказати назву функції у вигляді рядка,
$post_type (рядок) (обов’язкове) – тип записів,
$context (рядок) – у якій частині сторінки вставити метабокс (normal, side, advanced), за замовчуванням – advanced,
$priority (рядок) – пріоритет, чим він вищий, тим ближче до верхньої частини сторінки розташовуватиметься метабокс, (high, core, default або low), за замовчуванням – default,
$args (масив) – аргументи для callback-функції.
На відміну від попередніх способів, додавання свого метабоксу проходитиме в кілька етапів, розглянемо приклад:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
/* * Этап 1. Додавання */ function tr_meta_boxes() { add_meta_box('truediv','Настройки','tr_echo_box','book','normal','high'); } add_action( 'admin_menu', 'tr_meta_boxes' ); /* також можна використовувати й інші хуки: add_action( 'add_meta_boxes', 'tr_meta_boxes' ); Якщо версія WordPress нижче 3.0, від add_action( 'admin_init', 'tr_meta_boxes', 1 ); */ /* * Этап 2. Заповнення */ function tr_echo_box($post) { wp_nonce_field( basename( __FILE__ ), 'seo_metabox_nonce' ); $title = get_post_meta($post->ID, '_seo_title',true); $noindex = get_post_meta($post->ID, '_seo_noindex',true); ?> <label>Заголовок <input name="seotitle" type="text" value="<?php echo $title ?>" /> </label> <label> <input checked="checked" name="noindex" type="checkbox" /> /> Приховати запис від пошукових систем? </label> <!--?php } /* * Этап 3. Сохранение */ function tr_save_box( $post_id ) { // проверяем, пришёл ли запрос со страницы с метабоксом if ( !isset( $_POST['seo_metabox_nonce'] ) || !wp_verify_nonce( $_POST['seo_metabox_nonce'], basename( __FILE__ ) ) ) return $post_id; // проверяем, является ли запрос автосохранением if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id; // проверяем, права пользователя, может ли он редактировать записи if ( !current_user_can( 'edit_post', $post_id ) ) return $post_id; // теперь также проверим тип записи $post = get_post($post_id); if ($post--->post_type == 'book') { // вкажіть власний update_post_meta($post_id,'_seo_title',esc_attr($_POST['seotitle'])); update_post_meta($post_id,'_seo_noindex', $_POST['noindex']); } return $post_id; } add_action('save_post','tr_save_box'); ?> |
Якщо після вставки коду ви спробуєте створити запис у нашому новому типі даних Books, то при створенні ви побачите новий метабокс із нашим вмістом.
Додавання метабоксів з використанням класу
Автор у якого я підглянув частину статті обіцяв викласти ще уроки про створення віджетів, думаю стежитиму за ним і шукати сам, тема справді цікава.
Опис класу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
<!--?php if ( !class_exists('trueMetaBoxes') ){ class trueMetaBoxes { /* * параметры по умолчанию, например префикс для полей в таблице MySQL */ var $prefix = '_true_'; /* * массив с произвольными полями * содержание массива довольно размыто, * то есть никто не заставляет вас использовать те же самые ключи */ var $options = array( array( "name" =-->"title", // атрибути id та name поля форми "title" => "Заголовок", // назва поля "description" => "Содержимое тега title", // опис "type" => "text", // тип поля "cap" => "edit_posts", // необхідні права користувача "val" => "" // значення за замовчуванням ), array( "name" => "noindex", "title" => "Дозволити канонічні URL?", "type" => "checkbox", "cap" => "edit_posts" ), array( "name" => "robots", "title" => "Вміст мета-тегу robots", "type" => "select", "cap" => "edit_posts", "val" => array( 'index' => 'index,follow', 'noindex' => 'noindex,follow', 'nofollow' => 'nofollow, index', 'noindexnofollow' => 'noindex, nofollow' ) ) ); /* * конструктор класу, під час створення об'єкта сюди передаємо параметри $id и $title * вони знадобляться у функції add_meta_box() */ function __construct($id, $title) { $this->id = $id; $this->title = $title; add_action( 'admin_menu', array( &$this, 'create_true_box' ) ); add_action( 'save_post', array( &$this, 'save_true_box' ), 1, 2 ); } /* * функція додавання метабоксу * як бачите, в конструкторі я передав лише найважливіші аргументи * але так само можна легко налаштовувати і інші */ function create_true_box() { add_meta_box( $this->id, $this->title, array( &$this, 'display_true_box' ), 'post', 'normal'); } /* * функція, що генерує вміст метабоксу */ function display_true_box(){ global $post; ?> |
параметри як $option ) { if (поточний_користувач_може( $варіант[«шапка»], $пост->ID )) { ?>
префікс . $варіант["ім'я"] . '" id="' . $це->префікс . $варіант["ім'я"] . """; if ( get_post_meta( $пост->ID, $це->префікс . $варіант["ім'я"], true ) == «увімкнено» ) echo ‘ checked=”checked”’; echo ‘” style=”width: auto;” />'; луна '«; перерву; } регістр «вибрати»: { луна '
« . $варіант[ «опис» ] . «
«; перерву; } за замовчуванням: { // за замовчуванням type=”text” echo ‘
« . $варіант[ «опис» ] . «
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!--?php } /* * функция сохранения произвольных полей */ function save_true_box($post_id, $post){ if ( !wp_verify_nonce( $_POST[ 'seodiv_wpnonce' ], 'seo-div' ) ) return; if ( !current_user_can( 'edit_post', $post_id ) ) return; if ( $post--->post_type != 'page' && $post->post_type != 'post' ) return; foreach ( $this->options as $option ) { if ( current_user_can( $option['cap'], $post_id ) ) { if ( isset( $_POST[ $this->prefix . $option['name'] ] ) && trim( $_POST[ $this->prefix . $option['name'] ] ) ) { // як бачите, вся інформація зберігається в метаданих посту update_post_meta( $post_id, $this->prefix . $option[ 'name' ], $_POST[ $this->prefix . $option['name'] ] ); } else { delete_post_meta( $post_id, $this->prefix . $option[ 'name' ] ); } } } } } } |
1 2 3 4 5 |
if (class_exists('trueMetaBoxes')) { $id = 'seodiv'; // id метабокса $title = 'Доп. Налаштування'; // заголовок $obj = new trueMetaBoxes($id, $title); } |
Досить один раз докладно описати клас і після цього створювати скільки завгодно об’єктів (це і будуть метабокси), лише змінюйте параметри, що передаються йому, в тому числі і масив $options, не доведеться писати купу HTML-коду, все буде вставлятися за шаблоном. Змінні, які не використовуються конструктором, можна буде поміняти вже після створення об’єкта, наприклад:
1 2 3 |
// тобто. кожному об'єкту можна присвоїти свої власні $prefix та $options $obj->prefix = '_seo_'; $obj->options[0]['title'] = 'Типу новий лейбл першого поля у метабоксі'; |
Звернення до метаданих (довільних полів) посту / сторінки
1 |
get_post_meta($post_id, $key, $single); |
$post_id (ціле) (обов’язкове) – ID посту або сторінки.
$key (рядок) (обов’язкове) – значення довільного поля.
$single (логічне) – якщо true – повертає строку, false – масив, за замовчуванням – false.
Останній приклад для виведення вмісту метабоксу у шаблоні:
1 2 3 4 5 6 7 8 |
/* * $obj->prefix я взяв із попереднього прикладу, * можна також вказати префікс самому: * get_post_meta($post->ID, '_seo_title', true); */ $title = ''; $title .= get_post_meta($post->ID, $obj->prefix.'title', true); $title .=''; |
Ще хотів би підкреслити що дані які записувалися в метабокс зберігатися в “Довільних полях”, а те що я вказав вгорі це виведення тих самих довільних полів.
/*
- Базовий курс з веб-дизайну;
- Верстка сайтів;
- Загальний курс CMS WordPress та продовження курсу з розробки шаблонів;
- Розробка сайтів на PHP.