Metaboksy w WordPressie
Co to są metaboksy??
Aby nie milczeć, powiem, Co WordPressa istnieją standardowe metaboxy i często ich używasz. Najczęściej widzisz metaboksy”Dyskusja” (Dyskusja) oraz Pola niestandardowe (Dowolne pola). Tych, który od jakiegoś czasu pracuje z WordPressem, wiedz, że możesz wyłączyć i podłączyć standardowe metaboxy w elemencie Opcje ekranu (Ustawienia ekranu).
Podczas tworzenia witryn, używasz wtyczek i wielu to robi Interfejs API Metaboksa. Ta technologia jest często stosowana m.in Pozycjonowanie wtyczki do dodawania pól wejściowych nagłówka, opis i słowa kluczowe. Nawiasem mówiąc, zostało to przetestowane eksperymentalnie, metatag słów kluczowych na stronach w ogóle nie może zostać dodany do problemu, nie zauważyłem, wpływać.
Przykład metaboksu we wtyczkach.
Przed utworzeniem metaboksów, konieczne jest nauczenie się usuwania dodatkowych.
usuń_meta_box() – usunięcie metaboksu.
1 |
remove_meta_box( $id, $page, $context ); |
$strona (termin) - rodzaj postów, na stronie tworzenia / edycja, której potrzebujesz, aby usunąć metabox, Na przykład, Poczta, strona.
$kontekst (termin) - lokalizacja metaboksu, na przykład normalny, zaawansowana strona abo.
Aby funkcja działała, musi być umieszczona w functions.php. Na przykład usuńmy warstwę z nazwiskiem autora autordiv.
1 2 3 4 5 |
function remove_author_div() { remove_meta_box( 'authordiv' , 'post' , 'side' ); // удалим метабокс с рубриками } add_action( 'admin_menu' , 'remove_author_div' ); |
Jeśli wkleisz ten kod, wtedy w Opcja ekranu (ustawienia ekranu) nie będzie wyboru metaboksu autora. Ponadto podczas edytowania artykułu nie zobaczysz tego metaboksu.
Zastanówmy się, jakich innych standardowych metaboksów można użyć do tworzenia wtyczek.
W kodzie można było również znaleźć identyfikatory Metabox, ale jest kilka standardowych, co myślę, ważne jest, aby wymienić. Wymienię cechy standardowych metaboksów.
status komentarza div – ustawienia dyskusji.
dział komentarzy – wyświetla komentarze do aktualnej pozycji.
slugdiv – nagraj skrót.
dział audytu - redaktorzy.
autordiv - autor wpisu.
postcustom - dodatek / edycja dowolnych pól.
postfragment - cytat.
trackbacksdiv – linki zwrotne.
działkategorii – metabox lista nagłówków WordPress.
tagsdiv-post_tag - etykiety.
dział postobrazu – miniatura nagrania.
podział strony nadrzędnej – metabox z wyborem strony nadrzędnej i szablonu strony.
prześlij dział - blok z przyciskiem "opublikuj"..
Dodawanie metaboksów za pomocą typ_post_rejestru()
Dodawanie metaboksów typu register_post_type()
Myślę, że słyszałeś o typach treści w WordPress. Typy standardowe to strony, posty i tyle, które możesz sam stworzyć. Więc oto jest, ta funkcja służy do tworzenia typu materiału. Można w nim od razu określić, które metaboxy będą obsługiwane przez utworzone typy.
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' ); |
Zostanie wyświetlona linia Wsparcie, które metaboxy mają być używane przez nowy typ danych.
1 |
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ) |
Możesz także dodać kategorię i znaczniki dla nowego typu danych za pomocą tablicy taksonomie.
1 |
'taxonomies' => array('category', 'post_tag'), |
Pełny widok kodu dla naszego nowego typu danych:
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' ); |
Metaboksy można również dodawać za pomocą funkcji register_taxonomy_for_object_type()
Funkcja przypisuje taksonomię do żądanego typu rekordu, dodany jest również metaboks:
1 2 3 4 |
$taxonomy = 'post_tag'; // таксономія, у цьому випадку мітки $post_type = 'game'; // тип посту register_taxonomy_for_object_type($taxonomy, $post_type); |
Ta funkcja może być używana, jeśli taksonomia nie musi być najpierw zdefiniowana.
Możliwe jest również dodanie obsługiwanych metaboksów nie od razu podczas wykonywania funkcji register_post_type(), oraz podczas dalszego przetwarzania kodu. Aby dodać obsługę metabox, użyj funkcji add_post_type_support() zamiast tablicy podpór.
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'); |
Dodaj swoje metaboxy add_meta_box()
Możesz dodać absolutnie dowolny niestandardowy metabox, nie ma znaczenia, czy będą to pola do określania metatagów czy uploader obrazków do galerii.
1 |
add_meta_box($id, $title, $callback, $post_type, $context, $priority, $args); |
$ID (termin) (obowiązkowe) – atrybut HTML id dla bloku div przyszłego metaboksu,
$tytuł (termin) (obowiązkowe) - nagłówek,
$Wywołania zwrotnego (funkcjonować) (obowiązkowe) - funkcja, która wypełni metaboks, musisz podać nazwę funkcji jako ciąg znaków,
$typ_postu (termin) (obowiązkowe) – rodzaj ewidencji,
$kontekst (termin) - w której części strony wstawić metabox (normalna, strona, zaawansowane), Domyślna - zaawansowane,
$priorytet (termin) - priorytet, tym wyższy, im bliżej góry strony będzie metaboks, (wysoki, rdzeń, domyślne lub niskie), domyślnie - domyślnie,
$argumenty (szyk) - argumenty dla funkcje zwrotne.
W przeciwieństwie do poprzednich metod, dodanie Twojego metaboksu odbędzie się w kilku etapach, rozważ przykład:
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'); ?> |
Jeśli po wklejeniu kodu spróbujesz utworzyć rekord w naszym nowym typie danych Książki, wtedy po utworzeniu zobaczysz nowy metabox z naszą zawartością.
Dodawanie metaboksów za pomocą klasy
Autor, od którego zerknąłem na część artykułu, obiecał udzielić więcej lekcji na temat tworzenia widżetów, Myślę, że pójdę za nim i sam go poszukam, temat jest naprawdę ciekawy.
Opis klasy:
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; ?> |
opcje jako $opcja ) { jeśli (bieżący_użytkownik_can( $opcja['czapka'], $post->ID )) { ?>
prefiks . $opcja['imię'] . ‘” id=”‘ . $ten->prefiks . $opcja['imię'] . ‘”‘; jeśli ( get_post_meta( $post->ID, $ten->prefiks . $opcja['imię'], prawdziwy ) == „włączone” ) echo ‘ sprawdzone=”sprawdzone”‘; echo „” styl = „szerokość: automatyczny;” />'; Echo '„; połamać ; } przypadek „wybierz”: { Echo '
„ . $opcja[ 'opis' ] . „
„; połamać ; } domyślny: { // typ domyślny = "tekst" echo '
„ . $opcja[ 'opis' ] . „
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); } |
Wystarczy raz szczegółowo opisać klasę, a następnie stworzyć dowolną liczbę obiektów (będą to metaboksy), po prostu zmień ustawienia, które są mu przekazywane, włączając tablicę $options, nie będziesz musiał pisać mnóstwa kodu HTML, wszystko zostanie wstawione zgodnie z szablonem. Zmienne, które nie są używane przez konstruktora, można zmienić po utworzeniu obiektu, Na przykład:
1 2 3 |
// тобто. кожному об'єкту можна присвоїти свої власні $prefix та $options $obj->prefix = '_seo_'; $obj->options[0]['title'] = 'Типу новий лейбл першого поля у метабоксі'; |
Odniesienie do metadanych (dowolne pola) Poczta / strony
1 |
get_post_meta($post_id, $key, $single); |
$post_id (cały) (obowiązkowe) – identyfikator wpisu lub strony.
$.key (termin) (obowiązkowe) – wartość dowolnego pola.
$pojedynczy (logiczny) – jeśli true – zwraca termin, fałsz - tablica, wartość domyślna to fałsz.
Ostatni przykład wyświetlania zawartości metaboksu w szablonie:
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 .=''; |
Chciałbym również podkreślić, że dane zapisane w metaboksie powinny być przechowywane w „Polach dowolnych”, a to, co wskazałem powyżej, to wynik tych samych dowolnych pól.
/*
- Podstawowy kurs projektowania stron internetowych;
- Układ stron;
- Ogólny kurs CMS WordPress oraz kontynuacja kursu dotyczącego tworzenia szablonów;
- Tworzenie stron internetowych w PHP.