Вставка мета боксів типи посад в WordPress

65

Від автора: якщо ви хоч раз створювали для себе або клієнтів сайт на WordPress або працювали на компанію, чий сайт під управлінням WordPress, ви повинні знати, що таке мета бокси. У минулих статтях ми вже розповідали про вставці користувальницьких мета боксів в WP. В цій статті ми зробимо ще два кроки і пояснимо їх зв’язок, а також інтеграцію з типами посад, в тому числі як використовувати дані з мета боксів на фронті WP.

Вставка мета боксів на екран з типами посад

Про всі корисні (якщо не всі) PHP функції, їх параметри та action’и для створення мета боксів розповів Narayan Prusty.

Щоб вставити мета бокс на будь екран редагування типів постів, необхідно використовувати add_meta_box(), а після підчепити функцію до екшену add_meta_boxes.

Код нижче вставляє мета бокс на екран редагування post. Зверніть увагу на global_notice_meta_box_callback – це функція для відображення полів форми в мета боксі. Розберемо її трохи пізніше.

function global_notice_meta_box() {
add_meta_box(
‘global-повідомлення’,
__( ‘Global Notice’, ‘sitepoint’ ),
‘global_notice_meta_box_callback’,
‘post’
);
}
add_action( ‘add_meta_boxes’, ‘global_notice_meta_box’ );

Щоб вставити мета бокс на декілька екранів з типами посад (користувальницькі типи постів post, page й book), створіть масив типів постів, пройдіться по ньому в циклі і з допомогою add_meta_box() вставте його на екрани.

function global_notice_meta_box() {
$screens = array( ‘post’, ‘page’, ‘book’ );
foreach ( $screens as $screen ) {
add_meta_box(
‘global-повідомлення’,
__( ‘Global Notice’, ‘sitepoint’ ),
‘global_notice_meta_box_callback’,
$screen
);
}
}
add_action( ‘add_meta_boxes’, ‘global_notice_meta_box’ );

Щоб вставити мета бокс на всі існуючі та створені в майбутньому екрани з типами посад, створіть масив типів постів з допомогою get_post_types(), після чого змініть $screen зверху на масив.

function global_notice_meta_box() {
$screens = get_post_types();
foreach ( $screens as $screen ) {
add_meta_box(
‘global-повідомлення’,
__( ‘Global Notice’, ‘sitepoint’ ),
‘global_notice_meta_box_callback’,
$screen
);
}
}
add_action( ‘add_meta_boxes’, ‘global_notice_meta_box’ );

Вставити мета бокс на всі існуючі і нові екрани типів постів можна і без третього аргументу ($screen):

function global_notice_meta_box() {
add_meta_box(
‘global-повідомлення’,
__( ‘Global Notice’, ‘sitepoint’ ),
‘global_notice_meta_box_callback’
);
}
add_action( ‘add_meta_boxes’, ‘global_notice_meta_box’ );

Мета бокс можна обмежити типом постів (book в нашому прикладі). Для цього необхідно вставити ім’я типу поста в екшен add_meta_boxes:

function global_notice_meta_box() {
add_meta_box(
‘global-повідомлення’,
__( ‘Global Notice’, ‘sitepoint’ ),
‘global_notice_meta_box_callback’
);
}
add_action( ‘add_meta_boxes_book’, ‘global_notice_meta_box’ );

Серед аргументів масиву, які використовує функція register_post_type() для налаштування користувацьких типів постів, є register_meta_box_cb, чиє значення є колбек функцією. Ця функція викликається при установці мета боксів.

Наприклад, ми створили користувальницький тип постів book за допомогою коду нижче:

function book_cpt() {
$args = array(
‘label’ => ‘Books’,
‘public’ => true,
‘register_meta_box_cb’ => ‘global_notice_meta_box’
);
register_post_type( ‘book’, $args );
}
add_action( ‘init’, ‘book_cpt’ );

Якщо додати функцію add_meta_box(), за допомогою якої створюється мета бокс всередині PHP функції global_notice_meta_box (значення register_meta_box_cb зверху), це додасть мета бокс на екран редагування з типом постів book.

