Ця стаття - друга частина повного Посібники з кастомних типів записів WordPress. Перш ніж зануритися з головою в читання даного практичного керівництва, пройдіть поглядом по початковому уроку щодо типів публікацій, що налаштовуються. Митний пост Види (Далі скорочено - CPT) для розуміння базових принципів та можливостей.
| Завантажити вихідні |
У цьому ж посібнику ми поговоримо більш докладно про те, які можливості постів, що настроюються, є, і як ці можливості використовувати на благо вашого сайту: настроювана таксономія, адміністрування контенту в стовпцях, таксономічні фільтри та створення архівної сторінки з типом публікацій, що налаштовується — все це зібрано в даному пості. Отже, почнемо.
Налаштовуємо таксономію для власних типів публікацій
Таксономія дозволяє відмінно групувати різні об'єкти і допоможе нам знаходити пости, які відносяться до конкретної групи опублікованих на сайті матеріалів. Зазвичай WordPress використовується для такої систематизації належність записів до Рубрикам або відбір за Міткам. Ми ж створимо таксономію, що настроюється, для своїх CPT.
Крок 1. Реєструємо функцію, що настроюється
Відкриваємо файл плагіна (див. попередній урок, у нашому випадку це Movie-Reviews.php) і додаємо в нього наступний код для реєстрації функції користувача:
add_action( 'init', 'create_my_taxonomies', 0 );
Крок 2. Впроваджуємо нашу функцію і реєструємо таксономію, що настроюється.
function create_my_taxonomies() { register_taxonomy( 'movie_reviews_movie_genre', 'movie_reviews', array( 'labels' => array( 'name' => 'Movie Genre', 'add_new_item' => 'Add New Movie Genre', 'new_item_name' => "New Movie Type Genre" ), 'show_ui' => true, 'show_tagcloud' => false, 'hierarchical' => true ) ); }
Тут функція таксономія_реєстру відповідає за всю важливу роботу щодо створення таксономії, що настроюється (або категорії — як у нашому випадку) з ім'ям 'movie_reviews_movie_genre' для користувача типу постів 'movie_reviews(як приклад нам служить сайт з оглядами та відгуками про кінофільми). Ярлики визначають різні рядки, які використовуються у секції адміністрування таксономії:
- 'show_ui'=> правда використовується для увімкнення редактора таксономії в панелі керування.
- 'show_tagcloud'=> false служить для відключення хмари тегів.
- 'ієрархічна'=> правда відповідає за формат таксономії, що настроюється.
Примітка: 'ієрархічна'=> false відповідає за конверсію рубрик теги.
Крок 3. Відображення таксономії, що настроюється.
Після збереження файлу Movie-Reviews.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 ); ?> <!-- Cycle through all posts --> <?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 top-aligned floating div --> <div style="float: top; 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 /> <strong>Genre: </strong> <?php the_terms( $post->ID, 'movie_reviews_movie_genre' , ' ' ); ?> <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> <hr/> </article> <?php endwhile; ?> </div> </div> <?php wp_reset_query(); ?> <?php get_footer(); ?>
Крок 4. Що вийшло
Ось ми додали таксономію, що настроюється. Movie Genre для наших постів із оглядами кінофільмів. Тепер ми зможемо додавати нові категорії з адмін-панелі та призначати ці категорії для наших CPT.
Відображення додаткових стовпців
На сторінці з адміністрованим списком WordPress CPT за замовчуванням є 2 колонки: Дата и Коментарі, які відповідають за сортування наших записів користувача. Щоб додати інші стовпці і увімкнути сортування для них, виконайте такі кроки.
Крок 1. Реєструємо функцію
Відкрийте файл плагіна Movie-Reviews.php і додайте до нього наступний рядок коду для реєстрації функції, що викликається під час підготовки списку оглядів фільмів:
add_filter( 'manage_edit-movie_reviews_columns', 'my_columns' );
Тут ми застосували змінний фільтр manage_edit-(Custom_Post_Type)_columns, який передає список постів у стовпці як аргумент на нашу функцію.
Крок 2. Впроваджуємо функцію
function my_columns( $columns ) { $columns['movie_reviews_director'] = 'Director'; $columns['movie_reviews_rating'] = 'Rating'; unset( $columns['comments'] ); return $columns; }
Ми додали 2 колонки: Директор и рейтинг. Вони з'являться в адмін-панелі CPT. Також ми видалили стовпчик Коментарі з нашого списку.
Крок 3. Наповнюємо стовпці
Реєструємо функцію наповнення стовпців.
add_action( 'manage_posts_custom_column', 'populate_columns' );
Крок 4. впровадження
function populate_columns( $column ) { if ( 'movie_reviews_director' == $column ) { $movie_director = esc_html( get_post_meta( get_the_ID(), 'movie_director', true ) ); echo $movie_director; } elseif ( 'movie_reviews_rating' == $column ) { $movie_rating = get_post_meta( get_the_ID(), 'movie_rating', true ); echo $movie_rating . ' stars'; } }
Тут функція перевіряє, які із запитаних стовпчиків є, перш ніж звернутися до них. Ми використовували функцію get_the_ID() для визначення поточного ряду і далі для передачі даних в get_post_meta для запиту вмісту із конкретного стовпця.
Крок 5. Реєстрація колонок як сортованих списків
Тепер давайте зареєструємо функцію, яка буде викликатися, коли WordPress ідентифікує стовпці, що сортуються в CPT.
add_filter( 'manage_edit-movie_reviews_sortable_columns', 'sort_me' );
Крок 6. впровадження
function sort_me( $columns ) { $columns['movie_reviews_director'] = 'movie_reviews_director'; $columns['movie_reviews_rating'] = 'movie_reviews_rating'; return $columns; }
Ця функція ідентифікує 2 колонки, які будуть відсортовані, а потім повертає масив даних. Але на цьому етапі роботу ще не завершено.
Крок 7. Впорядковуємо по вибраному полю
add_filter( 'request', 'column_ordering' ); add_filter( 'request', 'column_orderby' ); function column_orderby ( $vars ) { if ( !is_admin() ) return $vars; if ( isset( $vars['orderby'] ) && 'movie_reviews_director' == $vars['orderby'] ) { $vars = array_merge( $vars, array( 'meta_key' => 'movie_director', 'orderby' => 'meta_value' ) ); } elseif ( isset( $vars['orderby'] ) && 'movie_reviews_rating' == $vars['orderby'] ) { $vars = array_merge( $vars, array( 'meta_key' => 'movie_rating', 'orderby' => 'meta_value_num' ) ); } return $vars; }
Наведена вище функція пов'язана з фільтром запитів і додає елементи до масиву запитів на основі змінних, визначених у запитуваному URL. Сам по собі WordPress "не знає", як упорядкувати наші пости згідно з вибіркою полів Режисер або Рейтинг фільмутак що нам доведеться "навчити" наш WordPress, як це зробити. Для цього нам і потрібна дана функція.
Ми успішно додали 2 сортовані колонки у секцію адміністрування:
Створюємо фільтри для таксономії, що настроюється.
Тут ми побачимо, як таксономія, що настроюється (у нашому випадку — це категорії) може бути використана в якості додаткового фільтра при складанні списку CPT у розділі адміністрування WordPress, щоб адміністратори могли відобразити елементи CPT, що належать до конкретної категорії.
Крок 1. Реєстрація функції
Відкрийте файл плагіна та додайте до нього наступний код для реєстрації функції. Ця функція буде викликана, коли WordPress буде готуватися до відображення списку, що випадає, з результатами фільтрації контенту.
add_action( 'restrict_manage_posts', 'my_filter_list' );
Крок 2. Використання функції
function my_filter_list() { $screen = get_current_screen(); global $wp_query; if ( $screen->post_type == 'movie_reviews' ) { wp_dropdown_categories( array( 'show_option_all' => 'Show All Movie Genres', 'taxonomy' => 'movie_reviews_movie_genre', 'name' => 'movie_reviews_movie_genre', 'orderby' => 'name', 'selected' => ( isset( $wp_query->query['movie_reviews_movie_genre'] ) ? $wp_query->query['movie_reviews_movie_genre'] : '' ), 'hierarchical' => false, 'depth' => 3, 'show_count' => false, 'hide_empty' => true, ) ); } }
Ми використовували глобальну змінну, щоб дізнатися, який тип посту відображати, а також використовувати запит до посту для перевірки його на збіг з існуючими фільтрами. Функція wp_dropdown_categories застосовується для відображення всіх типів таксономії, зареєстрованих у розділі Жанри фільмів.
аргументи OrderBy, show_count, Hide_empty, глибина та інші визначають сортування, відображення лічильників числа постів у кожній категорії, приховують не пов'язані з ними категорії, визначають максимальну глибину для відображення в ієрархічній структурі категорій.
Крок 3. Відображення фільтрованих результатів
Після того, як ми сформували фільтрований список, ми напишемо трохи коду для відображення на екрані наших результатів фільтрації. Зареєструємо функцію, яка буде викликатись щоразу при підготовці запиту на відображення результатів фільтрації:
add_filter( 'parse_query','perform_filtering' );
Крок 4. Використання функції відображення контенту
function perform_filtering( $query ) { $qv = &$query->query_vars; if ( ( $qv['movie_reviews_movie_genre'] ) && is_numeric( $qv['movie_reviews_movie_genre'] ) ) { $term = get_term_by( 'id', $qv['movie_reviews_movie_genre'], 'movie_reviews_movie_genre' ); $qv['movie_reviews_movie_genre'] = $term->slug; } }
Функція perform_filtering отримує об'єкт запиту на конкретну посаду від WordPress, а потім перекладає запит і відображає контент відповідно до набору змінних, що містяться в об'єкті. Також на цьому етапі відбувається верифікація того, чи є параметр Movie Genre частиною змінних, що запитуються, і тільки потім відбувається виконання запиту. Тепер ви зможете використовувати фільтр для відображення кінофільмів за жанрами:
Останнє по порядку, але не за значущістю: Створюємо сторінку архіву
Тепер, коли ми створили шаблон для наших CPT, ми можемо також створити сторінку архіву, що настроюється., яка буде відображатись замість сторінки з архівом публікацій, яка є у блозі за замовчуванням.
Крок 1. Створюємо для архіву шлях для переходу та виклику
Відкрийте файл плагіна Movie-Reviews.php та додайте виділений кольором код у функцію include_template_function:
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'; } } elseif ( is_archive() ) { if ( $theme_file = locate_template( array ( 'archive-movie_reviews.php' ) ) ) { $template_path = $theme_file; } else { $template_path = plugin_dir_path( __FILE__ ) . '/archive-movie_reviews.php'; } } } return $template_path; }
WordPress здійснює пошук у папці теми для файлу із шаблоном архіву, перш ніж використовувати сам архів. Ця функція відповідає за перевірку наявності самого шаблону з архівом у папці архівних публікацій. Якщо її немає - то шукає файл архіву в папці з плагінами.
Крок 2. Створюємо шаблон архіву
Збережіть і закрийте файл плагіна, а потім створіть новий файл під назвою archive-movie_reviews.php. Вставте в нього наступний код:
<?php get_header(); ?> <section id="primary"> <div id="content" role="main" style="width: 70%"> <?php if ( have_posts() ) : ?> <header class="page-header"> <h1 class="page-title">Movie Reviews</h1> </header> <table> <!-- Display table headers --> <tr> <th style="width: 200px"><strong>Title</strong></th> <th><strong>Director</strong></th> </tr> <!-- Start the Loop --> <?php while ( have_posts() ) : the_post(); ?> <!-- Display review title and author --> <tr> <td><a href="<?php the_permalink(); ?>"> <?php the_title(); ?></a></td> <td><?php echo esc_html( get_post_meta( get_the_ID(), 'movie_director', true ) ); ?></td> </tr> <?php endwhile; ?> <!-- Display page navigation --> </table> <?php global $wp_query; if ( isset( $wp_query->max_num_pages ) && $wp_query->max_num_pages > 1 ) { ?> <nav id="<?php echo $nav_id; ?>"> <div class="nav-previous"><?php next_posts_link( '<span class="meta-nav">←</span> Older reviews'); ?></div> <div class="nav-next"><?php previous_posts_link( 'Newer reviews <span class= "meta-nav">→</span>' ); ?></div> </nav> <?php }; endif; ?> </div> </section> <br /><br /> <?php get_footer(); ?>
Ми використовуємо тут цикл для того, щоб провести пошук по всіх постах і відобразити їх у формат таблиці. Також ми тут визначили навігаційне меню для того, щоб визначити, чи не більше постів, ніж вказано в налаштуваннях WordPress. Навігаційні меню відображаються завдяки функціям next_post_links и previous_post_links.
Ми також використовували об'єкт wp_query, в якому містяться дані про запит, що виконується в даний момент в порядку рендерингу необхідних елементів і вмісту сторінки. Функція get_post_meta використовувалася для отримання даних з полів, що настроюються.
Крок 3. Що вийшло в результаті
Збережемо наш файл і перевіримо сторінку з архівом публікацій, щоб побачити, чи архівний список оглядів для наших кінофільмів працює на сайті.
Ось ми і завершили "подорож" нашим практичним керівництвом. Сподіваємося, що ми змогли вас переконати у значній ролі та великих можливостях типів записів, що настроюються. Є чимало можливостей для їх практичного застосування, тому радимо вам самим експериментувати з постами, що настроюються. І, як завжди, будемо раді відгукам та думкам у коментарях до цієї публікації.
Коментарі до запису: 8
Дуже пізнавальна стаття, дякую автору! Але ось не зрозумів, як додати в таксономію користувача можливість додавання картинки? Таке взагалі можливе?
Звичайно, можливо.
Використовуйте плагін: ACF http://wordpress.org/plugins/advanced-custom-fields/
І буде Вам щастя =)
Доброго дня, роблю сайт з «нашими роботами», є чотири типи записів, вивести їх вивів, а ось як загнати їх в один пункт адмін-меню, не знаю((((((
Як мені здається, в тексті статті є помилка при створенні списків, що сортуються по колонках в Кроку 7. Упорядковуємо по обраному полю вказаний фільтр add_filter( 'request', 'column_ordering' );
Однак функція column_ordering не визначена ні тут, ні в інших частинах коду WordPress. В результаті приклад не працює і частина записів, що мають рубрики, пропадає.
Так само він не працює і в зарубіжних форумах, де він використовується користувачами.
Хотілося б виправити :)
Доброго дня, підкажіть, як для додаткових таксономій прописати унікальний заголовок, і мета дані такі, як ключові слова та опис. Бажано, щоб це продати без плагінів. У мене встановлений плагін «platinum seo pack» і там є можливість прописати title, але тільки для однієї таксономії, а у мене їх кілька.
Добрий день!
А як зробити так, щоб до каталогу фільмів на довільних типах запису будь-хто міг додавати нові об'єкти-фільми не з адмінки (з фронтенду)?
Чи не показуються пости в категоріях, як воно не правильно в категоріях, де може бути проблема?
Доброго часу доби. Допоможіть будь ласка.
Я за допомогою Toolset створив тип публікацій умовно: "Публікація", до неї створив систематику: "Рубрика Публікацій" і зв'язав їх разом, після чого вивів на сторінці page-public.php у вигляді постів. У «Рубрика Публікацій» є підкатегорії, які я хочу окремо вивести блоками, як це реалізувати? оскільки у мене виводяться усі записи створеної систематики. заздалегідь вдячний