Статьи

Добавление функциональности Post Series в WordPress с таксономиями

Вы когда-нибудь писали «серию постов» в своем блоге? Если вы это сделали, вам, вероятно, нужно было добавить ссылки на другие части серии в последний пост, который вы написали. Каждый раз, когда вы заканчивали новую часть, вам приходилось обновлять список ссылок других частей. Должен быть более легкий путь, верно?

Есть. В этой статье мы узнаем, как создать функциональность «после серии», используя таксономии и шорткоды.

Статья содержит 3 части:

  • Создание таксономии
  • Создание шорткода
  • Добавление таксономий и использование шорткода

Я объясню почти каждую строку кода, чтобы вы могли разработать ее так, как вам нравится.


Это едва ли считается шагом: мы просто создадим файл плагина и заполним детали плагина:

01
02
03
04
05
06
07
08
09
10
<?php
/*
Plugin Name: Post Series
Plugin URI: http://wp.tutsplus.com/tutorials/plugins/adding-post-series-functionality-to-wordpress-with-taxonomies/
Description: Adds the «post series» functionality to WordPress with the help of a taxonomy and a shortcode.
Version: 1.0
Author: Barış Ünver
Author URI: http://beyn.org/
*/
?>

Сохраните этот небольшой кусок кода в файле post-series.php или под любым именем, которое вам нравится, в папку / wp-content / plugins / post-series / .


WordPress обладает не совсем новыми функциями для создания «таксономий», поэтому мы можем создавать больше видов «классификационных групп», таких как теги или категории (которые являются встроенными таксономиями WordPress). Мы собираемся создать новую таксономию под названием «Серия», и мы будем использовать эту новую таксономию в нашей серии статей, чтобы помочь нам.

Во-первых, нам нужно создать функцию для регистрации таксономии. Давайте назовем это series_tax :

1
2
3
4
function series_tax() {
    /* Creating an empty function LIKE A BOSS */
}
add_action(‘init’, ‘series_tax’, 0);

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

Далее мы будем использовать встроенную функцию register_taxonomy() для создания нашей таксономии. Но перед этим мы должны установить «ярлыки» таксономии:

01
02
03
04
05
06
07
08
09
10
11
12
13
function series_tax() {
    $labels = array(
        ‘name’ => _x(‘Series’, ‘taxonomy general name’),
        ‘singular_name’ => _x(‘Series’, ‘taxonomy singular name’),
        ‘all_items’ => __(‘All Series’),
        ‘edit_item’ => __(‘Edit Series’),
        ‘update_item’ => __(‘Update Series’),
        ‘add_new_item’ => __(‘Add New Series’),
        ‘new_item_name’ => __(‘New Series Name’),
        ‘menu_name’ => __(‘Series’)
    );
}
add_action(‘init’, ‘series_tax’, 0);

Мы не использовали все метки — Вы можете найти полный список меток таксономии в нашей статье « Вывод пользовательских таксономий WordPress на новый уровень» .

Мы можем зарегистрировать таксономию сейчас:

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
// create the «Series» taxonomy for posts only
function series_tax() {
    $labels = array(
        ‘name’ => _x(‘Series’, ‘taxonomy general name’),
        ‘singular_name’ => _x(‘Series’, ‘taxonomy singular name’),
        ‘all_items’ => __(‘All Series’),
        ‘edit_item’ => __(‘Edit Series’),
        ‘update_item’ => __(‘Update Series’),
        ‘add_new_item’ => __(‘Add New Series’),
        ‘new_item_name’ => __(‘New Series Name’),
        ‘menu_name’ => __(‘Series’)
    );
 
    register_taxonomy(
        ‘series’,
        array(‘post’), /* if you want to use pages or custom post types, simply extend the array like array(‘post’,’page’,’custom-post-type’) */
        array(
            ‘hierarchical’ => true, /* if set to «true», you can use Series as categories;
            ‘labels’ => $labels,
            ‘show_ui’ => true,
            ‘query_var’ => true,
            ‘rewrite’ => array(‘slug’ => ‘series’), /* you may need to flush the rewrite rules at Options -> Permalinks (just update the existing preferences without any change) */
        )
    );
}
add_action(‘init’, ‘series_tax’, 0);

Поздравляем, вы только что создали первую половину своего плагина! Теперь перейдем ко второй половине …


На этом шаге мы собираемся создать шорткод [series] . С помощью этого шорткода мы сможем вставить список сообщений серии. Мы также сможем настроить шорткод с помощью некоторых атрибутов, таких как « title », « title_wrap », « slug », « id », « list », « limit » и « future », которые будут необязательными.