І знову наш приклад з функцією global_notice_meta_box.

function global_notice_meta_box() {
add_meta_box(
‘global-повідомлення’,
__( ‘Global Notice’, ‘sitepoint’ ),
‘global_notice_meta_box_callback’
);
}

Ми вивчили різні способи реєстрації та вставки мета боксів в WP. Нам ще потрібно створити функцію global_notice_meta_box_callback, в якій буде зберігатися поле форми для нашого мета боксу.

Нижче представлений код функції global_notice_meta_box_callback з текстовою областю мета боксі.

function global_notice_meta_box_callback( $post ) {
// Додаємо поле » nonce, щоб потім його перевірити.
wp_nonce_field( ‘global_notice_nonce’, ‘global_notice_nonce’ );
$value = get_post_meta( $post->ID, ‘_global_notice’, true );
echo » . esc_attr( $value ) . «;
}

Вставка мета боксов в типы постов в WordPress

Екшен save_post обробляє збереження даних, введених в текстову область, при збереженні чернетки або публікації.

/**
* При збереженні посади зберігаємо наші дані.
*
* @param int $post_id
*/
function save_global_notice_meta_box_data( $post_id ) {
// Перевіряємо, задано поле nonce.
if ( ! isset( $_POST[‘global_notice_nonce’] ) ) {
return;
}
// Перевіряємо nonce на валідність.
if ( ! wp_verify_nonce( $_POST[‘global_notice_nonce’], ‘global_notice_nonce’ ) ) {
return;
}
// Якщо було автозбереження, наша форма не поїхала, нам нічого робити не потрібно.
if ( defined( ‘DOING_AUTOSAVE’ ) && DOING_AUTOSAVE ) {
return;
}
// Перевіряємо дозволу користувача.
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, тепер зберігати дані безпечно. */
// Перевіряємо.
if ( ! isset( $_POST[‘global_notice’] ) ) {
return;
}
// Очищаємо введені дані.
$my_data = sanitize_text_field( $_POST[‘global_notice’] );
// Оновлюємо мета поле в базі даних.
update_post_meta( $post_id, ‘_global_notice’, $my_data );
}
add_action( ‘save_post’, ‘save_global_notice_meta_box_data’ );

Щоб помістити дані, які будуть введені в текстову область мета боксу, ми покажемо їх до відображення контенту посту, в якому вони зберігаються.

function global_notice_before_post( $content ) {
global $post;
// retrieve the global notice for the current post
$global_notice = esc_attr( get_post_meta( $post->ID, ‘_global_notice’, true ) );
$notice = «

$global_notice

«;
return $notice . $content;
}
add_filter( ‘the_content’, ‘global_notice_before_post’ );

Пояснення коду

Спершу ми створили функцію global_notice_before_post, яку причепили до фільтру the_content з параметром $content, в якому зберігається вміст поста.

У функції підключається глобальна змінна $post, в якій зберігається об’єкт WP_Post поточного проглядається посту.

Глобальне повідомлення, збережене для даного посту, витягується з допомогою get_post_meta і зберігається в змінну $global_notice.

Повідомлення обертається у div і записується в змінну $notice.

І в кінці, $notice, де зберігається глобальне повідомлення, з допомогою конкатенації чіпляється до $content, де зберігається вміст поста.

Нижче показаний скріншот поста з глобальним повідомленням перед контентом посту.

Вставка мета боксов в типы постов в WordPress

Висновок

У цьому уроці ми вивчили кілька способів реєстрації мета боксів на екранах в панелі адміністратора WP, а також дізналися, як обмежити їх типами посад.

Також ми дізналися, як додати поля форми до мета боксу, а також як зберігати введені дані при збереженні поста або його публікації.

І нарешті, ми зрозуміли, як на практиці можна застосувати дані, введені в мета бокс.

У наступній статті ми дізнаємося, як додати контекстну допоміжну вкладку на екрани з типами посад в панелі адміністратора.