Вопрос или проблема
У меня есть страница, такая как http://example.com/mypage
и я хочу установить некоторые параметры $_GET
следующим образом:
http://example.com/mypage/firstparameter/firstvalue
Мне нужно значение firstparameter
, но я всегда попадаю на страницу 404.
Я потратил несколько часов, пытаясь разобраться с get_query_var()
, add_query_vars_filter()
и add_rewrite_rule()
, но ничего не вышло…
Спасибо
Сочетание add_rewrite_rule()
и add_rewrite_tag()
немного сложно, возможно, вы можете использовать хук parse_url
, который оказался полезным для меня. Код ниже предназначен для захвата нескольких параметров=значение, разделенных слэшем. Код –
add_filter( 'parse_request', 'wpse128790_parse_request' );
function wpse128790_parse_request( $wp )
{
$pageslug = 'mypage';
if( isset($wp->request) && strpos($wp->request, "https://wordpress.stackexchange.com/") )
{
$requests = explode("https://wordpress.stackexchange.com/", $wp->request);
if( $pageslug == array_shift($requests) )
{
$wp->set_query_var('pagename', $pageslug);
$wp->set_query_var('attachment', false );
$wp->set_query_var('error', false );
$count = count( $requests );
if( $count > 0 )
{
// остановить каноническую переадресацию
remove_action('template_redirect', 'redirect_canonical');
foreach( $requests as $i => $request )
{
// это должен быть ключ, а следующий - значение
if( $i == 0 || $i % 2 == 0 )
{
if( isset($requests[$i+1]) )
$val = $requests[$i+1];
else
$val="";
$wp->set_query_var( $request, $val );
}
}
}
}
}
}
Но вы, вероятно, фильтруете параметры с помощью in_array или что-то подобное, чтобы убедиться, что они безопасны для включения в wp query var
Можете ли вы установить параметры в строке URL непосредственно? Что-то вроде:
http://mydomain.com/mypage/?first_parameter=firstvalue&second_parameter=secondvalue
Это сделает их доступными через вызов _GET или _REQUEST.
Вы также можете, возможно, использовать .htaccess для перезаписи этих параметров, хотя мне нужно будет посмотреть синтаксис.
Ответ или решение
Для того чтобы корректно обработать параметры в URL и избежать ошибки 404 на вашем сайте WordPress, следует использовать механизм перенаправления URL и перезапись правил. Вот пошаговая инструкция, как это можно сделать:
1. Использование функции add_rewrite_rule()
Для начала вам нужно добавить пользовательское правило перезаписи, позволяющее обрабатывать ваши параметры в URL в формате, который вы хотите:
function custom_rewrite_rule() {
add_rewrite_rule('^mypage/([^/]+)/([^/]*)/?', 'index.php?pagename=mypage&firstparameter=$matches[1]&firstvalue=$matches[2]', 'top');
}
add_action('init', 'custom_rewrite_rule');
2. Добавление пользовательских переменных запроса
Следующий шаг — зарегистрировать пользовательские переменные с помощью add_query_var()
:
function custom_query_vars($vars) {
$vars[] = 'firstparameter';
$vars[] = 'firstvalue';
return $vars;
}
add_filter('query_vars', 'custom_query_vars');
3. Синтаксис обработки запроса
Теперь, когда вы добавили правило и переменные запроса, вы можете их использовать в вашем коде. Внутри вашей страницы или в функции обработчика вы можете получить доступ к переменным следующим образом:
function mypage_template() {
global $wp_query;
$firstparameter = get_query_var('firstparameter');
$firstvalue = get_query_var('firstvalue');
if ($firstparameter && $firstvalue) {
// Обработка значений переменных здесь
echo "Parameter: " . esc_html($firstparameter) . "<br>";
echo "Value: " . esc_html($firstvalue);
}
}
add_action('template_redirect', 'mypage_template');
4. Обновление правил перезаписи
Каждый раз, когда вы добавляете или изменяете правила перезаписи, вы должны обновлять их. Это можно сделать через меню "Настройки" → "Постоянные ссылки" в административной панели WordPress. Просто перейдите на страницу и сохраните настройки, не изменяя ничего.
Альтернативный вариант с использованием стандартных параметров URL
Если вы хотите упростить процесс и избежать проблем с перезаписью, можно использовать стандартный подход к передаче параметров через символ вопроса в URL:
http://example.com/mypage/?firstparameter=firstvalue
В этом случае доступ к параметрам будет выполнен с помощью стандартных суперглобальных массивов:
$firstparameter = isset($_GET['firstparameter']) ? $_GET['firstparameter'] : '';
Заключение
Следуя этим шагам, вы сможете настроить параметры в URL вашей страницы и избежать ошибок 404. Выбор между сложным методом с перезаписью и простым методом с использованием стандартных параметров зависит от ваших нужд. Однако рекомендуется использовать перезапись для более чистого и SEO-дружественного дизайна URL.