Прежде чем углубиться в этот учебник, пожалуйста, пройдите мой первый учебник по пользовательским типам постов , где я объяснил некоторые важные аспекты CPT (пользовательских типов постов). В этом уроке мы узнаем больше об этой замечательной функции в WordPress.
В этом руководстве рассказывается, как создавать собственные таксономии, столбцы администратора, фильтры таксономии и страницу архива для вашего CPT. Итак, начнем.
Пользовательская таксономия для пользовательских типов записей
Таксономии — отличный способ сгруппировать вещи и помочь нам искать сообщения, принадлежащие определенной группе. В WordPress мы обычно используем категории и теги в качестве таксономий. Приведенные ниже шаги объясняют, как создавать собственные таксономии для вашего CPT.
Шаг 1: зарегистрировать пользовательскую функцию
Откройте файл плагина, в нашем случае Movie-Reviews.php, и добавьте следующий код для регистрации пользовательской функции.
1
|
add_action( ‘init’, ‘create_my_taxonomies’, 0 );
|
Шаг 2: Реализация пользовательской функции и регистрация пользовательской таксономии
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
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
)
);
}
|
Здесь функция register_taxonomy
выполняет всю тяжелую работу по созданию пользовательской таксономии (в нашем случае категории) с именем ‘ movie_reviews_movie_genre
‘ для пользовательского типа записи ‘ movie_reviews
‘. Метки определяют различные строки, используемые в разделе администрирования таксономии.
-
'show_ui' => true
используется для'show_ui' => true
редактора таксономии на панели инструментов. -
'show_tagcloud' => false
декодировать, должно ли быть видно облако тегов. В нашем случае это отключено. -
'hierarchical' => true
декодирует формат пользовательской таксономии.
Примечание: 'hierarchical' => false
преобразует категории в теги.
Шаг 3: Отображение пользовательских таксономий
После сохранения файла Movie-Reviews.php откройте файл пользовательского шаблона, в нашем случае single-movie_reviews.php, и добавьте следующий выделенный код, чтобы категории были видны в наших сообщениях.
01
02
03
04
05
06
07
08
09
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
|
<?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();
<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: Результат
Здесь мы добавили пользовательскую таксономию «Жанр фильма» в наши обзоры фильмов CPT. Теперь мы сможем добавлять новые категории из панели администратора и назначать каждую из них нашему CPT.
Отображение дополнительных столбцов
На странице списка CPT для администратора WordPress по умолчанию существуют два столбца — «Дата» и «Комментарии», по которым мы можем отсортировать эти элементы CPT. Чтобы добавить дополнительные столбцы и сортировку, выполните следующие действия.
Шаг 1: зарегистрировать функцию
Откройте файл плагина Movie-Reviews.php и добавьте следующую строку кода, чтобы зарегистрировать функцию, которая будет вызываться при подготовке страницы со списком обзоров фильмов.
1
|
add_filter( ‘manage_edit-movie_reviews_columns’, ‘my_columns’ );
|
Здесь мы использовали переменную filter manage_edit-(Custom_Post_Type)_columns
, которая передает список столбцов CPT в качестве аргумента функции.
Шаг 2: Реализация функции
1
2
3
4
5
6
|
function my_columns( $columns ) {
$columns[‘movie_reviews_director’] = ‘Director’;
$columns[‘movie_reviews_rating’] = ‘Rating’;
unset( $columns[‘comments’] );
return $columns;
}
|
Здесь мы добавили два столбца: Директор и Рейтинг в административной панели CPT, а также удалили столбец Комментарии из списка.
Шаг 3: Заполнение столбцов
Зарегистрируйте функцию для заполнения столбцов.
1
|
add_action( ‘manage_posts_custom_column’, ‘populate_columns’ );
|
Шаг 4: Реализация
01
02
03
04
05
06
07
08
09
10
|
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 .
}
}
|
Здесь, поскольку функция выполняется при отображении любого из столбцов CPT, она проверяет наличие запрашиваемых в данный момент столбцов перед их отображением. Мы использовали get_the_ID()
для извлечения индекса текущей строки, а затем, в свою очередь, использовали get_post_meta
для извлечения данных в столбце.
Шаг 5: Зарегистрируйте столбцы как сортируемые
Теперь давайте зарегистрируем функцию, которая будет вызываться, когда WordPress идентифицирует сортируемые столбцы в CPT.
1
|
add_filter( ‘manage_edit-movie_reviews_sortable_columns’, ‘sort_me’ );
|
Шаг 6: Реализация
1
2
3
4
5
6
|
function sort_me( $columns ) {
$columns[‘movie_reviews_director’] = ‘movie_reviews_director’;
$columns[‘movie_reviews_rating’] = ‘movie_reviews_rating’;
return $columns;
}
|
Эта функция идентифицирует два столбца, чтобы сделать их сортируемыми, а затем возвращает массив. Но наша работа еще не закончена.
Шаг 7: Заказ по пользовательскому полю
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
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 не знает, как упорядочить по полям «Movie Director» или «Movie Rating», поэтому нам нужно научить WordPress, как это делать с помощью этой функции.
Мы успешно добавили два сортируемых столбца в разделе администратора.
Создание фильтров с пользовательской таксономией
Здесь мы увидим, как пользовательские таксономии (в данном случае категории) могут использоваться в качестве дополнительного фильтра на странице списка CPT в администраторе WordPress, чтобы администраторы могли отображать элементы CPT, принадлежащие определенной категории.
Шаг 1: зарегистрируйте функцию
Откройте файл плагина и добавьте следующий код, чтобы зарегистрировать функцию, которая будет вызываться, когда WordPress готовится отобразить раскрывающийся список фильтра.
1
|
add_action( ‘restrict_manage_posts’, ‘my_filter_list’ );
|
Шаг 2: Реализация функции
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
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
», « depth
» и т. Д. Являются различными аргументами, определяющими сортировку, показывают количество элементов в каждой категории, скрывают несвязанные категории, определяют максимальную глубину, которая должна отображаться для иерархических категорий соответственно.
Шаг 3: Показать отфильтрованные результаты
Теперь, после того как выпадающий список фильтра подготовлен, мы напишем некоторый код для отображения отфильтрованных результатов. Зарегистрируйте функцию, которая будет вызываться при подготовке запроса на пост-показ.
1
|
add_filter( ‘parse_query’,’perform_filtering’ );
|
Шаг 4: Реализация функции отображения
1
2
3
4
5
6
7
|
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, а затем начинает его с получения указателя на переменные запроса, хранящиеся в объекте запроса. Затем он проверяет, является ли жанр фильма частью переменных запроса, а затем выполняет запрос.
Теперь вы сможете использовать фильтр для отображения фильмов по жанрам.
Последнее, но не меньшее: создайте страницу архива
Поскольку мы создали собственный шаблон для нашего CPT, мы также можем создать собственную страницу архива, переопределяющую шаблон архива по умолчанию.
Шаг 1. Добавление запасного варианта в шаблон архива
Откройте файл плагина Movie-Reviews.php и добавьте выделенный код в функцию include_template_function
.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
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__ ) .
}
}
elseif ( is_archive() ) {
if ( $theme_file = locate_template( array ( ‘archive-movie_reviews.php’ ) ) ) {
$template_path = $theme_file;
} else { $template_path = plugin_dir_path( __FILE__ ) .
}
}
}
return $template_path;
}
|
WordPress ищет в каталоге темы файл шаблона архива, прежде чем использовать файл по умолчанию. Эта функция проверяет, предоставил ли пользователь шаблон архива в каталоге темы, иначе он ищет файл в папке плагина.
Шаг 2: Создайте шаблон архива
Сохраните и закройте файл плагина, а затем создайте новый файл с именем archive-movie_reviews.php и добавьте в него следующий код.
01
02
03
04
05
06
07
08
09
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
|
<?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();
<td><?php echo esc_html( get_post_meta( get_the_ID(), ‘movie_director’, true ) );
</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»>←
<div class=»nav-next»><?php previous_posts_link( ‘Newer reviews <span class= «meta-nav»>→
</nav>
<?php };
endif;
</div>
</section>
<br /><br />
<?php get_footer();
|
Здесь мы использовали цикл, чтобы циклически проходить записи записей и затем отображать их, используя макет таблицы. Мы также определили меню навигации, если в настройках WordPress больше элементов, чем их максимальное количество. Меню навигации отображается с использованием next_post_links
и previous_post_links
.
Мы использовали глобальный объект wp_query
содержащий данные о выполняемом в данный момент запросе, для визуализации содержимого страницы. Функция get_post_meta
была использована для получения данных пользовательских полей.
Шаг 3: Результат
Сохраните файл и проверьте страницу архива для списка архива Обзоры фильмов.
Здесь мы подошли к концу этого урока. Я надеюсь, что вы смогли понять значение пользовательских типов сообщений. Есть больше, чтобы исследовать, просто поиграйте с этим.
Спасибо за чтение и не стесняйтесь оставить свой отзыв.