Home / woocommerce / РЕШЕНО: ЧПУ для Woocommerce и 404 ошибка

РЕШЕНО: ЧПУ для Woocommerce и 404 ошибка

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

Делаем одинаковые урл для товаров, рубрик, каталога:

Итак, нужна структура ссылок следующего вида:

каталог: http://site.ru/catalog/

рубрика: http://site.ru/catalog/category/subcategory/

товар: http://site.ru/catalog/category/subcategory/product_name/

Для этого переходим в Настройки -> Постоянные ссылки и записываем:

  1. Общие настройки постов — Произвольно: /%postname%.html
  2. База категорий товара:  /catalog
  3. Постоянные ссылки товара — Произвольная база: /catalog/%product_cat%
  4. Для страница каталога создаем ярлык catalog
Настройка постоянных ссылок для woocommerce
Настройка постоянных ссылок для woocommerce

Проблема 404 ошибки и ее решение:

Все это даст нам на мой взгляд отличную структуру ссылок, очень понятную как для простого пользователя, так и для поисковых систем. НО не обходится и без ложки дегтя 🙂 При попытке открыть любую рубрику мы получаем 404 ошибку. Все это связано с особенностями самого вопрдпресс, но нас-то интересует выход из сложившейся ситуации, а не причина. Да, и без html в конце урл для товара не обойтись, а вот у рубрик придется от подобного окончания отказаться. Иначе — никак. Если кто-то знает другой способ — поделитесь в комментариях, буду признателен. Итак, вначале мы принудительно добавляем .html для каждого товара

//добавим *.html для товаров
function product_permastruct_html( $post_type, $args ) {
 if ( $post_type === 'product' )
 add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%.html", $args->rewrite );
}
add_action( 'registered_post_type', 'product_permastruct_html', 10, 2 );


После этого добавляем правила для обработки ссылок:

//фильтр для корректного отображения структуры
add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
    $newRules                               = array();
    $newRules['catalog/(.+)/(.+?).html$'] = 'index.php?product=$matches[2]';
    $newRules['catalog/(.+)/?$']          = 'index.php?product_cat=$matches[1]'; 

    return array_merge($newRules, $rules);
}

add_filter('request', 'mmp_rewrite_request');
function mmp_rewrite_request($vars) {
    if (isset($vars['category_name'])) {
		if (strpos($vars['category_name'], '/page/') !== false) {
			$newvars = explode('/page/', $vars['category_name']);
			$vars['product_cat'] = $newvars[0];
			$vars['paged'] = $newvars[1];
		}
		if (strpos($vars['category_name'], 'page/') !== false) {
			$newvars = explode('page/', $vars['category_name']);
			$vars = array();
			$vars['pagename'] = 'catalog';
			$vars['paged'] = $newvars[1];
			return $vars;
			
		}
        if (strpos($vars['category_name'], '/') !== false) {
            $categories = explode('/', $vars['category_name']);
			unset($vars['category_name'], '/'));
            $vars['product_cat'] = $categories[count($categories) - 1];
        }
    }
    return $vars;
}

Учтите, если урл для вашего каталога НЕ «catalog«, вы должны внести соответствующие изменения в этот код. Всем удачи!

UPD: 11/09/2016

Обнаружил ошибку при попытке перейти на 2….N страницу товарной рубрики. Исправил код, теперь все работает четко!