Давайте начнем с создания нашей функции:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
function series_sc($atts) {
    extract(
        shortcode_atts(
            array(
                «slug» => »,
                «id» => »,
                «title» => »,
                «title_wrap» => ‘h3’,
                «list» => ‘ul’,
                «limit» => -1,
                «future» => ‘on’
            ),
            $atts
        )
    );
}
add_shortcode(‘series’,’series_sc’);

Теперь у нас есть пустой шорткод с 7 необязательными атрибутами! Мы узнаем их во время написания остальной части кода, но я должен объяснить их сейчас:

  • slug — слизень серии, по умолчанию ничего
  • id — идентификатор серии, по умолчанию ничего
  • title — заголовок вывода, по умолчанию ничего
  • title_wrap — HTML-тег для title_wrap заголовка, по умолчанию « h3 »
  • list — HTML-тег, чтобы обернуть список сообщений, по умолчанию » ul «
  • limit — максимальное количество постов, по умолчанию -1 (все посты)
  • future — опция, включающая будущие посты или нет, по умолчанию включена

Далее мы закодируем часть «найди правильную таксономию»:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
if ($id) {
    // Use the «id» attribute if it exists
    $tax_query = array(array(‘taxonomy’ => ‘series’, ‘field’ => ‘id’, ‘terms’ => $id));
}
elseif ($slug) {
    // Use the «slug» attribute if «id» does not exist
    $tax_query = array(array(‘taxonomy’ => ‘series’, ‘field’ => ‘slug’, ‘terms’ => $slug));
}
else {
    // Use posts own Series tax if neither «id» nor «slug» exist
    $terms = get_the_terms($post->ID,’series’);
    if ($terms && !is_wp_error($terms)) {
        $tax_query = array(array(‘taxonomy’ => ‘series’, ‘field’ => ‘slug’, ‘terms’ => $term[0]->slug));
    }
    else {
        $error = true;
    }
}

« slug » и « id » работают совместно, но оба они необязательны: шорткод сначала будет искать « slug », затем будет искать « id ». Если нет слага и идентификатора, шорткод попытается получить таксономию «серии» поста, содержащего шорткод.

Теперь давайте закодируем часть «создать заголовок (если он указан)»:

1
2
3
4
if ($title) {
    // Create the title if the «title» attribute exists
    $title_output = ‘<‘.$title_wrap.’
}

Заголовок не будет, если не указан атрибут title . Будет заголовок с <h3> если не указан атрибут title_wrap . Вы должны изменить атрибут по умолчанию на что-то другое (например, <h4> ), если вы используете что-то еще в качестве подзаголовков.

Давайте перейдем к части «Показать будущие посты или нет» сейчас:

1
2
3
4
5
6
7
8
if ($future == ‘on’) {
    // Include the future posts if the «future» attribute is set to «on»
    $post_status = array(‘publish’,’future’);
}
else {
    // Exclude the future posts if the «future» attribute is set to «off»
    $post_status = ‘publish’;
}

Я настоятельно рекомендую оставить атрибут » future » включенным «, но если вы не хотите перечислять заголовки ваших будущих сообщений (не черновиков), вы можете установить для него значение» off «.

Хорошо, мы закончили кодирование частей атрибута (кроме « limit »). Теперь мы можем перейти к той части, где мы получаем сообщения:

