Перепишите правила для нескольких (более 2) таксономий
Я использую woocommerce и у меня есть некоторые "атрибуты продукта", которые являются просто таксономией.
У меня есть следующие таксономии:
- цвет pa_color
- pa_материал
- стиль pa_style
pa_ означает атрибут продукта, и он встроен в WooCommerce для обработки этих таксономий, поэтому я не могу это изменить.
WooCommerce также поставляется с таксономиями категорий продуктов (product_cat) и тегов продуктов (product_tag).
В следующий запрос дает мне все красные виниловые изделия в категории "Ткани"
?product_cat=ткани и материал pa_material=винил и цвет pa_color=красный
Я бы хотел превратить это в красивую постоянную ссылку, что-то вроде:
Категория товара /ткани/материал/винил/цвет/красный
Этот ответ приближает меня к тому, чего я пытаюсь достичь:
Правила перезаписи URL-адресов для запроса нескольких таксономий
В том, что я могу получить свой URL-адрес для обработки 2 таксономий (product_cat + 1 таксономия атрибутов), но я застрял на том, как получить 3 (или более) параметра.
Таким образом, я могу получить:
/товары-категория/ткани/цвет/красный
Или
/категория товара/ткани/материал/винил
Но не все 3 вместе
/категория товара/ткани/материал/винил/цвет/красный
Редактировать / хотя я думаю, что было бы идеально иметь URL-адрес быть
/ткани/винил/красный
Я не уверен, что это возможно?
Завершить редактирование/
В WooCommerce также есть некоторые настройки для изменения постоянных ссылок (например, добавление перед URL-адресом "магазин" или изменение названия категории товара), поэтому в конечном итоге мне нужно будет это учитывать, но прямо сейчас мне нужно сделать этот первый шаг.
Для простоты, это урезанная версия моего кода. На самом деле я получаю таксономию из встроенных функций woocommerce, но вопрос не ограничивается woocommerce... поскольку это относится к любому сайту с множеством таксономий.
add_action( 'init', 'wpa_init' );
function wpa_init() {
$taxonomies = array(
'pa_color' => 'Color',
'pa_material' => 'Material',
'pa_style' => 'Style',
);
$base = 'product-category';
foreach ( $taxonomies as $taxonomy => $mask ):
$attribute = strtolower( sanitize_title( $mask ) );
add_rewrite_rule(
$base.'/(.+?)/' . $attribute . '/([^/]+)(/page/(\d+))?/?$',
'index.php?product_cat=$matches[1]&' . $taxonomy . '=$matches[2]&paged=$matches[4]',
'top'
);
endforeach;
}
Это был лучший ресурс, который я нашел по постоянным ссылкам на запросы таксономии: http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/
Но он тоже, похоже, застрял на 2 таксономиях.
2 answers
Вы могли бы попробовать что-то вроде этого:
function custom_rewrite( $wp_rewrite ) {
$feed_rules = array(
'product-category/(.+)/material/(.+)/color/(.+)' => 'index.php?product_cat='. $wp_rewrite->preg_index(1).'&pa_material='. $wp_rewrite->preg_index(2).'&pa_color='. $wp_rewrite->preg_index(3)
'product-category/(.+)/color/(.+)' => 'index.php?product_cat='. $wp_rewrite->preg_index(1).'&pa_color='. $wp_rewrite->preg_index(2)
'product-category/(.+)/material/(.+)' => 'index.php?product_cat='. $wp_rewrite->preg_index(1).'&pa_material='. $wp_rewrite->preg_index(2)
);
$wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( 'generate_rewrite_rules', 'custom_rewrite' );
Это может работать не совсем так, как рекламируется, и вам может потребоваться внести некоторые изменения в регулярное выражение, но это общая суть того, что необходимо сделать (90 % работы).
Вам нужно будет удалить постоянные ссылки, если вы добавите/отредактируете/удалите этот код, поместите его в functions.php или пользовательский плагин. Вы можете удалить постоянные ссылки, просто зайдя в административную область и повторно сохранив постоянные ссылки
В качестве примечания вы можете столкнуться с конфликтом проблемы, если вы начнете использовать иерархию,
Например, если у вас есть категория футболки/маленькие и платья/маленькие, и вы используете URL-адрес, такой как /товары-категория/маленькие/цвет/красный, вы можете не получить ожидаемых результатов, например, маленькие футболки? или вы имели в виду маленькие платья?
Так что остерегайтесь двусмысленности
Для дальнейшего использования (например, в следующем году, когда я погуглю и снова найду свой собственный вопрос) это можно преобразовать в синтаксис add_rewrite_rule()
, преобразовав ключи в массиве $new_rules
в параметр $regex add_rewrite_rule()
со значением $переписать и "сверху" в качестве позиции $.
add_rewrite_rule($regex,$rewrite, $position);
Или в качестве примера одной из моих просьб сверху:
function custom_rewrite() {
add_rewrite_rule(
'product-category/(.+?)/material/(.+?)/?$',
'index.php?product_cat=matches[1]&pa_material=$matches[2]',
'top'
);
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_action( 'init', 'custom_rewrite' );
По какой-то причине мне не удалось использовать regenerate_rewrite_rules
в качестве крючка/фильтра, поэтому я переключился на инициализацию.