Отрицание определенных слов из пользовательского выражения переписывания? - PullRequest
1 голос
/ 27 июня 2010

У меня есть страница WP с именем Book (/ book /), которая отображает книгу на разных языках.Переменные языка и главы передаются как переменные запроса.Таким образом, структура URL выглядит следующим образом:

/ book / english / (отображает список глав на английском языке) / book / english / foreword / (отображает предисловие книги на английском языке)

Вот что я придумала:

add_action('init', 'book_init');
add_filter('rewrite_rules_array', 'book_rewrite_rules_array');
add_filter('query_vars', 'book_query_vars');

function book_init() {
 global $wp_rewrite;
 $wp_rewrite->flush_rules();
}
function book_rewrite_rules_array($rewrite_rules) {
 global $wp_rewrite;
 $custom['(book)/(.+)/(.+)$'] = 'index.php?pagename=$matches[1]&book_language=$matches[2]&book_chapter=$matches[3]';
 $custom['(book)/(.+)$'] = 'index.php?pagename=$matches[1]&book_language=$matches[2]';
 return $custom + $rewrite_rules;
}
function book_query_vars($query) {
 array_push($query, 'book_language', 'book_chapter');
 return $query;
}

Все работает, но проблема в том, что добавленные мной правила перезаписи также ловят / book / feed /, которые мне не нужны.Поэтому я ищу выражение, которое бы отменяло подачу из '(книга) / (. +) / (. +) $' И '(книга) / (. +) $'

Также я хочузнаете, если предположить, что предоставленные переменные запроса являются недопустимыми, какой фильтр я должен использовать, чтобы проверить это, и как я могу остановить продолжение WP и вместо этого заставить его отправить ошибку 404 и показать страницу 404?

1 Ответ

1 голос
/ 28 июня 2010

Вы должны иметь возможность исключить 'фид' из вашего маршрута, используя отрицательный прогноз, что-то вроде этого: (book)/(?!feed$)(.+)$.

Что касается второй части вашего вопроса, вы можете подключиться к фильтру request, исследовать переменные запроса и затем добавить значение 'error' в массив переменных, чтобы Wordpress выдавал ошибку 404.

add_filter('request', 'book_request');
function book_request($vars) {
     if (!in_array($vars['book_language'], array('english', 'spanish'))) {
         $vars['error'] = '404';
     }
     return $vars;
}
...