Условное регулярное выражение в add_rewrite_rule () для конкретных фильтров запросов и разбиения на страницы

Я работаю над сайтом с двумя типами сообщений, которые используют несколько таксономий и настраиваемых полей. Я разработал функциональность фильтрации с хорошими URL-адресами, и URL-адреса теперь работают следующим образом:

1) Я зарегистрировал свой запрос vars

function return_vars( $vars ) { $vars[] = 'tax_filters'; $vars[] = 'field_filters'; return $vars; } add_filter( 'query_vars', 'return_vars' ); 

2) Я установил эти правила перезаписи с помощью add_rewrite_rule () следующим образом:

 add_rewrite_rule( 'my-base/filters/([^\/]*)/([^&]*)/fields/([^&]*)/?', 'index.php?post_type=$matches[1]&tax_filters=$matches[2]&field_filters=$matches[3]', 'top'); add_rewrite_rule( 'my-base/filters/([^\/]*)/([^&]*)/?', 'index.php?post_type=$matches[1]&tax_filters=$matches[2]', 'top'); 

так что:

  1. $ matches [1] представляет тип сообщения
  2. $ matches [2] фильтрует таксономии. Это строка, разделенная косой чертой, в виде / tax1_name / term / tax2_name / term / tax3_name / term …..
  3. $ matches [3] в первом правиле останавливает совпадения [2] и начинает сопоставлять материал после поля / fields / placeholder, который следует как / field1_name / value / field2_name / etcetera
  4. В последнее время я фильтрую WP_Query, используя pre_get_posts, в соответствии с содержимым tax_filters [] & field_filters []

Поэтому мои URL-адреса могут быть:

 (according to rule 1) my-base/my-cpt/filters/tax1/term/tax2/term/../../fields/field1/value/fields2/value/../../ 

или фильтровать только налоги:

 (according to rule 2) my-base/my-cpt/filters/tax1_name/term/tax2_name/term/../../ 

Теперь, поскольку мне нужно:

  1. фильтрация только для полей: my-cpt / fields / field1 / value / fields2 / value /
  2. разбиение на страницы для каждой возможной комбинации фильтров: а) только налог, б) только поля с) налог и поля

Это приведет к 6 различным правилам, которые должны быть записаны в определенном порядке от самого длинного до кратчайшего, иначе последний перепишет остальные.

Мне было интересно: можно ли написать регулярное выражение, которое в конечном итоге объединит все эти правила в одном?

Я пробовал с несколькими условными выражениями регулярных выражений, но я не владею им, поэтому у меня есть только ошибки синтаксического анализа.

Спасибо всем, кто мог бы помочь!

Solutions Collecting From Web of "Условное регулярное выражение в add_rewrite_rule () для конкретных фильтров запросов и разбиения на страницы"

Мне удалось решить эту проблему. Он является решением для дальнейшего использования.

1) У меня есть только 1 запрос var:

 function return_vars( $vars ) { $vars[] = 'filters'; return $vars; } 

2) Мои правила перезаписи изменились на:

 add_rewrite_rule( 'my-base/filters/([^\/]*)/([^&]*)/page/([0-9]{1,})/?', 'index.php?post_type=$matches[1]&filters=$matches[2]&paged=$matches[3]', 'top'); add_rewrite_rule( 'my-base/filters/([^\/]*)/([^&]*)/?', 'index.php?post_type=$matches[1]&filters=$matches[2]', 'top'); 

Правило 1: обрабатывает разбиение на страницы Правило 2: обрабатывает только главную страницу

Они должны быть в таком порядке.

3) Затем я фильтрую строку фильтра более или менее таким образом

 function my_pre_get_posts( $query ) { $filters = get_query_var('filters'); // if no filter or if filters are odd, then return if(!$filters || count(explode("/", $k4w_filters)) % 2 != 0) return; // this is a global array with my 2 tax slugs in it global $CUSTOM_TAXES_S; $chunks = array_chunk(explode('/', $filters), 2); $filter_data = array_combine(array_column($chunks, 0), array_column($chunks, 1)); // filter data, populate tax_data and field_data for queries foreach($filter_data as $key => $value) { if(in_array($key, $CUSTOM_TAXES_S)) { $tax_data[$key] = $value; } else { $field_data[$key] = $value; } $query->set('debug_tax_data', $tax_data); $query->set('debug_field_data', $field_data); } // if tax_data exist set tax_query if($tax_data) { foreach( $tax_data as $taxonomy => $slugs ) { // append tax query $tax_query[] = array( 'taxonomy' => get_tax_name($taxonomy), // that's a simple function that retrieves the taxonomy name from its slug 'field' => 'slug', 'terms' => explode(',', $slugs), ); } $query->set('tax_query', $tax_query); } // if field_data exist set meta_query if($field_data) { foreach( $field_data as $key => $value ) { // append tax query $meta_query[] = array( 'key' => $key, 'value' => explode(',',$value), 'compare' => 'IN', ); } $query->set('meta_query', $meta_query); } } add_action('pre_get_posts', 'my_pre_get_posts', 10, 1); 

Таким образом, я могу даже предоставить несколько терминов для налогов или значений для полей, таких как:

 /my-base/filters/my-cpt/tax1/term1,term2/tax2/term1,term2/field1/val1,val2/goingon... 

И это сработает! С разбиением на страницы тоже.

Очевидно, что приведенный выше код работает, но также есть несколько проверок, чтобы избежать проблем и хаков (например, проверить, существует ли предоставленное имя поля или нет, или если оно находится в списке фильтруемых полей и т. Д.).

Надеюсь, это поможет кому-то 🙂