Настройка WordPress Архивы для категорий, теги и другие таксономии

Большинство пользователей WordPress знакомы с тегами и категориями и с тем, как использовать их для организации своих блогов. Если вы используете пользовательские типы постов в WordPress, возможно, потребуется организовать их, как категории и теги. Категории и теги являются примерами таксономии, и WordPress позволяет создавать столько пользовательских таксономий, сколько вы хотите. Эти пользовательские таксономии работают как категории или теги, но являются отдельными.

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

Дальнейшее чтение на SmashingMag:

Терминологии

Прежде чем продолжить, давайте наши термины прямо. Таксономия является тип контента WordPress, используется в первую очередь для организации содержания любого другого типа контента. Две таксономии, с которой все знакомы, построены в: категории и теги. Мы склонны называть индивидуальное размещение тега “тег”, но, если быть точным, мы должны относиться к нему как “термин” в “тег” таксономии. Мы почти всегда ссылаемся на элементы в пользовательской таксономии как “условия”.

Категории и теги представляют два типа таксономий: иерархические и неиерархические. Как и категории, иерархические таксономии могут иметь отношения между родителями и детьми между терминами в таксономии. Например, вы можете иметь в своем блоге категорию “фильмы”, которая имеет несколько категорий детей, с именами, как “иностранные” и “внутренние”. Пользовательские таксономии также могут быть иерархическими, как категории, или неиерархическими, как теги.

wordpress-categories-taxonomies-opt
Небольшая часть “WordPress шаблон иерархии”. (Источник)

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

Как работают архивы тегов, категорий и пользовательской таксономии

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

Первый шаг к настройке заключается в том, чтобы знать, какие файлы в вашей теме используются для отображения архива. Различные темы имеют разные файлы шаблонов, но все темы имеют index.php шаблон. index.phpШаблон используется для отображения всего содержимого, если только шаблон не существует выше в иерархии. Иерархия шаблонов WordPress — это система, которая диктует, какой файл шаблона используется для отображения содержимого. Мы кратко перейдем к иерархии шаблонов для категорий, тегов и пользовательских таксономий. Если вы хотите узнать больше, эти ресурсы настоятельно рекомендуется:

Большинство тем имеют archive.php шаблон, который используется для архивов категорий и тегов, а также архивов дат и авторов. Можно добавить файл шаблона для обработки категорий и тегов архивов отдельно. Эти шаблоны будут названы category.php tag.php или, соответственно. Вы также можете создавать шаблоны для определенных тегов или категорий, используя идентификатор или пулю категории или тега. Например, тег с идентификатором 7 будет tag-7.php использовать, если он существует, а не tag.php archive.php . Тег с пулей “авокадо” будет отображаться с помощью tag-avocado.php шаблона.

Одна хитрая вещь, чтобы иметь в виду, что шаблон, названный в честь пули будет переопределить шаблон, названный в честь идентификационного номера. Таким образом, если тег с пулей “авокадо” был ID 7, то tag-avocado.php будет переопределять tag-7.php , если она существует.

Иерархия шаблонов для пользовательских таксономий немного отличается, потому что есть шаблоны для всех таксономий, для конкретных таксономий и для конкретных терминов в конкретной таксономии. Итак, представьте себе, что у вас есть две таксономии, “фрукты” и “овощи”, и “фрукты” таксономия имеет два термина, “яблоки” и “апельсины”, в то время как “овощи” имеет два термина, “морковь” и “сельдерей”. Давайте добавим три шаблона к теме нашего сайта: taxonomy.php taxonomy-fruits.php , и taxonomy-vegetables-carrots.php .

Для терминов в таксономии “фрукты” все архивы будут создаваться с использованием, taxonomy-fruits.php поскольку не существует шаблона, конкретного термина. С другой стороны, термин “морковь” в “овощных” архивах таксономии будет формироваться с taxonomy-vegetables-carrots.php использованием. Поскольку шаблона не taxonomy-vegetables.php существует, все другие термины в “овощах” будут создаваться с помощью. taxonomy.php

