Перепишите правила для нескольких (более 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 таксономиях.

Author: alo Malbarez, 2012-03-06

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-адрес, такой как /товары-категория/маленькие/цвет/красный, вы можете не получить ожидаемых результатов, например, маленькие футболки? или вы имели в виду маленькие платья?

Так что остерегайтесь двусмысленности

 4
Author: Tom J Nowell, 2012-03-06 23:38:43

Для дальнейшего использования (например, в следующем году, когда я погуглю и снова найду свой собственный вопрос) это можно преобразовать в синтаксис 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 в качестве крючка/фильтра, поэтому я переключился на инициализацию.

 4
Author: helgatheviking, 2013-03-06 03:19:00