@sergafon

Почему возникает 404 ошибка при переходе на страницы таксономий?

Здравствуйте знатоки wordpress. Помогите пожалуйста разобраться со следующим вопросом.
Есть произвольный тип постов и произвольная таксономия.

add_action( 'init', 'register_cpt_tovary' );
function register_cpt_tovary() {
    $labels = array(
        'name' => _x( 'Все товары', 'tovary' ),
        'singular_name' => _x( 'Товар', 'tovary' ),
        'add_new' => _x( 'Добавить товар', 'tovary' ),
        'add_new_item' => _x( 'Добавить новый товар', 'tovary' ),
        'edit_item' => _x( 'Редактировать товар', 'tovary' ),
        'new_item' => _x( 'Новый товар', 'tovary' ),
        'view_item' => _x( 'Посмотреть товар', 'tovary' ),
        'search_items' => _x( 'Искать', 'tovary' ),
        'not_found' => _x( 'Нет товаров', 'tovary' ),
        'not_found_in_trash' => _x( 'Нет удаленных товаров', 'tovary' ),
        'parent_item_colon' => _x( 'Родитель товаров:', 'tovary' ),
        'menu_name' => _x( 'Товары', 'tovary' ),
    );
    $args = array(
        'labels' => $labels,
        'hierarchical' => false,
        'supports' => array( 'title' ),
        'taxonomies' => array( 'catalog_tax' ),
        'public' => true,
		'map_meta_cap' => true,
        'show_ui' => true,
        'menu_position' => 10,
        'menu_icon' => 'dashicons-cart',
        'show_in_nav_menus' => false,
        'exclude_from_search' => false,
        'has_archive' => false,
        'query_var' => true,
        'rewrite' => array('slug' => 'catalog/%catalog_tax%'),
        'capability_type' => 'page'
    );
    register_post_type( 'tovary', $args );
}

// регистрация таксономии (create_catalog_taxonomies)
add_action ( 'init', 'create_catalog_taxonomies' );
function create_catalog_taxonomies(){
  // определяем заголовки для 'catalog'
  $labels = array(
	'name' => _x( 'Категории', 'taxonomy general name' ),
	'singular_name' => _x( 'Категория', 'taxonomy singular name' ),
	'search_items' =>  __( 'Поиск по категориям' ),
	'all_items' => __( 'Все категории' ),
	'parent_item' => __( 'Родительская категория' ),
	'parent_item_colon' => __( 'Родительская категория:' ),
	'edit_item' => __( 'Редактировать категорию' ),
	'update_item' => __( 'Обновить категорию' ),
	'add_new_item' => __( 'Добавить новую категорию' ),
	'new_item_name' => __( 'Имя новой категории' ),
	'menu_name' => __( 'Каталог' ),
  );

  // Добавляем древовидную таксономию 'catalog_tax' (как категории)
  register_taxonomy('catalog_tax', array('tovary'), array(
    'hierarchical' => true,
    'labels' => $labels,
    'show_ui' => true,
    'rewrite' => array( 'slug' => 'catalog', 'hierarchical' => true )
  ));
}


Планирую выводить категории и подкатегории каталога на страницах таксономии с адресом типа http://адрес_сайта/catalog/elektrokotly/seriya, на страницах серии планирую выводить произвольный тип постов tovary адрес у них должен быть http://адрес_сайта/catalog/elektrokotly/seriya/tovar1

Пытаюсь настроить адрес товаров следующим кодом
add_filter('post_type_link', 'custom_post_permalink_structure', 10, 4);
function custom_post_permalink_structure($post_link, $post, $leavename, $sample) {
    if (false !== strpos($post_link, '%catalog_tax%')) {
        $custom_post_type_term = get_the_terms($post->ID, 'catalog_tax');
        $post_terms = array();
        if (!empty($custom_post_type_term)) {
            foreach ($custom_post_type_term as $term)
                $post_terms[] = $term->slug;
            $post_link = str_replace('%catalog_tax%', implode( '/', array_reverse( $post_terms ) ), $post_link);
        }
        else
            $post_link = str_replace('%catalog_tax%', 'uncategorized', $post_link);
    }
    return $post_link;
}


После того как перезаписываю slug товаров при переходе на страницы таксономии получаю 404 ошибку. Причем на 1 уровне таксономии нет 404 ошибки, на дочерних терминах выдается 404 ошибка. Это возможно как либо исправить. Вообще правильно организовывать каталог таким образом?
  • Вопрос задан
  • 3024 просмотра
Решения вопроса 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Вы делаете кастомный rewrite для иерархической таксономии, еще и rewrite_tag добавляете, правда немного странно. Мне кажется, что у вас 1+ уровни иерархии не отрабатываются, потому что само правило перезаписи отрабатывает только один уровень, то есть, массив $matches у вас содержит только один термин. Без доступа к сайту и коду сложно подсказать. Установите плагин Query Monitor, на странице с 1м уровнем таксономии (который работает) и с 2м (который 404) посмотрите в выводе Query Monitor раздел Request - там будет указано какой запрос обработался, какая регулярка, какой результирующий query_string вышел (с GET-переменными, понятными движку), какие query vars, какой объет запрошен. Еще можете попробовать Rewrite Rule Inspector - очень полезный инструмент для отладки правил ЧПУ. Так как rewrite rules весьма хитрая штука.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
eholin
@eholin
Web-developer (frontend + backend)
Потому что нужно сделать flush_rewrite_rules, после того, как зарегистрировали custom post type. Важный момент - это можно делать только при активации (деактивации) темы или плагина, где используется custom post type, т.к. это действо весьма нагружает систему.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы