ЧПУ для страниц фильтра в архиве записей
-
Помогите решить такую задачу.
Есть свой тип записей (товары) и к нему привязано несколько таксономий. Упрощенно это выглядит так:$args = array( 'rewrite' => array('slug' => 'catalog') ); register_post_type( 'product', $args ); $args = array( 'labels' => array('name' => 'Производитель') ); register_taxonomy( 'brand', 'product', $args ); $args = array( 'labels' => array('name' => 'Тип') ); register_taxonomy( 'type', 'product', $args );
В результате по ссылкам вида /catalog/ открывается архив этих записей — каталог товаров. а по /catalog/product-slug/ сами товары.
В каталоге есть разные фильтры, которые генерируют URL с get-параметрами вида /catalog/?brand=brand_id
Но для SEO просят сделать ЧПУ, чтобы получились ссылки /catalog/brand-slug/ и т.п.Есть решение с add_rewrite_rule:
add_rewrite_rule( '/catalog/([^/]*)/?', 'index.php?post_type=product&filter=$matches[1]', 'top' );
Дальше через get_query_var получаем переменную, применяем фильтр, выводим нужные записи. В этом плане все работает.
Но возникают проблемы с выводом страниц самих товаров. Ведь у них ссылки устроены точно по такой же схеме, что и страницы фильтров:
/catalog/product-slug/
/catalog/brand-slug/Можно было бы решить, например, как-то поменяв URL для фильтров:
add_rewrite_rule( '/catalog/filter/([^/]*)/?', 'index.php?post_type=product&filter=$matches[1]', 'top' );
Тогда страницы фильтров будут иметь URL вида /catalog/filter/brand-slug/.
Или поменять slug для товаров и получить у них URL /products/product-slug/
Но ничего из этого не хотелось бы. Оставлю это уж на самый крайний случай.Пока видится только костыльное решение:
1. Проверить регуляркой $_SERVER[‘REQUEST_URI’].
2. Если онo соответствует /catalog/any-slug/, то попробовать найти товар с этим any-slug.
3. Если такой товар найдется, то дальше ничего не делаем (точнее, дальше функционал WP откроет страницу этого товара).
4. Если товара не нашлось, то add_rewrite_rule, get_query_var… В общем, как я писал двумя абзацами выше.Но оно порождает проблемы:
Во-первых, потребуется при каждом вызове делать $wp_rewrite->flush_rules() или flush_rewrite_rules() — а это очень ресурсоемко, да и товаров несколько тысяч.
Во-вторых, даже если опустить проблему с ресурсами, при параллельных запросах явно будет происходить не пойми что (правила же в БД не мгновенно будут обновляться).Может быть существует какое-то более правильное решение?
- Тема «ЧПУ для страниц фильтра в архиве записей» закрыта для новых ответов.