Использование условных тегов

Хотя вы можете добавить любой из пользовательских шаблонов, перечисленных выше, чтобы создать совершенно уникальный вид для любой категории, теги, пользовательские таксономии или пользовательский термин таксономии, иногда все, что вы хотите сделать, это сделать один или два маленьких изменений. В самом деле, старайтесь избегать создания большого количества шаблонов, потому что вам нужно будет настроить каждый из них, когда вы вносите общие изменения в основные HTML разметки, которые вы используете в каждом шаблоне в теме. Если мне не нужен шаблон, который радикально отличается от archive.php темы, я, как правило, придерживаться добавления условных изменений archive.php в .

WordPress предоставляет условные функции, чтобы определить, является ли категория, тег или пользовательские таксономии в настоящее время отображается. Чтобы определить, отображается ли архив категории, можно использовать is_category() для категорий, is_tag() для тегов и is_tax() для пользовательских таксономий. Функции is_tag() и is_category() функции также могут тестировать для определенных категорий или тегов по пуле или ID. Например:


<?php
    if ( is_tag() ) {
        echo "True for any tag!";
    }
    if ( is_tag( 'jedis' ) ) {
        echo "True for the tag whose slug is jedi";
    }
    if ( is_tag( array( 'jedi', 'sith' ) ) ) {
        echo "True for tags whose slug is jedi or sith";
    }
    if ( is_tag( 7 ) ) {
        echo "You can also use tag IDs. This is true for tag ID 7";
    }
?>

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


<?php
    if ( is_tax() ) {
        echo "True for any custom taxonomy.";
    }
    if ( is_tax( 'vegetable' ) ) {
        echo "True for any term in the vegetable taxonomy.";
    }
    if ( is_tax( 'vegetable', 'celery' ) ) {
        echo "True only for the term celery, in the vegetable taxonomy.";
    }
?>

Создание пользовательских таксономий

Добавление пользовательской таксономии может быть сделано одним из трех способов: кодирование его вручную в соответствии с инструкциями в Кодексе, который я не рекомендую; генерации кода с использованием GenerateWP; или использование плагина для пользовательских типов содержимого, таких как стручки или типы. Плагины для пользовательских типов контента позволяют создавать пользовательские таксономии и пользовательские типы постов в задней части WordPress без необходимости писать какой-либо код. Использование одного из них является самым простым способом добавить пользовательские таксономии и получить основу для работы с пользовательскими типами контента.

Если вы выберете один из первых двух вариантов, а не плагин, то вам нужно будет добавить код либо в файл вашей темы functions.php или пользовательский плагин. Я настоятельно рекомендую создать пользовательский плагин, а не добавлять код functions.php в . Даже если вы никогда не создавали плагин раньше, я призываю вас сделать это. При добавлении кода к теме functions.php будет работать, когда вы переключаете темы (скажем, потому что вы хотите использовать новую тему или устранить проблему), таксономия больше не будет работать.

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

Единственная линия, вам нужно создать пользовательский /* Plugin name: Custom Taxonomy */ плагин.

Ниже приведен плагин для регистрации пользовательской таксономии под названием “овощи”, которую я создал с помощью GenerateWP, потому что это значительно проще и способ менее вероятно, содержат ошибки, чем делать это вручную:


