Статьи

Пользовательские типы сообщений WordPress: таксономии, столбцы администратора и фильтры

Прежде чем углубиться в этот учебник, пожалуйста, пройдите мой первый учебник по пользовательским типам постов , где я объяснил некоторые важные аспекты CPT (пользовательских типов постов). В этом уроке мы узнаем больше об этой замечательной функции в WordPress.

В этом руководстве рассказывается, как создавать собственные таксономии, столбцы администратора, фильтры таксономии и страницу архива для вашего CPT. Итак, начнем.


Таксономии — отличный способ сгруппировать вещи и помочь нам искать сообщения, принадлежащие определенной группе. В WordPress мы обычно используем категории и теги в качестве таксономий. Приведенные ниже шаги объясняют, как создавать собственные таксономии для вашего CPT.

Откройте файл плагина, в нашем случае Movie-Reviews.php, и добавьте следующий код для регистрации пользовательской функции.

1
add_action( ‘init’, ‘create_my_taxonomies’, 0 );
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 преобразует категории в теги.

После сохранения файла 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();

Здесь мы добавили пользовательскую таксономию «Жанр фильма» в наши обзоры фильмов CPT. Теперь мы сможем добавлять новые категории из панели администратора и назначать каждую из них нашему CPT.


На странице списка CPT для администратора WordPress по умолчанию существуют два столбца — «Дата» и «Комментарии», по которым мы можем отсортировать эти элементы CPT. Чтобы добавить дополнительные столбцы и сортировку, выполните следующие действия.

Откройте файл плагина Movie-Reviews.php и добавьте следующую строку кода, чтобы зарегистрировать функцию, которая будет вызываться при подготовке страницы со списком обзоров фильмов.

1
add_filter( ‘manage_edit-movie_reviews_columns’, ‘my_columns’ );

Здесь мы использовали переменную filter manage_edit-(Custom_Post_Type)_columns , которая передает список столбцов CPT в качестве аргумента функции.

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, а также удалили столбец Комментарии из списка.

Зарегистрируйте функцию для заполнения столбцов.

1
add_action( ‘manage_posts_custom_column’, ‘populate_columns’ );
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 для извлечения данных в столбце.

Теперь давайте зарегистрируем функцию, которая будет вызываться, когда WordPress идентифицирует сортируемые столбцы в CPT.

1
add_filter( ‘manage_edit-movie_reviews_sortable_columns’, ‘sort_me’ );
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;
}

Эта функция идентифицирует два столбца, чтобы сделать их сортируемыми, а затем возвращает массив. Но наша работа еще не закончена.

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, принадлежащие определенной категории.

Откройте файл плагина и добавьте следующий код, чтобы зарегистрировать функцию, которая будет вызываться, когда WordPress готовится отобразить раскрывающийся список фильтра.

1
add_action( ‘restrict_manage_posts’, ‘my_filter_list’ );
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 » и т. Д. Являются различными аргументами, определяющими сортировку, показывают количество элементов в каждой категории, скрывают несвязанные категории, определяют максимальную глубину, которая должна отображаться для иерархических категорий соответственно.

Теперь, после того как выпадающий список фильтра подготовлен, мы напишем некоторый код для отображения отфильтрованных результатов. Зарегистрируйте функцию, которая будет вызываться при подготовке запроса на пост-показ.

1
add_filter( ‘parse_query’,’perform_filtering’ );
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, мы также можем создать собственную страницу архива, переопределяющую шаблон архива по умолчанию.

Откройте файл плагина 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 ищет в каталоге темы файл шаблона архива, прежде чем использовать файл по умолчанию. Эта функция проверяет, предоставил ли пользователь шаблон архива в каталоге темы, иначе он ищет файл в папке плагина.

Сохраните и закройте файл плагина, а затем создайте новый файл с именем 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»>&larr;
                <div class=»nav-next»><?php previous_posts_link( ‘Newer reviews <span class= «meta-nav»>&rarr;
            </nav>
        <?php };
    endif;
    </div>
</section>
<br /><br />
<?php get_footer();

Здесь мы использовали цикл, чтобы циклически проходить записи записей и затем отображать их, используя макет таблицы. Мы также определили меню навигации, если в настройках WordPress больше элементов, чем их максимальное количество. Меню навигации отображается с использованием next_post_links и previous_post_links .

Мы использовали глобальный объект wp_query содержащий данные о выполняемом в данный момент запросе, для визуализации содержимого страницы. Функция get_post_meta была использована для получения данных пользовательских полей.

Сохраните файл и проверьте страницу архива для списка архива Обзоры фильмов.


Здесь мы подошли к концу этого урока. Я надеюсь, что вы смогли понять значение пользовательских типов сообщений. Есть больше, чтобы исследовать, просто поиграйте с этим.

Спасибо за чтение и не стесняйтесь оставить свой отзыв.