ЧПУ для категорий и подкатегорий WooCommerce

14 янв. 2018 г., 02:02:41
Просмотры: 18.5K
Голосов: 2

Настройка

Желаемая структура постоянных ссылок (только эти структуры существуют для товаров)

Товар 1: /shop/category/subcategory/product1/
Товар 2: /shop/category/product2/

Настройки отображения товаров WooCommerce

Отображение для shopbase:     Показывать категории
Отображение для категорий:   Показывать товары

Товары

Товары проверяются только для одной категории ИЛИ подкатегории

Настройки постоянных ссылок

Обычные настройки:       /%category%/%postname%/
База для категорий:   shop
Для товаров:          /shop/%product_cat%/

Архивы

Поскольку у меня более 100 подкатегорий, я хочу использовать архив для 
отображения всех товаров.

Попытки решения

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

  1. Пробовал различные настройки постоянных ссылок для базы категорий товаров, включая %category%/%product_cat%, %category%/%product_cat%/%postname%, %product_cat%/%product_cat%, shop/%product_cat%, shop/%product_cat%/%postname%, а также все вышеперечисленные комбинации с добавлением /. в конце
  2. Пробовал заменять вышеуказанные настройки настройками базы магазина.
  3. Пробовал изменить настройки отображения товаров, чтобы показывались подкатегории вместо товаров.
  4. Пробовал создавать страницы для подкатегорий при рабочей странице товара, но страница подкатегорий всё равно возвращала 404.
  5. Пробовал это решение с Stack Overflow, но безрезультатно.

Что я делаю не так? Какую часть можно переделать, чтобы это заработало? Буду очень благодарен за любые подсказки или ответы. Спасибо за прочтение!

1
Комментарии

Ещё один вариант для получения нужной структуры — использовать плагин "Premmerce Permalink Manager for WooCommerce" https://wordpress.org/plugins/woo-permalink-manager/

Dusty48 Dusty48
29 нояб. 2019 г. 12:50:52
Все ответы на вопрос 1
0

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

function wpse_291143_generate_taxonomy_rewrite_rules( $wp_rewrite ) {

    global $wp_rewrite;
    $base = "shop";

    $rules = array();
    $terms = get_terms( array( 'taxonomy' => 'product_cat', 'hide_empty' => false ));

    foreach($terms as $term) {
        $term_children = get_terms( array(
            'taxonomy' => 'product_cat',
            'parent' => intval($term->term_id),
            'hide_empty' => false
            )
        );
        if($term_children) {
            foreach ( $term_children as $term_child ) {
                $rules[$base . '/' . $term->slug . '/' . $term_child->slug . '/?$'] = 'index.php?product_cat=' . $term_child->slug;
            }
        }
    }

    $wp_rewrite->rules = $rules + $wp_rewrite->rules;
    return $wp_rewrite->rules;
}

add_action('generate_rewrite_rules', 'wpse_291143_generate_taxonomy_rewrite_rules');
15 янв. 2018 г. 23:45:02