Правильный подход WP Таможенная таксономия и категории - PullRequest
0 голосов
/ 28 мая 2020

У меня есть количество категорий, основанных на разных баскетбольных лигах League A, League B, League C и так далее. Я пытаюсь сделать так, чтобы каждая лига имела собственную таксономию для каждого сезона 2006-2007,2007-2008,2008-2009, чтобы я мог показывать сообщения только для этого сезона Category: League A -> Season: 2006-2007 -> Posts.

На данный момент я создал следующие таксономия для сообщения Тип сообщения:

add_action( 'init', 'create_seasons' );

function create_seasons() {
    $labels = array(
        'name'                           => 'Seasons',
        'singular_name'                  => 'Season',
        'search_items'                   => 'Search Seasons',
        'all_items'                      => 'All Seasons',
        'edit_item'                      => 'Edit Season',
        'update_item'                    => 'Update Season',
        'add_new_item'                   => 'Add New Season',
        'new_item_name'                  => 'New Season Name',
        'menu_name'                      => 'Seasons',
        'view_item'                      => 'View Season',
        'popular_items'                  => 'Popular Season',
        'separate_items_with_commas'     => 'Separate Season with commas',
        'add_or_remove_items'            => 'Add or remove Season',
        'choose_from_most_used'          => 'Choose from the most used seasons',
        'not_found'                      => 'No seasons found'
    );

    register_taxonomy(
        'seasons',
        'post',
        array(
            'label' => __( 'Season' ),
            'hierarchical' => false,
            'labels' => $labels,
            'public' => true,
            'show_in_nav_menus' => false,
            'show_tagcloud' => false,
            'show_admin_column' => true,
            'rewrite' => array(
                'slug' => 'seasons'
            )
        )
    );
}

Теперь, если я хочу отображать все сообщения из категории League A во время сезона, таксономия 2008-2009 я могу использовать параметр URL ?seasons=2008-2009 . Полный URL http://localhost/site/category/league-a/?seasons=2008-2009

Меня беспокоит то, что я хочу показывать по умолчанию сообщения текущего сезона 2019-2020 без использования параметра URL ?seasons=2019-2020 для каждой категории.

Пример: http://localhost/site/category/league-a/ -> Show posts from seasons taxonomy 2019-2020 only.

Есть ли способ заставить это работать? Правило перезаписи?

Как вы думаете, мой подход верен с тем, что я пытаюсь сделать?

Спасибо

1 Ответ

0 голосов
/ 28 мая 2020

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

Сначала посмотрите сюда: https://developer.wordpress.org/themes/basics/template-hierarchy/

В Wordpress вы можете создать свой собственный category-{term}.php страница, которая в вашем случае будет называться category-league-a.php. Сделайте копию вашей категории. php в папке вашей темы или используйте пример из тем WordPress (например, двадцать девять) и скопируйте код.

Внутри вашей новой страницы архива (WP распознает это автоматически) убираем пост l oop. Теперь вы создаете свой собственный запрос сообщения со своим термином таксономии.

Посмотрите на: https://developer.wordpress.org/reference/classes/wp_query/

Вы получите все сообщения с определенным термином категории и сезонный термин.

$args = array(
    'post_type' => 'post',
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'category',
            'field'    => 'slug',
            'terms'    => 'league-a',
        ),
        array(
            'taxonomy' => 'seasons',
            'field'    => 'slug',
            'terms'    => '2019-2020',
        ),
    ),
);
$current_season_query = new WP_Query( $args );

Теперь вы можете l oop через свои сообщения:

<?php
// The Loop
if ( $current_season_query ->have_posts() ) {
    while ( $current_season_query ->have_posts() ) {
        $current_season_query ->the_post();
            // echo get_the_title().'<br>'; or whatever
    }
    /* Restore original Post Data */
    wp_reset_postdata();
} else {
    // no posts found
}
?>

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

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

Надеюсь, это поможет!


РЕДАКТИРОВАТЬ: использование только одного шаблона страницы категории для всех термины

Вы также можете использовать переменные в вашем tax_query 'category' и 'terms'.

        'taxonomy' => 'category',
        'field'    => 'slug',
        'terms'    => $current_category,

и

        'taxonomy' => 'seasons',
        'field'    => 'slug',
        'terms'    => $current_season,

В $current_category вы сохраняете slug или ваш текущий термин категории просмотра и в $current_season slug вашего термина таксономии.


Другое решение: проверьте, есть ли параметр в строке url

Но теперь Мне приходит в голову, что было бы еще одним решением искать параметр в URL-адресе и изменять запрос только в том случае, если нет набора параметров. Таким образом, вам понадобится всего лишь один category.php, который вам нужно настроить немного:

1. Получите параметр из URL

global $wp;
// Get current page url
$current_url = home_url( add_query_arg( array(), $wp->request ) );
// Parse the URL to get array which contains its components
$url_components = parse_url($current_url);
// parse_str() function to parse the string passed via URL
parse_str($url_components['query'], $params); 

2. Убедитесь, что параметр не установлен, и используйте другой WP_Query в этом случае

if(!isset($params['seasons'])) {
    $current_season_query = new WP_Query( $args );
    // your code
}
else {
    // unchanged WP_Query, standard post loop in archive file
}

Перед if вы определяете новый WP_query, как описано в первом блоке кода этого ответа. В else вы помещаете стандартное сообщение l oop.

Таким образом, вам нужно только внести изменения в свой category.php и не создавать файлы для всех терминов категории.

...