WordPress створений для кастомізації. Він був створений таким чином, що кожну його частину можна налаштувати. У цьому посібнику ми розповімо про одну з найпотужніших можливостей WordPress, відому як типи записів користувача, і про те, як WordPress досяг висот з появою цієї чудової можливості.
| Завантажити вихідні |
Що таке Custom Post Types?
Припустимо, ви хочете зробити на вашому блозі окремий розділ для кінорецензій. Використовуючи типи записів, ви можете створити новий тип на кшталт Записи або Сторінки, який міститиме інший набір даних. Він матиме своє меню адміністратора, окремі сторінки редагування, свою таксономію та інші можливості, необхідні для повноцінних публікацій.
Типи користувача записів — новий набір адміністративних налаштувань, які використовуються поряд із стандартними типами, такими як Записи, Сторінки, Прикріплені файли і так далі. Тип користувача записів може зберігати будь-який тип інформації. Він має свій редактор і медіа-завантажувач. Він використовує існуючу структуру таблиць WordPress для простого керування даними. Головна перевага створення типів користувача записів за допомогою API WordPress — це зручне використання з наявними темами та шаблонами. Типи користувача записів також SEO-дружні через свої постійні посилання.
Навіщо використовувати типи записів користувача?
Типи записів користувача допомагають зберігати різні типи записів в різних кошиках. Вони відокремлюють наші звичайні записи від інших. Дуже просто!
Приклад створення плагіна Custom Post Type
Тут ми створимо плагін для виведення записів нового типу, які покажуть наші кінорецензії. Давайте почнемо.
Крок 1. Створюємо папку WordPress плагіна
Відкрийте свою папку з WordPress плагінами та створіть нову під назвою Movie-Reviews.
Крок 2. Створюємо PHP файл
Відкрийте папку та створіть PHP файл під назвою Movie-Reviews.php.
Крок 3. Додаємо шапку
Відкрийте файл та додайте код шапки плагіна.
<?php /* Plugin Name: Movie Reviews Plugin URI: http://wp.tutsplus.com/ Description: Declares a plugin that will create a custom post type displaying movie reviews. Version: 1.0 Author: Soumitra Chakraborty Author URI: http://wp.tutsplus.com/ License: GPLv2 */ ?>
Крок 4. Реєструємо функцію користувача
Перед командою закриття PHP, введіть наступний рядок коду для того, щоб виконувати функцію користувача на ім'я create_movie_review при ініціалізації щоразу, коли сторінка генерується.
add_action( 'init', 'create_movie_review' );
Крок 5. Виконання функції
Виконання функції create_movie_review:
function create_movie_review() { register_post_type( 'movie_reviews', array( 'labels' => array( 'name' => 'Movie Reviews', 'singular_name' => 'Movie Review', 'add_new' => 'Add New', 'add_new_item' => 'Add New Movie Review', 'edit' => 'Edit', 'edit_item' => 'Edit Movie Review', 'new_item' => 'New Movie Review', 'view' => 'View', 'view_item' => 'View Movie Review', 'search_items' => 'Search Movie Reviews', 'not_found' => 'No Movie Reviews found', 'not_found_in_trash' => 'No Movie Reviews found in Trash', 'parent' => 'Parent Movie Review' ), 'public' => true, 'menu_position' => 15, 'supports' => array( 'title', 'editor', 'comments', 'thumbnail', 'custom-fields' ), 'taxonomies' => array( '' ), 'menu_icon' => plugins_url( 'images/image.png', __FILE__ ), 'has_archive' => true ) ); }
Функція register_post_type робить за нас більшість роботи. Як тільки вона викликається, вона готує середовище WordPress до нового користувача типу запису, включаючи різні розділи в адмін. частини.
Ця функція приймає два аргументи: перший - унікальне ім'я типу користувача записів, а другий - масив, який представляє властивості нового типу користувача записів. Ось інший масив, який містить різні мітки, які позначають, які текстові рядки будуть відображатися в різних частинах типу користувача записів, наприклад "ім'я" відображає назву користувача типу записів у консолі, "редагувати"І"видвідображаються відповідно в кнопках Редагувати и вид. Думаю, решта говорить про себе.
аргументи:
- 'public' => true — визначає видимість типу користувача запису і в панелі адміністратора, і в клієнтській частині.
- 'menu_position' => 15 — позначає позицію меню типу користувача запису.
- 'supports' => array( 'title', 'editor', 'comments', 'thumbnail', 'custom-fields' ) — Визначення параметрів користувача типу записів, які будуть відображатися.
- 'taxonomies' => array( ' ' ) - Створює користувальницькі таксономії. Тут їх не визначено.
- 'menu_icon' => plugins_url( 'images/image.png', __FILE__) - Відображає іконку меню адміністратора.
- 'has_archive' => true - Включає архівування користувача типу запису.
На сторінці WordPress Codex про функцію register_post_type ви можете прочитати більше про аргументи, які використовуються в типах користувача запису.
Крок 6. Значок для користувача типу запису
Збережіть іконку розміром 16 16 х точок у папку вашого поточного плагіна. Це необхідно для іконки користувача типу запису в консолі.
Крок 7. Активуємо плагін
Активуйте плагін — і готово, у вас є новий тип записів, у якого є текстовий редактор, управління публікацією і зображеннями, коментарями, а також редактор користувачів полів.
Крок 8. Додавання нового запису
Клацніть на Додати, щоб перейти до редактора користувача типу запису. Напишіть назву фільму, рецензію та мініатюру для запису.
Крок 9. Публікація
Опублікуйте запис і клацніть на View Movie Reviewщоб побачити створену кіно-рецензію.
Створення полів Meta Box для типів користувача записів
Механізм мета-блоків використовує допомогу вбудованої системи мета-блоків WordPress і допомагає додати поля, необхідні для типів записів, без необхідних за замовчуванням полів користувача в редакторі.
Крок 1. Реєстрація користувальницької функції
Відкрийте файл Movie-Reviews.php і додайте наступний код перед тим, що закривається PHP тег. Це реєструє функцію, яка буде викликана, коли відвідати інтерфейс адміністратора WordPress.
add_action( 'admin_init', 'my_admin' );
Крок 2. Виконання функції користувача
Додайте виконання функції my_admin, яка реєструє мета-блоки і пов'язує їх з типом користувача записів movie_reviews.
function my_admin() { add_meta_box( 'movie_review_meta_box', 'Movie Review Details', 'display_movie_review_meta_box', 'movie_reviews', 'normal', 'high' ); }
Тут функція add_meta_box використана для додавання мета-блоків у типи користувача записів.
Атрибути:
- movie_review_meta_box - Необхідний HTML атрибут id.
- Movie Review Details - Текст, видимий у верхній частині мета-блоку.
- display_movie_review_meta_box — зворотний дзвінок, який відображає вміст мета-блоку.
- movie_reviews — це ім'я типу користувача записів, де буде відображатися мета-блок.
- нормальний — визначає частину сторінки, де має бути відображено блок редагування.
- висока — визначає пріоритет у контексті, де відображатимуться блоки.
Крок 3. Виконання функції display_movie_review_meta_box
<?php function display_movie_review_meta_box( $movie_review ) { // Retrieve current name of the Director and Movie Rating based on review ID $movie_director = esc_html( get_post_meta( $movie_review->ID, 'movie_director', true ) ); $movie_rating = intval( get_post_meta( $movie_review->ID, 'movie_rating', true ) ); ?> <table> <tr> <td style="width: 100%">Movie Director</td> <td><input type="text" size="80" name="movie_review_director_name" value="<?php echo $movie_director; ?>" /></td> </tr> <tr> <td style="width: 150px">Movie Rating</td> <td> <select style="width: 100px" name="movie_review_rating"> <?php // Generate all items of drop-down list for ( $rating = 5; $rating >= 1; $rating -- ) { ?> <option value="<?php echo $rating; ?>" <?php echo selected( $rating, $movie_rating ); ?>> <?php echo $rating; ?> stars <?php } ?> </select> </td> </tr> </table> <?php } ?>
Цей код відображає вміст мета-блоку. Тут ми використовували об'єктну змінну, яка містить інформацію про кожну кінорецензію, яка відображається в редакторі. Використовуючи цей об'єкт, ми отримали ID записи та використовували його для запиту до бази, щоб отримати пов'язане ім'я режисера та рейтинг, що призвело до відображення полів на екрані. Коли новий запис додано, get_post_meta повертає порожній рядок, що призводить до відображення порожніх полів у мета-блоці.
Крок 4. Реєстрація функції Зберегти публікацію
add_action( 'save_post', 'add_movie_review_fields', 10, 2 );
Ця функція викликається, коли записи зберігаються у базі даних.
Крок 5. Виклик функції add_movie_review_fields
function add_movie_review_fields( $movie_review_id, $movie_review ) { // Check post type for movie reviews if ( $movie_review-&gt;post_type == 'movie_reviews' ) { // Store data in post meta table if present in post data if ( isset( $_POST['movie_review_director_name'] ) &amp;&amp; $_POST['movie_review_director_name'] != '' ) { update_post_meta( $movie_review_id, 'movie_director', $_POST['movie_review_director_name'] ); } if ( isset( $_POST['movie_review_rating'] ) &amp;&amp; $_POST['movie_review_rating'] != '' ) { update_post_meta( $movie_review_id, 'movie_rating', $_POST['movie_review_rating'] ); } } }
Ця функція виконується, коли записи зберігаються або видаляються з панелі адміністратора. Тут після перевірки типу отриманих даних запису на предмет того, чи є це типом користувача запису, перевіряється, чи були прикріплені значення до елементів мета-блоків, і потім, нарешті, зберігаються значення в ці поля.
Крок 6. Відключення стандартних полів користувача
При створенні користувача типу запису ми визначили функцію create_movie_review. Видаліть елемент custom-fields з масиву опоритому що це більше не потрібно. Зараз якщо ви збережете файл та відкриєте редактор Відгуки фільмів, ви помітите два поля у мета-блоці під назвою Movie Author и Рейтинг фільму. Так само можна додати й інші елементи.
Створення шаблону для користувача типу запису
Правильний спосіб відображення даних користувача типу запису — це використання шаблонів користувача для кожного типу користувача запису. Тут ми повинні створити шаблон, який відображає всі кіно-рецензії, додані з використанням типу користувача запису Огляд фільмів.
Крок 1. Реєструємо функцію для шаблону
Відкрийте файл Movie-Reviews.php та додайте перед тегом закриття PHP наступний код. Він зареєструє функцію виклику, коли буде відвіданий інтерфейс адміністратора WordPress.
add_filter( 'template_include', 'include_template_function', 1 );
Крок 2. Виконання функції
function include_template_function( $template_path ) { if ( get_post_type() == 'movie_reviews' ) { if ( is_single() ) { // checks if the file exists in the theme first, // otherwise serve the file from the plugin if ( $theme_file = locate_template( array ( 'single-movie_reviews.php' ) ) ) { $template_path = $theme_file; } else { $template_path = plugin_dir_path( __FILE__ ) . '/single-movie_reviews.php'; } } } return $template_path; }
Тут код шукає шаблон single-(post-type-name).php у папці поточної теми. Якщо його немає, він шукає в папці плагіна шаблон, який ми надали як частину плагіна. Зачіпка template_include була використана для зміни стандартної поведінки та застосування специфічного шаблону.
Крок 3. Створення файлу шаблону Одна сторінка
Після збереження відкритого файлу плагіна створіть інший PHP файл під назвою single-movie_reviews.php та вставте в нього наступний код.
<?php /*Template Name: New Template */ get_header(); ?> <div id="primary"> <div id="content" role="main"> <?php $mypost = array( 'post_type' => 'movie_reviews', ); $loop = new WP_Query( $mypost ); ?> <?php while ( $loop->have_posts() ) : $loop->the_post();?> <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>> <header class="entry-header"> <!-- Display featured image in right-aligned floating div --> <div style="float: right; margin: 10px"> <?php the_post_thumbnail( array( 100, 100 ) ); ?> </div> <!-- Display Title and Author Name --> <strong>Title: </strong><?php the_title(); ?><br /> <strong>Director: </strong> <?php echo esc_html( get_post_meta( get_the_ID(), 'movie_director', true ) ); ?> <br /> <!-- Display yellow stars based on rating --> <strong>Rating: </strong> <?php $nb_stars = intval( get_post_meta( get_the_ID(), 'movie_rating', true ) ); for ( $star_counter = 1; $star_counter <= 5; $star_counter++ ) { if ( $star_counter <= $nb_stars ) { echo '<img src="' . plugins_url( 'Movie-Reviews/images/icon.png' ) . '" />'; } else { echo '<img src="' . plugins_url( 'Movie-Reviews/images/grey.png' ). '" />'; } } ?> </header> <!-- Display movie review contents --> <div class="entry-content"><?php the_content(); ?></div> </article> <?php endwhile; ?> </div> </div> <?php wp_reset_query(); ?> <?php get_footer(); ?>
Тут ми створили базовий шаблон сторінкиза допомогою циклу. Функція query_posts отримує елементи типу користувача запису і відображає їх, використовуючи цикл. Звичайно, це тільки базовий цикл, і ви можете грати з ним, як вам заманеться. Ви також можете використовувати CSS стилі, щоб форматувати елементи.
Зверніть увагу: Вам потрібно створити нову сторінку з консолі, використовуючи створений шаблон.
Крок 4. Зображення
Вам потрібно зберегти два зображення іконки 32 32 х точок у папці вашого плагіна. Назвіть їх icon.png и grey.png. Все, тепер кінорецензії відображаються на окремій сторінці, відсортовані за датою.
Надалі я опишу більше можливостей власних користувальницьких типів, таких як: створення сторінок архівів, створення таксономій, користувацьких стовпців і так далі.
Коментарі до запису: 25
Давно чекав на подібну статтю, на жаль інформації в рунеті з кастомізації вордепрес не багато. Все це можна продати плагінами. Я використовував:
WCK Post Type Creator — Для створення типів контенту;
Advanced Custom Fields — створення додаткових полів;
CTP View Generator — створення шаблонів виведення контенту;
Перед собою ставив завдання створення каталогу, тому колупав варез — Gravity Forms.
На жаль Gravity Forms не дає можливості публікувати контент у типах користувача, тільки в типах даних post. Якщо хтось допоможе вирішити проблему — буду радий!
Але додаю – реалізувати подібні витівки на wordpress – не найзручніше заняття. Для цих цілей я вибрав modx revo, там зручніше працювати з полями користувача!
Цікаво, але все одно мало.
Поки, судячи з статті та описаного функціоналу, PodsCMS приділяє всі ці самопальні конструкції.
За вашим прикладом створив(почав Створювати) новий тип запису , але натрапив на проблему звані «помилка 404!» Вже навіть скачав ваш приклад через плагін, історія та ж(((
та ж біда :(
Зайдіть до «Налаштування» — «Постійні посилання» та натисніть «Зберегти зміни»
А не підкажіть як вивести на сторінці не список всіх ревью, а тільки одну конкретну знаючи параметр Director
«Зверніть увагу: вам потрібно створити нову сторінку з консолі, використовуючи створений шаблон.»
Ви могли б детальніше розкрити цей момент?
Коли ви створюєте нову сторінку в консолі в редакторі сторінок, у вас справа є віджет, де можна задавати атрибути сторінки в тому числі і шаблон (батьківський або довільний), у списку з'явиться шаблон з ім'ям, який ви створили і помістили у файлах вашої теми оформлення.
Добрий вечір. Прошу допомогти. Ідея така — потрібно додавати в масив більше кіл. слів…є необхідність додати не одне поле користувача, але як це здійснити? дані повинні додаватися в той самий масив, тільки під різними id і по можливості зберігати тільки поля з даними тобто порожні поля відсікаються.
а як створити та вийти на архіви кастомних записів, як організувати пошук за ними?
Добрий день.
Це перекладна стаття? Чи можете дати посилання на джерело?
Внизу статті є посилання на джерело.
Здрастуйте, підкажіть будь ласка. Неможливо вивести архівну сторінку для довільних типів записів. Плагін Types створив новий тип записів і таксономію (категорії), у нового типу записів заголовок affiliate, створив сторінку archive-affiliate.php з вмістом від archive.php але з іншим відображенням записів. Але при переході в категорії нових типів все одно відображається через archive.php, може, є якийсь нюанс? Хоча все за інструкцією роблю, не підкажете?
Теж поки що не вирішено…. (((((
Доброго дня! Підкажіть, будь ласка, як прикріпити «кастомний піст» до звичайних постів. Бачив реалізацію в одному із плагінів, але як зробити це самому так і не знайшов.
Просто хочу зробити архів ігор. Щоб до кожної новини, я міг прикріплювати певну гру, яку виберу. Щоб згодом, виводити основну інформацію гри, у кожній новині.
Здрастуйте, створив я плагін за вашою інструкцією, з ім'я типу прописав video,
тепер усі посилання на пости цього типу мають вигляд site.com/video/bla_bla_bla
Шаблон сторінки відео single-video.php (все ок), але якщо відкрити site.com/video/ то ніякого шаблону не підключається! Навіть створивши сторінку в панелі з аліасом /video/ та вибравши шаблон single-video.php нічого не виводиться… тобто він не підключається! Не можу взагалі перелік постів video вивести! У чому моя помилка? Дякую!
"Крок 3. Створення файлу шаблону Single Page" - це не сингл сторінка, це ти створив шаблон виведення звичайної сторінки з постами твого custom post type. невч!!!
Взагалі, це й мало на увазі. Single.php відповідає за виведення звичайної сторінки, про це йшлося.
За статтю дякую. Але ви не маєте рації.
Single = single, як не дивно.
https://developer.wordpress.org/reference/functions/is_single/
Функція is_single() повертає true — якщо було запитано КОНКРЕТНИЙ post/page/etc.
А що робити їсти wp не бачить category.php, category-36.php і т.д. А використовує index.php
Помилка 404 — Не знайдено — під час перегляду посту виводить… в адмінці все працює.. у чому помилка підкажіть
у мене версія 4.8.2
в базу не закидає як вирішити проблему, де шукати помилку
Всім привіт! Дякую за статтю! Але є біда. У мене все вийшло. Але після збереження білий екран…( Допоможіть будь ласка.
Наша стаття з усунення білого екрану https://hostenko.com/wpcafe/tutorials/ustranyaem-belyiy-ekran-smerti-na-wordpress/