<?php
    /* Plugin Name: Veggie Taxonomy */
    if ( ! function_exists( 'slug_veggies_tax' ) ) {

    // Register Custom Taxonomy
    function slug_veggies_tax() {

    $labels = array(
    'name'                          => _x( 'Vegetables', 'Taxonomy General Name', 'text_domain' ),
    'singular_name'                 => _x( 'Vegetable', 'Taxonomy Singular Name', 'text_domain' ),
    'menu_name'                     => __( 'Taxonomy', 'text_domain' ),
    'all_Veggies'                   => __( 'All Veggies', 'text_domain' ),
    'parent_Veggie'                 => __( 'Parent Veggie', 'text_domain' ),
    'parent_Veggie_colon'           => __( 'Parent Veggie:', 'text_domain' ),
    'new_Veggie_name'               => __( 'New Veggie name', 'text_domain' ),
    'add_new_Veggie'                => __( 'Add new Veggie', 'text_domain' ),
    'edit_Veggie'                   => __( 'Edit Veggie', 'text_domain' ),
    'update_Veggie'                 => __( 'Update Veggie', 'text_domain' ),
    'separate_Veggies_with_commas'  => __( 'Separate Veggies with commas', 'text_domain' ),
    'search_Veggies'                => __( 'Search Veggies', 'text_domain' ),
    'add_or_remove_Veggies'         => __( 'Add or remove Veggies', 'text_domain' ),
    'choose_from_most_used'         => __( 'Choose from the most used Veggies', 'text_domain' ),
    'not_found'                     => __( 'Not Found', 'text_domain' ),
    );
    $args = array(
    'labels'                     => $labels,
    'hierarchical'               => false,
    'public'                     => true,
    'show_ui'                    => true,
    'show_admin_column'          => true,
    'show_in_nav_menus'          => true,
    'show_tagcloud'              => false,
    );
    register_taxonomy( 'vegetable', array( 'post' ), $args );

    }

    // Hook into the 'init' action
    add_action( 'init', 'slug_veggies_tax', 0 );

    }
?>

Кстати, я создал этот код с помощью GenerateWP менее чем за две минуты! Услуга отличная, и вручную писать код, который этот сайт может автоматически генерировать для вас, не имеет смысла. Чтобы сделать этот процесс еще проще, вы можете использовать плагин Pluginception для создания пустой плагин для вас, а затем вставить код из GenerateWP в него с помощью wordPress’ плагин редактор.

Использование WP-запросов с пользовательскими таксономиями

После того как вы добавили пользовательские таксономии, вы можете запрос для должностей с терминами в этой таксономии. Для этого мы можем использовать таксономы запросы с WP_QUERY .

Таксономия запросы могут быть очень простыми или сложными. Самый простой запрос будет для всех должностей с определенным термином. Например, если у вас есть тип столба под названием “jedi” и связанная с ней пользовательская таксономия под названием “уровень”, то вы можете получить все мастера-джедаи, как это:


<?php
    $args = array(
        'post_type' => 'jedi',
        'level' => 'master'
    );
    $query = new WP_Query( $args );
?>

Если вы добавили вторую пользовательскую таксономию под названием “эра”, то вы можете найти всех мастеров-джедаев Старой Республики следующим образом:


<?php
    $args = array(
        'post_type' => 'jedi',
        'level' => 'master',
        'era' => 'old-republic',
    );
    $query = new WP_Query( $args );
?>

Мы также можем сделать более сложные сравнения, используя полный tax_query . tax_queryАргумент позволяет нам искать по ID, а не пули (как мы делали раньше) и искать более одного термина. Это также позволяет нам объединить несколько запросов таксономии и установить связь между ними. Кроме того, мы можем даже использовать операторы S’L, такие как NOT IN для исключения терминов.

Возможности безграничны. Для получения полной информации можно ознакомиться с разделом«Параметры таксономии»на странице Кодекса «Классная справка/WP»Квири». Фрагмент ниже ищет наш “jedi” тип поста для рыцарей-джедаев и мастеров, которые не из эпохи Старой Республики:


<?php
    $args = array(
        'post_type' => 'jedi',
        'tax_query' => array(
        'relation' => 'AND',
            array(
                'taxonomy' => 'level',
                'field' => 'slug',
                'terms' => array( 'master', 'knight' )
            ),
            array(
                'taxonomy' => 'era',
                'field' => 'slug',
                'terms' => array( 'old-republic' ),
                'operator' => 'NOT IN'
                )
        )
    );
    $query = new WP_Query( $args );
?>

Настройка архивов таксономии

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

Привет pre’get’posts

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

