Метабокси в WordPress
Що таке метабокси?
Щоб не бути голослівним скажу, що WordPress є стандартні метабокси і ви часто їх використовуєте. Найчастіше ви бачите метабокси “Discussion» (Обговорення) та Custom Fields (Довільні поля). Ті, хто вже деякий час працював з WordPress, знають що відключати і підключати стандартні метабокси можна в пункті Screen Options (Налаштування екрану).
Коли ви розробляєте сайти, ви використовуєте плагіни і багато хто з них використовують API метабоксів. Цією технологією часто користуються в SEO плагінах для додавання полів введення заголовка, опису та ключових слів. До речі перевірено експериментально мета тег ключових слів на сторінках можна зовсім не додавати на видачу не помітив, щоб впливало.
Приклад метабоксу в плагінах.
![]() | ![]() |
Перед тим як створювати свої метабокси, необхідно навчитися видаляти зайві.
remove_meta_box() – видалення метабоксу.
remove_meta_box( $id, $page, $context );
$id (рядок) – ідентифікатор метабоксу, його можна знайти у вихідному коді сторінці, трохи нижче я перерахую айдішники всіх стандартних метабоксів.
$page (рядок) – тип постів, на сторінці створення / редагування яких потрібно видалити метабокс, наприклад, пост, page.
$context (рядок) – розташування метабоксу, наприклад normal, просунутий або бік.
Для роботи функції її необхідно розмістити у functions.php. Для прикладу приберемо шар з ім’ям автора authordiv.
функція remove_author_div() {
remove_meta_box( 'автордів' , 'Пост' , '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. Стандартні типи – це сторінки, пости і ті, які ви можете створити самі. Так ось, для створення типом матеріалів використовується ця функція. У ній же можна відразу визначити які метабокси створені типи будуть підтримувати.
функція codex_custom_init() {
$підписи = масив(
'ім'я' => _x('Книги', "Загальна назва типу посади", 'your_text_domain'),
'singular_name' => _x('Книжка', "Тип публікації в однині ім'я", 'your_text_domain'),
'add_new' => _x('Додати новий', 'книжка', 'your_text_domain'),
'add_new_item' => __('Додати нову книгу', 'your_text_domain'),
'edit_item' => __('Редагувати книгу', 'your_text_domain'),
'new_item' => __('Нова книга', 'your_text_domain'),
'all_items' => __('Всі книги', 'your_text_domain'),
'view_item' => __('Переглянути книгу', 'your_text_domain'),
'search_items' => __('Пошук книг', 'your_text_domain'),
'not_found' => __("Книг не знайдено", 'your_text_domain'),
'not_found_in_trash' => __("У смітті не знайдено книг", 'your_text_domain'),
'parent_item_colon' => '',
'menu_name' => __('Книги', 'your_text_domain')
);
$args = масив(
'мітки' => $labels,
'громадськість' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'переписати' => array( 'slug' => _x( 'книжка', "URL-слимак", 'your_text_domain' ) ),
'capability_type' => 'Пост',
'has_archive' => true,
'ієрархічний' => false,
'menu_position' => нуль,
'опори' => array( 'Назва', 'редактор', 'автор', 'мініатюра', 'уривок', 'коментарі' )
);
register_post_type('книжка', $args);
}
add_action( 'init', 'codex_custom_init' );Рядок Support показує, які метабокси має використовувати новий тип даних.
'опори' => array( 'Назва', 'редактор', 'автор', 'мініатюра', 'уривок', 'коментарі' )
Також можна для нового типу даних додавати категорію та теги за допомогою масиву taxonomies.
'таксономії' => array('category', 'post_tag'),Повний вид коду для нашого нового типу даних:
функція codex_custom_init() {
$підписи = масив(
'ім'я' => _x('Книги', "Загальна назва типу посади", 'your_text_domain'),
'singular_name' => _x('Книжка', "Тип публікації в однині ім'я", 'your_text_domain'),
'add_new' => _x('Додати новий', 'книжка', 'your_text_domain'),
'add_new_item' => __('Додати нову книгу', 'your_text_domain'),
'edit_item' => __('Редагувати книгу', 'your_text_domain'),
'new_item' => __('Нова книга', 'your_text_domain'),
'all_items' => __('Всі книги', 'your_text_domain'),
'view_item' => __('Переглянути книгу', 'your_text_domain'),
'search_items' => __('Пошук книг', 'your_text_domain'),
'not_found' => __("Книг не знайдено", 'your_text_domain'),
'not_found_in_trash' => __("У смітті не знайдено книг", 'your_text_domain'),
'parent_item_colon' => '',
'menu_name' => __('Книги', 'your_text_domain')
);
$args = масив(
'мітки' => $labels,
'громадськість' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'переписати' => array( 'slug' => _x( 'книжка', "URL-слимак", 'your_text_domain' ) ),
'capability_type' => 'Пост',
'has_archive' => true,
'ієрархічний' => false,
'таксономії' => array('category', 'post_tag'),
'menu_position' => нуль,
'опори' => array( 'Назва', 'редактор', 'автор', 'мініатюра', 'уривок', 'коментарі' ),
);
register_post_type('книжка', $args);
}
add_action( 'init', 'codex_custom_init' );
Також метабокси можна додавати за допомогою функції register_taxonomy_for_object_type()
Функція надає таксономію до потрібного типу записів, додається і метабокс:
$taxonomy = 'post_tag'; // таксономія, у цьому випадку мітки $post_type = 'game'; // тип посту register_taxonomy_for_object_type($taxonomy, $post_type);
Цю функцію можна використовувати, якщо таксономія спочатку визначати не треба.
Можна також додати підтримувані метабокси не відразу під час функції register_post_type(), а при подальшій обробці коду. Для додавання підтримки метабоксів використовуйте функцію add_post_type_support() замість масиву supports.
function add_some_std_metaboxes() { add_post_type_support('game', 'уривок'); // добавляем метабокс с цитатой для типа записей game add_post_type_support('movie', array('коментарі', 'мініатюра', 'уривок')); // метабокс с комментами, миниатюрой и цитатой для типа записей movie } add_action('init', 'add_some_std_metaboxes');
Додаємо свої метабокси add_meta_box()
Ви зможете додати абсолютно будь-який власний метабокс, неважливо, чи це будуть поля для вказівки мета-тегів або завантажувач зображень в галерею.
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. Додавання
*/
функція tr_meta_boxes() {
add_meta_box('truediv','Настройки','tr_echo_box','книжка','normal','високий');
}
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. Заповнення
*/
функція tr_echo_box($пост) {
wp_nonce_field( Базове ім'я( __ФАЙЛ__ ), 'seo_metabox_nonce' );
$title = get_post_meta($пост->ID, '_seo_title',true);
$noindex = get_post_meta($пост->ID, '_seo_noindex',true); ?>
post_type == 'книга') { // вкажіть власний
update_post_meta($post_id,'_seo_title',esc_attr($_ПОСТ['seotitle']));
update_post_meta($post_id,'_seo_noindex', $_ПОСТ['noindex']);
}
return $post_id;
}
add_action('save_post','tr_save_box');
?>Якщо після вставки коду ви спробуєте створити запис у нашому новому типі даних Books, то при створенні ви побачите новий метабокс із нашим вмістом.
Додавання метабоксів з використанням класу
Автор у якого я підглянув частину статті обіцяв викласти ще уроки про створення віджетів, думаю стежитиму за ним і шукати сам, тема справді цікава.
Опис класу:
"title", // атрибути id та name поля форми "title" => "Заголовок", // назва поля "опис" => "Содержимое тега title", // опис "тип" => "text", // тип поля "cap" => "edit_posts", // необхідні права користувача "Валь" => "" // значення за замовчуванням ), array( "name" => "noindex", "title" => "Дозволити канонічні URL?", "тип" => "Прапорець", "cap" => "edit_posts" ), array( "name" => "robots", "title" => "Вміст мета-тегу robots", "тип" => "вибрати", "cap" => "edit_posts", "Валь" => array( 'index' => 'index,follow', 'noindex' => 'noindex,follow', 'nofollow' => 'nofollow, index', 'noindexnofollow' => 'noindex, nofollow' ) ) ); /* * конструктор класу, під час створення об'єкта сюди передаємо параметри $id и $title * вони знадобляться у функції add_meta_box() */ function __construct($id, $title) { $це->id = $id; $це->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( $це->id, $це->title, array( &$this, 'display_true_box' ), 'Пост', 'normal'); } /* * функція, що генерує вміст метабоксу */ function display_true_box(){ глобальна $post; ?>
параметри як $option ) { if (поточний_користувач_може( $варіант[«шапка»], $пост->ID )) { ?>
префікс . $варіант["ім'я"] . '" id="' . $це->префікс . $варіант["ім'я"] . """; if ( get_post_meta( $пост->ID, $це->префікс . $варіант["ім'я"], true ) == «увімкнено» ) echo ‘ checked=”checked”’; echo ‘” style=”width: auto;” />'; луна '«; перерву; } регістр «вибрати»: { луна '
« . $варіант[ «опис» ] . «
«; перерву; } за замовчуванням: { // за замовчуванням type=”text” echo ‘
« . $варіант[ «опис» ] . «
post_type != 'page' && $пост->post_type != 'post' ) повернення;
foreach ( $це->параметри як $option ) {
if ( поточний_користувач_може( $варіант['cap'], $post_id ) ) {
if ( isset( $_ПОСТ[ $це->префікс . $варіант['name'] ] ) && trim( $_ПОСТ[ $це->префікс . $варіант['name'] ] ) ) {
// як бачите, вся інформація зберігається в метаданих посту
update_post_meta( $post_id, $це->префікс . $варіант[ 'name' ], $_ПОСТ[ $це->префікс . $варіант['name'] ] );
} ще {
delete_post_meta( $post_id, $це->префікс . $варіант[ 'name' ] );
}
}
}
}
}
}Створення об’єкту класу:
if (class_exists('trueMetaBoxes')) { $id = 'seodiv'; // id метабокса $title = 'Доп. Налаштування'; // заголовок $obj = new trueMetaBoxes($id, $title); }
Стільки коду … Напрошується питання – навіщо це все? Начебто попередній спосіб був простішим.
Досить один раз докладно описати клас і після цього створювати скільки завгодно об’єктів (це і будуть метабокси), лише змінюйте параметри, що передаються йому, в тому числі і масив $options, не доведеться писати купу HTML-коду, все буде вставлятися за шаблоном. Змінні, які не використовуються конструктором, можна буде поміняти вже після створення об’єкта, наприклад:
// тобто. кожному об'єкту можна присвоїти свої власні $prefix та $options $obj->prefix = '_seo_'; $Об'єкт->options[0]['Назва'] = 'Типу новий лейбл першого поля у метабоксі';
Звернення до метаданих (довільних полів) посту / сторінки
get_post_meta($post_id, $key, $single);
$post_id (ціле) (обов’язкове) – ID посту або сторінки.
$key (рядок) (обов’язкове) – значення довільного поля.
$single (логічне) – якщо true – повертає строку, false – масив, за замовчуванням – false.
Останній приклад для виведення вмісту метабоксу у шаблоні:
/* * $Об'єкт->префікс я взяв із попереднього прикладу, * можна також вказати префікс самому: * get_post_meta($пост->ID, '_seo_title', true); */ $назва = ''; $назва .= get_post_meta($пост->ID, $Об'єкт->префікс.'title', true); $назва .='';
Ще хотів би підкреслити що дані які записувалися в метабокс зберігатися в “Довільних полях”, а те що я вказав вгорі це виведення тих самих довільних полів.
/*

- Базовий курс з веб-дизайну;
- Верстка сайтів;
- Загальний курс CMS WordPress та продовження курсу з розробки шаблонів;
- Розробка сайтів на PHP.

















