Ни для кого не секрет, что правильные настроенные ЧПУ являются основой для хорошего старта любого проекта. Многим полюбившийся woocommerce несмотря на гибкость и бесплатность до настоящего времени не позволяет грамотно настроить структуру ссылок на сайте. Дело в том, что при определенной настройке страница рубрики выдает 404 ошибку.
Делаем одинаковые урл для товаров, рубрик, каталога:
Итак, нужна структура ссылок следующего вида:
каталог: http://site.ru/catalog/
рубрика: http://site.ru/catalog/category/subcategory/
товар: http://site.ru/catalog/category/subcategory/product_name/
Для этого переходим в Настройки -> Постоянные ссылки и записываем:
- Общие настройки постов — Произвольно: /%postname%.html
- База категорий товара: /catalog
- Постоянные ссылки товара — Произвольная база: /catalog/%product_cat%
- Для страница каталога создаем ярлык catalog

Проблема 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 страницу товарной рубрики. Исправил код, теперь все работает четко!