Чтобы изменить этот запрос, вы можете использовать pre_get_posts фильтр, прежде чем WordPress получает какие-либо сообщения. Этот фильтр предоставляет объект запроса после его установки, но прежде чем он используется для фактического получения каких-либо сообщений. Это означает, что вы можете изменить запрос с помощью методов класса до запуска основного цикла WordPress. Если это звучит запутанно, не волнуйтесь – в следующих нескольких разделах этой статьи приведены практические примеры того, как это работает.

Добавление пользовательских типов сообщений в архивы категории или тегов

Большое использование изменения WP_QUERY объекта с помощью pre_get_posts заключается в добавлении сообщений из пользовательского типа поста в архив категории. По умолчанию пользовательские типы публикаций не включены в этот запрос. Если бы мы строили аргументы, которые должны быть переданы WP_Query и хотел включить как регулярные должности и должности в пользовательском типе поста “jedi”, то наш аргумент будет выглядеть следующим образом:


<?php
    $args = array( 'post_type' =>
        array(
            'post',
            'jedi'
        )
    );
?>

В обратном вызове для нашего pre_get_posts фильтра, мы должны пройти аналогичный аргумент. Проблема в том, что WP_QUERY объект уже существует, поэтому мы не можем передать ему аргумент, как мы делаем при создании экземпляра класса. Вместо этого мы используем set() метод класса, который позволяет нам изменять любой из аргументов после создания класса.

В фрагменте ниже, мы set() используем, чтобы изменить post_type аргумент от значения по умолчанию, post который, чтобы массив типов сообщений, в том числе должности и наш пользовательский тип поста “jedi”. Обратите внимание, что мы используем условный is_category() тег, чтобы изменение произошло только при отображении архивов категорий.


<?php
    add_filter( 'pre_get_posts', 'slug_cpt_category_archives' );
    function slug_cpt_category_archives( $query ) {
    if ( $query->is_category() && $query->is_main_query()  )  {
        $query->set( 'post_type',
            array(
                'post',
                'jedi'
            )
        );
    }

    return $query;

    }
?>

Параметр этой функции $query является WP_QUERY объектом, прежде чем он используется для заполнения основной петли. Поскольку страница может включать несколько циклов, например, используемых виджетами, мы используем условную is_main_query() функцию, чтобы гарантировать, что это влияет только на основной цикл, а не на любые вторичные циклы на странице, например, те, которые используются виджетами.

Создание категории или иерархической таксономии Архивы Иерархическая

По умолчанию архивы для категорий и других иерархических таксономий действуют как любой другой архив таксономии: они показывают все сообщения в этой категории или с этим термином таксономии. Чтобы показать только родительские термины и исключить термины «ребенок», вы снова воспользуетесь pre_get_posts фильтром.

Так же, как при создании собственных WP_QUERY для должностей в таксономии, основной цикл WP_QUERY использует tax_query аргументы, чтобы получить сообщения по таксономии. tax_queryИмеет include_children аргумент, который по умолчанию установлен 1 или true . Изменяя его 0 на или , мы можем предотвратить сообщения с false термином ребенка от включения в архив:


<?php
    add_action( 'pre_get_posts', 'slug_cpt_category_archives' );
    function slug_cpt_category_archives( $query ) {
        if ( is_tax( 'TAXONOMY NAME') )  {
            $tax_query = $query->tax_query->queries;
            $tax_query['include_children'] = 0;
            $query->set( 'tax_query', $tax_query );
        }

    }
?>

Результат звучит желательно, но имеет ряд серьезных недостатков. Это нормально, потому что если мы устраним эти недостатки, мы сделаем первый шаг к созданию чего-то очень крутого.

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

Хороший способ справиться с этим заключается в том, чтобы объединить pre_get_post фильтр выше с модификацией шаблона, который показывает категорию или таксономию. Ранее мы обсуждали, как определить, какой шаблон используется для категории вывода или пользовательских архивов таксономии. Кроме того, имейте в виду, что вы всегда можете обернуть ваши изменения в условных тегов, таких как is_category() или , но это может стать is_tax() громоздким быстро; так, что делает копию archive.php вашего и удаления любого ненужного кода, вероятно, имеет больше смысла.

