Задавайте вопросы по курсам WordPress

Метабокси в WordPress

Що таке метабокси?

Щоб не бути голослівним скажу, що WordPress є стандартні метабокси і ви часто їх використовуєте. Найчастіше ви бачите метабокси «Discussion» (Обговорення) та Custom Fields (Довільні поля). Ті, хто вже деякий час працював з WordPress, знають що відключати і підключати стандартні метабокси можна в пункті Screen Options (Налаштування екрану).

Коли ви розробляєте сайти, ви використовуєте плагіни і багато хто з них використовують API метабоксів. Цією технологією часто користуються в SEO плагінах для додавання полів введення заголовка, опису та ключових слів. До речі перевірено експериментально мета тег ключових слів на сторінках можна зовсім не додавати на видачу не помітив, щоб впливало.

Приклад метабоксу в плагінах.

 

pageparentdiv – метабокс с выбором родительской страницы и шаблона страниц wordpresstagsdiv-post_tag – метабокс метки wordpress

Перед тим як створювати свої метабокси, необхідно навчитися видаляти зайві.

remove_meta_box() – видалення метабоксу.

remove_meta_box( $id, $page, $context );

$id (строка) – ідентифікатор метабоксу, його можна знайти у вихідному коді сторінці, трохи нижче я перерахую айдішники всіх стандартних метабоксів.
$page (строка) – тип постів, на сторінці створення / редагування яких потрібно видалити метабокс, наприклад, post, page.
$context (строка) – розташування метабоксу, наприклад normal, advanced або side.

Для роботи функції її необхідно розмістити у functions.php. Для прикладу приберемо шар з ім’ям автора authordiv.

function remove_author_div() {
	remove_meta_box( 'authordiv' , 'post' , 'side' );
	// удалим метабокс с рубриками
}
add_action( 'admin_menu' , 'remove_author_div' );

Якщо ви вставите цей код, то в Scrin Optn (налаштуваннях екрана) не буде вибору метабоксу автора. Також і під час редагування статті ви не побачите цей метабокс.

Розглянемо ще які стандартні метабокси можуть бути використані для розробки плагінів.

Ідентифікатори метабоксів можна було б знайти і в коді, але є ряд стандартних, які думаю, важливо перерахувати. Перерахую айдішники стандартних метабоксів.

commentstatusdiv – налаштування обговорення.

commentstatus metabox

commentsdiv – відображає коментарі до поточної посади.

commentsdiv metabox стандартные метабоксы WordPress

slugdiv – ярлик запису.

metabox slug - метабокс язык записи WordPress

revisionsdiv – редакції.

revisionsdiv – редакции.

authordiv – автор запису.

author – автор записи

postcustom – додавання / редагування довільних полів.

postcustom – добавление/редактирование произвольных полей WordPress

postexcerpt – цитата.

postexcerpt – метабокс wordpress цитата

trackbacksdiv – зворотні посилання.

trackbacksdiv – метабокс обратные ссылки в wordpress

categorydiv – метабокс список рубрик WordPress.

categorydiv – метабокс список рубрик

tagsdiv-post_tag – мітки.

tagsdiv-post_tag – метабокс метки wordpress

postimagediv – мініатюра запису.

postimagediv – миниатюра записи wordpress.

pageparentdiv – метабокс із вибором батьківської сторінки та шаблону сторінок.

pageparentdiv – метабокс с выбором родительской страницы и шаблона страниц wordpress

submitdiv – блок із кнопкою «опублікувати».

submitdiv – метабокс с кнопкой «опубликовать».

Додавання метабоксів за допомогою register_post_type()

Додавання метабоксів register_post_type()

Думаю ви чули про типи матеріалів у WordPress. Стандартні типи — це сторінки, пости і ті, які ви можете створити самі. Так ось, для створення типом матеріалів використовується ця функція. У ній же можна відразу визначити які метабокси створені типи будуть підтримувати.

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 показує, які метабокси має використовувати новий тип даних.

'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )

Також можна для нового типу даних додавати категорію та теги за допомогою масиву taxonomies.

'taxonomies' => array('category', 'post_tag'),

Повний вид коду для нашого нового типу даних:

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() 

Функція надає таксономію до потрібного типу записів, додається і метабокс:

$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', 'excerpt');
	// добавляем метабокс с цитатой для типа записей game
	add_post_type_support('movie', array('comments', 'thumbnail', 'excerpt'));
	// метабокс с комментами, миниатюрой и цитатой для типа записей 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. Додавання
 */
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); ?>
	
	
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, то при створенні ви побачите новий метабокс із нашим вмістом.

Додавання метабоксів з використанням класу

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

Опис класу:

"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; ?>

options as $option ) { if (current_user_can( $option[‘cap’], $post->ID )) { ?>

 

 

 

 

 

prefix . $option[‘name’] . ‘» id=»‘ . $this->prefix . $option[‘name’] . ‘»‘; if ( get_post_meta( $post->ID, $this->prefix . $option[‘name’], true ) == «on» ) echo ‘ checked=»checked»‘; echo ‘» style=»width: auto;» />’; echo ‘‘; break; } case «select»: { echo ‘

 

 

 

 

 

‘ . $option[ ‘description’ ] . ‘

‘; echo ‘

 

‘; break; } default: { // за замовчуванням type=»text» echo ‘

‘ . $option[ ‘description’ ] . ‘

‘; echo ‘‘; break; } } ?>

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' ] );
					}
				}
			}
		}
	}
}

Створення об’єкту класу:

if (class_exists('trueMetaBoxes')) {
	$id = 'seodiv'; // id метабокса
	$title = 'Доп. Налаштування'; // заголовок
	$obj = new trueMetaBoxes($id, $title);	 
}

Стільки коду … Напрошується питання — навіщо це все? Начебто попередній спосіб був простішим.

Досить один раз докладно описати клас і після цього створювати скільки завгодно об’єктів (це і будуть метабокси), лише змінюйте параметри, що передаються йому, в тому числі і масив $options, не доведеться писати купу HTML-коду, все буде вставлятися за шаблоном. Змінні, які не використовуються конструктором, можна буде поміняти вже після створення об’єкта, наприклад:

// тобто. кожному об'єкту можна присвоїти свої власні $prefix та $options
$obj->prefix = '_seo_';
$obj->options[0]['title'] = 'Типу новий лейбл першого поля у метабоксі';

Звернення до метаданих (довільних полів) посту / сторінки

get_post_meta($post_id, $key, $single);

$post_id (ціле) (обов’язкове) – ID посту або сторінки.
$key (строка) (обов’язкове) – значення довільного поля.
$single (логічне) – якщо true – повертає строку, false – масив, за замовчуванням – false.

Останній приклад для виведення вмісту метабоксу у шаблоні:

/*
 * $obj->prefix я взяв із попереднього прикладу,
 * можна також вказати префікс самому:
 * get_post_meta($post->ID, '_seo_title', true);
 */
$title = '';
$title .= get_post_meta($post->ID, $obj->prefix.'title', true);
$title .='';

Ще хотів би підкреслити що дані які записувалися в метабокс зберігатися в «Довільних полях», а те що я вказав вгорі це виведення тих самих довільних полів.


Купить хостинг WordPress
/* Репетитор по wordpress
Услуги репетитора онлайн. Список курсов которые я веду
  • Базовый курс по веб-дизайну;
  • Верстка сайтов;
  • Общий курс по CMS WordPress и продолжение курса по разработке шаблонов;
  • Разработка сайтов на PHP.
Подробнее читайте на странице репетитор по WordPress
*/

Николаенко Максим

Директор веб-студии ProGrafika. Занимаюсь разработкой, дизайном и продвижением веб-сайтов. Всегда рад новым читателям блога и хорошим клиентам.


Вам может также понравиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Шаблоны для WordPress
Самый лучший хостинг в Украине
Стабильный хостинг для Drupal