1
2
3
4
5
6
7
8
9
if ($error == false) { /* We are going to close this later */
    $args = array(
        ‘tax_query’ => $tax_query,
        ‘posts_per_page’ => $limit,
        ‘orderby’ => ‘date’,
        ‘order’ => ‘ASC’,
        ‘post_status’ => $post_status
    );
    $the_posts = get_posts($args);
  • tax_query « tax_query » определяется переменной $tax_query которую мы создали минуту назад в части «найти правильную таксономию».
  • posts_per_page определяется атрибутом limit в шорткоде.
  • Аргументы ‘ orderby ‘ и ‘ order ‘ определены для того, чтобы посты были перечислены в хронологическом порядке — самые новые посты будут внизу списка.
  • post_statuspost_status ‘ определяется переменной $post_status которую мы также создали выше, в части «показать будущие сообщения или нет».

Теперь мы закончили с извлечением сообщений, мы можем собрать все вместе и создать список сообщений!

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    /* if there is more than one post with the specified «series» taxonomy, display the list.
    if (count($the_posts) > 1) {
        // display the title first
        $output = $title_output;
        // create the list tag — notice the «post-series-list» class
        $output .= ‘<‘.$list.’
        // the loop to list the posts
        foreach ($the_posts as $post) {
            setup_postdata($post);
            if ($post->post_status == ‘publish’) {
                $output .= ‘<li><a href=»‘.get_permalink($post->ID).'»>’.get_the_title($post->ID).'</a></li>’;
            }
            else {
                /* we can not link the post if the post is not published yet!
                $output .= ‘<li>Future post: ‘.get_the_title($post->ID).'</li>’;
            }
        }
        wp_reset_query();
        // close the list tag…
        $output .= ‘</’.$list.’>’;
        // …and return the whole output!
        return $output;
    }
} /* Remember the «if» we did not close?

И окончательный код функции нашего шорткода будет выглядеть так:

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// The shortcode function of Post Series
function series_sc($atts) {
    extract(
        shortcode_atts(
            array(
                «slug» => »,
                «id» => »,
                «title» => »,
                «title_wrap» => ‘h3’,
                «list» => ‘ul’,
                «limit» => -1,
                «future» => ‘on’
            ),
            $atts
        )
    );
    if ($id) {
        // Use the «id» attribute if it exists
        $tax_query = array(array(‘taxonomy’ => ‘series’, ‘field’ => ‘id’, ‘terms’ => $id));
    }
    elseif ($slug) {
        // Use the «slug» attribute if «id» does not exist
        $tax_query = array(array(‘taxonomy’ => ‘series’, ‘field’ => ‘slug’, ‘terms’ => $slug));
    }
    else {
        // Use posts own Series tax if neither «id» nor «slug» exist
        $terms = get_the_terms($post->ID,’series’);
        if ($terms && !is_wp_error($terms)) {
            $tax_query = array(array(‘taxonomy’ => ‘series’, ‘field’ => ‘slug’, ‘terms’ => $term[0]->slug));
        }
        else {
            $error = true;
        }
    }
    if ($title) {
        // Create the title if the «title» attribute exists
        $title_output = ‘<‘.$title_wrap.’
    }
    if ($future == ‘on’) {
        // Include the future posts if the «future» attribute is set to «on»
        $post_status = array(‘publish’,’future’);
    }
    else {
        // Exclude the future posts if the «future» attribute is set to «off»
        $post_status = ‘publish’;
    }
    if ($error == false) {
        $args = array(
            ‘tax_query’ => $tax_query,
            ‘posts_per_page’ => $limit,
            ‘orderby’ => ‘date’,
            ‘order’ => ‘ASC’,
            ‘post_status’ => $post_status
        );
        $the_posts = get_posts($args);
        /* if there is more than one post with the specified «series» taxonomy, display the list.
        if (count($the_posts) > 1) {
            // display the title first
            $output = $title_output;
            // create the list tag — notice the «post-series-list» class
            $output .= ‘<‘.$list.’
            // the loop to list the posts
            foreach ($the_posts as $post) {
                setup_postdata($post);
                if ($post->post_status == ‘publish’) {
                    $output .= ‘<li><a href=»‘.get_permalink($post->ID).'»>’.get_the_title($post->ID).'</a></li>’;
                }
                else {
                    /* we can not link the post if the post is not published yet!
                    $output .= ‘<li>Future post: ‘.get_the_title($post->ID).'</li>’;
                }
            }
            wp_reset_query();
            // close the list tag…
            $output .= ‘</’.$list.’>’;
            // …and return the whole output!
            return $output;
        }
    }
}
add_shortcode(‘series’,’series_sc’);

Использование довольно просто:

  1. Создайте свою «серию» на странице «Сообщения» (как будто вы создаете новые категории),
  2. Присвойте свои посты этим «сериям» во время написания (как будто вы выбираете категории),
  3. Используйте шорткод [series] где хотите!

Вы, наверное, заметили это: вы можете использовать шорткод без каких-либо атрибутов — если вы используете его внутри постов вашей серии:

[series]

Но если вы хотите включить серию в страницы или в сообщение, которое не относится к включаемой серии, вы можете использовать атрибуты » slug » или » id «:

[series slug="wordpress-themes"]
[series id="146"]

Наконец, вы можете ограничить количество отображаемых сообщений, вы можете установить заголовок и его заголовок, вы можете изменить список на упорядоченный (нумерованный) список и запретить показ будущих сообщений:

[series title="More WordPress Theme Lists" title_wrap="h4" limit="5" list="ol" future="off"]

Я не хочу вставлять сюда более 100 строк полного исходного кода (учебник уже длинный), но вы можете скачать плагин, который мы создали здесь . Надеюсь, вам понравится!