Первый шаг заключается в том, чтобы обернуть все это в чек, чтобы увидеть, есть ли текущий термин таксономии детей. Если этого не произойдет, то мы не хотим ничего вывести. Для этого мы get_term_children() используем, который вернет пустой массив, если текущий термин не имеет детей и который мы можем проверить с !empty() .

Чтобы сделать эту работу для любой таксономии, которые могут быть отображены, мы должны получить текущий термин таксономии и таксономии из query_vars массива глобального $wp_query объекта. Пуля таксономии содержится в taxonomy ключе, а пуля термина находится в tax ключе.

Для get_term_children() использования, мы должны иметь идентификатор термина. ID не в query_vars , но мы можем передать пули, чтобы получить get_term_by() его.

Вот как мы получаем всю необходимую информацию в переменные:


<?php
    global $wp_query;
    $taxonomy = $wp_query->query_vars['taxonomy'];
    $term = $wp_query->query_vars['tax'];
    $term_id = get_term_by( 'slug', $term, $taxonomy );
    $term_id = $term_id->term_id;
    $terms = get_term_children( $term_id, $taxonomy );
?>

Теперь мы будем продолжать только в том случае, если $terms не пустой массив. Чтобы увидеть, пуста ли она в нашем чеке, сначала мы заселим термины с помощью get_terms() . Это необходимо, потому что get_term_children возвращает только массив идентий, и нам нужны идентионные данные и имена, оба из которых находятся в объекте, возвращенном get_terms() . Мы можем пролететь через этот объект, врезультате чего имя будет ссылкой. Ссылка может быть создана путем передачи идентификатора термина get_term_link() .

Вот полный код:


<?php
    global $wp_query;
    $taxonomy = $wp_query->query_vars['taxonomy'];
    $term = $wp_query->query_vars['tax'];
    $term_id = get_term_by( 'slug', $term, $taxonomy );
    $term_id = $term_id->term_id;
    $terms = get_term_children( $term_id, $taxonomy );
    if ( !empty( $terms ) ) {
    $terms = get_terms( $taxonomy, array( 'child_of' => $term_id ) );
    echo '<ul class="child-term-list">';
    foreach ( $terms as $term ) {
    echo '<li><a href="'.$term->term_id.'">'.$term->name.'</a></li>';
    }

    echo '</ul>';

?>

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

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

В этом случае хорошим вариантом является создание пользовательской целевой страницы для этого термина. Мы будем использовать query_vars еще раз, чтобы определить, находится ли пользователь на первой странице архива таксономии; если да, то мы будем использовать taxonomy_archive фильтр, чтобы включить отдельный шаблон, как это:


<?php
    add_filter( 'taxonomy_archive ', 'slug_tax_page_one' );
    function slug_tax_page_one( $template ) {
        if ( is_tax( 'TAXONOMY_NAME' ) ) {
             global $wp_query;
             $page = $wp_query->query_vars['paged'];
            if ( $page = 0 ) {
                $template = get_stylesheet_directory(). '/taxonomy-page-one.php';
            }
        }

        return $template;

    }
?>

Этот обратный вызов сначала проверяет, что пользователь находится в таксономии, на которую мы хотим нацелиться. Мы можем ориентироваться на все таксономии, изменив это только is_tax() . Затем он получает текущую страницу, query_var paged используя имя, и если пользователь находится на первой странице, то он возвращает адрес для нового файла шаблона. В противном случае он возвращает файл шаблона по умолчанию.

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

Взятие под контроль

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

Источник: smashingmagazine.com

Великолепный Журнал

Великолепный, сокрушительный, разящий (см. перевод smashing) независимый журнал о веб-разработке. Основан в 2006 году в Германии. Имеет няшный дизайн и кучу крутых авторов, которых читают 2 млн человек в месяц.

Добавить комментарий

%d такие блоггеры, как: