Постоянные ссылки пользовательского типа записей с иерархическими таксономиями

Вопрос или проблема

Я бы использовал пользовательские типы записей и иерархические таксономии с одинаковым слагом. К счастью, я нашел хорошее решение на основе фильтра post_type_link здесь от TheDeadMedic.

mysite.com/products/category1/product-name1 
mysite.com/products/category2/product-name2
mysite.com/products/category1/subcategory1/product-name1
mysite.com/products/category2/subcategory2/product-name2
...

Единственная проблема — страницы подкатегорий выдают 404.

Итак, эти URL работают:

mysite.com/products/category1/product-name1
mysite.com/products/category1/subcategory1/product-name1 

Но страницы подкатегорий не работают в иерархической структуре:

mysite.com/products/category1/subcategory1
mysite.com/products/category2/subcategory2

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

mysite.com/products/subcategory1
mysite.com/products/subcategory2

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

Добавьте к регистрации таксономии:

'rewrite' => array( 'hierarchical' => true )

Ответ или решение

Вопрос о том, как настроить постоянные ссылки для пользовательских типов записей и иерархических таксономий с одинаковыми слагами, весьма актуален для разработчиков на платформе WordPress. Как вы уже упомянули, решение на основе фильтра post_type_link, предложенное TheDeadMedic, является хорошим началом. Однако, чтобы обеспечить корректное поведение подкатегорий и избежать возникновения ошибки 404, потребуется внести некоторые изменения в код и настройки.

1. Настройка пользовательского типа записей и таксономий

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

function create_custom_post_type() {
    register_post_type('products',
        array(
            'labels' => array(
                'name' => __('Продукты'),
                'singular_name' => __('Продукт')
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => array('slug' => 'products', 'with_front' => false),
        )
    );

    register_taxonomy('product_category', 'products', array(
        'hierarchical' => true,
        'labels' => array(
            'name' => __('Категории'),
            'singular_name' => __('Категория')
        ),
        'rewrite' => array('slug' => 'products', 'hierarchical' => true),
    ));
}
add_action('init', 'create_custom_post_type');

2. Настройка перманентных ссылок

Чтобы гарантировать, что URL-адреса подкатегорий работают должным образом, необходимо дополнительно использовать фильтр post_type_link. Он позволяет изменить структуру URL для ваших пользовательских типов записей с учетом иерархичных таксономий:

function custom_post_type_link($post_link, $id = 0) {
    $post = get_post($id);

    if ($post->post_type == 'products') {
        $terms = wp_get_post_terms($post->ID, 'product_category');

        if ($terms) {
            $term_slugs = array();
            foreach ($terms as $term) {
                $term_slugs[] = $term->slug;
            }
            return str_replace('%product_category%', join('/', $term_slugs), $post_link);
        } else {
            return str_replace('%product_category%', 'products', $post_link);
        }
    }
    return $post_link;
}
add_filter('post_type_link', 'custom_post_type_link', 10, 2);

3. Добавление поддержки для подкатегорий

Чтобы страницы подкатегорий работали без проблем, вам нужно будет дополнительно зарегистрировать rewrite для ваших таксономий, как предложено выше. Это позволит WordPress корректно обрабатывать иерархические URL-адреса.

function custom_rewrite_rules() {
    add_rewrite_rule('^products/([^/]+)/?$','index.php?product_category=$matches[1]','top');
    add_rewrite_rule('^products/([^/]+)/([^/]+)/?$','index.php?product_category=$matches[1]&name=$matches[2]','top');
}
add_action('init', 'custom_rewrite_rules');

4. Сброс постоянных ссылок

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

Заключение

Теперь, после выполнения всех вышеописанных шагов, ваши URL-адреса должны работать корректно как для пользовательских типов записей, так и для иерархических категорий. Это позволит избежать ошибок 404 при переходе на страницы подкатегорий и обеспечит удобство навигации по вашему сайту. Если возникнут дополнительные вопросы или потребуется уточнение, не стесняйтесь задавать их.

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

Капча загружается...