FL.ru – фриланс сайт удаленной работы №1. Поиск удаленной работы, фрилансеры.

Гид по пользовательским типам постинга в WordPress: таксономии, колонки в панели администратора, фильтры и архивы

Категории: WordPress

Перед тем как приступить к данной статье, я настоятельно рекомендую вам изучить тему Custom Post Types – пользовательские данные в post_type – пользовательский тип постинга. В этой статье мы еще больше узнаем об этой прекрасной возможности WordPress.

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

Пользовательская таксономия для CPT

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

Шаг 1: Регистрация пользовательской функции

Откройте файл с плагином, в нашем случае это movie-revews.php, и добавим следующий код, который отвечает за регистрацию функции.

1
add_action( 'init', 'create_my_taxonomies', 0 );

Шаг 2: Выполнение пользовательской функции и регистрация пользовательской таксономии

1
2
3
4
5
6
7
8
9
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‘. ‘Labels’ определяет порядок различных цепочек, которые используются в таксономии администраторского раздела.

1
2
3
'show_ui' => true включает редактор таксономии в панели администратора.'show_tagcloud' => false определяет видимость облака тегов. В нашем случае оно отключено.'hierarchical' => true определяет формат пользовательской таксономии.

Обратите внимание: 'hierarchical' => false конвертирует категории в теги.

Шаг 3: Вывод пользовательских таксономий

Сохранив изменения в файле Movie-Reviews.php, откройте файл пользовательского шаблона, в нашем случае single-movie_reviews.php и добавьте выделенный код, который и будет отвечать за вывод категорий в постах:

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
< ?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 обзор фильмов. Теперь мы легко можем добавлять новые категории из панели администратора и приписывать их к тому или иному CPT.

taksonomija wordpress

taksonomija wordpress

taksonomija wordpress

Вывод дополнительных колонок

В WordPress у администратора есть список всех CPT, по умолчанию там всего две колонки с датой и комментариями. Именно по этим параметрам можно сортировать эти CPT. Для того, чтобы добавить дополнительные колонки, а вместе с ними и дополнительные возможности фильтрации, выполните следующее.

Шаг 1: регистрация функции

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

1
add_filter( 'manage_edit-movie_reviews_columns', 'my_columns' );

Здесь мы использовали переменный фильтр anage_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;
}

Мы добавили две колонки Director и Rating (Режиссер и рейтинг) для отображения в панели администратора, и также удалили колонку Комментарии.

Шаг 3: Заполнение колонок




Регистрируем функцию для заполнения колонок

1
add_action( 'manage_posts_custom_column', 'populate_columns' );

Шаг 4: Выполнение

1
2
3
4
5
6
7
8
9
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 . ' stars';
    }
}

Так как функция выполняется при каждом обращении к колонкам 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
function sort_me( $columns ) {
    $columns['movie_reviews_director'] = 'movie_reviews_director';
    $columns['movie_reviews_rating'] = 'movie_reviews_rating';
    return $columns;
}

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

Шаг 7: Порядок по пользовательскому полю

1
2
3
4
5
6
7
8
9
10
11
12
13
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). Поэтому мы должны научить движок делать это при помощи данной функции.

Как помните, мы уже добавили две колонки в панель администратора, и эти колонки готовы к сортировке.

taksonomija wordpress

Создание фильтров с пользовательскими таксономиями

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

Шаг 1: Регистрация функции

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

1
add_action( 'restrict_manage_posts', 'my_filter_list' );

Шаг 2: Выполнение функции

1
2
3
4
5
6
7
8
9
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 получает объект запроса текущего поста и затем стартует, используя в качестве указателей отсортированные переменные запроса. Затем он проверяет, является ли “Жанр” частью переменных запроса и затем выполняет запрос.

Теперь вы можете использовать фильтр и выводить фильмы по их жанрам.

taksonomija wordpress

И последнее, но не менее значимое – создание архивной страницы

Мы смогли создать пользовательский шаблон для нашего CPT, точно также мы можем создать и пользовательский архив, если стандартный нам не подходит.

Шаг 1: Добавление сведений о новом шаблоне архива

Откройте файл плагина Movie-Reviews.php и добавьте выделенный код в функцию include_template_function.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 и добавьте в него следующий код:

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
< ?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">&larr; Older reviews'); ?></div>
                <div class="nav-next">< ?php previous_posts_link( 'Newer reviews <span class= "meta-nav">&rarr;' ); ?></div>
            </nav>
        < ?php };
    endif; ?>
    </div>
</section>
<br /><br />
< ?php get_footer(); ?>

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

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

Шаг 3: Результаты

Сохраните файл и проверьте, есть ли на странице-архиве обзоры фильмов.

taksonomija wordpress

Вот мы и подошли к концу данной инструкции. Надеюсь, что вы оценили всю важность CPT (пользовательских типов постинга). Открыть еще предстоит многое, стоит только “поиграть>” с кодом.

Спасибо за внимание и не забывайте, что комментарии открыты для вас.




Подпишитесь на рассылку блога
max1net.com:
Уже подписались человек
Укажите свой e-mail