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

18 января 2018

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

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

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

Создание таксономииСоздание shortcodenДобавление таксономии и использование shortcode

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


Шаг 1 Создание файла плагина

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

<?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 плагинов после серии.


Шаг 2 Настройка нашей новой таксономии: «Серии»

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

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

function series_tax() {
    /* Creating an empty function LIKE A BOSS */
}
add_action('init', 'series_tax', 0);
Обратите внимание, что мы также добавили действие, чтобы запустить эту функцию, когда WordPress готов.

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

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 на следующий уровень.

Теперь мы можем зарегистрировать таксономию:

// 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; if set to "false", you can use them as tags! */
            '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);

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


Step 3 Создание короткого кода: [серия]

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

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

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 - пуля из серии, по умолчанию - ничего. - Идентификатор серии, по умолчанию - nothingtitle - заголовок выхода, defaults to nothingtitle_wrap - HTML-тег для обертывания заголовка, по умолчанию - «h3» list - HTML-тег для обертывания списка сообщений, по умолчанию - «ul» limit - Максимальное количество сообщений, по умолчанию -1 (все сообщения) future - опция включения будущих сообщений или нет, по умолчанию - «on»

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

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» работают в сотрудничестве, но они оба необязательны: Shortcode сначала ищет «slug», после чего он будет искать «id». Если нет ни пули, ни идентификатора, короткий код попытается получить таксономию «серии» сообщения, содержащего короткий код.

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

if ($title) {
    // Create the title if the "title" attribute exists
    $title_output = '<'.$title_wrap.' class="post-series-title">'.$title.'</'.$title_wrap.'>';
}

Не будет заголовка, если атрибут «title» не указан. Будет заголовок с тегом

, если атрибут «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';
}

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

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

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);

The 'tax_query' аргумент определяется переменной $ tax_query, которую мы создали всего минуту назад в разделе «найти правильную таксономию». Аргумент «posts_per_page» определяется атрибутом «limit» shortcode«orderby» и аргументы «order» определены для получения хронологически записей, которые будут перечислены в хронологическом порядке. Новейшая запись будет внизу списка. Аргумент post_status определяется переменной $ post_status, которую мы также создали выше, в «отображать будущее» сообщений или нет "part.

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

    /* if there is more than one post with the specified "series" taxonomy, display the list. if there is just one post with the specified taxonomy, there is no need to list the only post! */
    if (count($the_posts) > 1) {
        // display the title first
        $output = $title_output;
        // create the list tag - notice the "post-series-list" class
        $output .= '<'.$list.' class="post-series-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? :) */

И последний код функции нашего короткого кода будет таким:

// 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.' class="post-series-title">'.$title.'</'.$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 there is just one post with the specified taxonomy, there is no need to list the only post! */
        if (count($the_posts) > 1) {
            // display the title first
            $output = $title_output;
            // create the list tag - notice the "post-series-list" class
            $output .= '<'.$list.' class="post-series-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');

Заключение: Примеры использования

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

    Создайте свою «серию» со страницы «Сообщения» (как если бы вы создавали новые категории), nAssign ваши сообщения в эти «серии» во время записи (как будто вы выбираете категории), nВыберите короткий номер [серии], где бы вы ни хотели!

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

[серия]

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

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

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

[series title = "Другие тематические списки WordPress" title_wrap = "h4" limit = "5" list = "ol" future = "off"]

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