Использование фильтра query_vars в WordPress
Я пытаюсь создать ссылку из админки WordPress для просмотра записей особым способом.
Структура URL для этого выглядит так: example.com/post123/?my-preview=456
/post123/
— это обычный постоянный URL записи. Параметр ?my-preview=456
позволяет определенной части записи получать информацию на основе значения my-preview.
Я знаю, что WordPress удаляет параметры $_GET
из URL, поэтому попробовал использовать add_filter('query_vars','my_query_vars');
и
function my_query_vars($query_vars){
$query_vars[] = 'my-preview'; // Добавляем наш параметр в массив query_vars
return $query_vars;
}
В том месте, где мне нужно получить это значение, я попробовал:
global $wp_query;
var_dump($wp_query->query_vars); // Выводим все переменные запроса
Даже с URL как в примере выше, пара 'my-preview' нигде не отображается в массиве $wp_query->query_vars.
Я делаю не те шаги для регистрации дополнительного query_var для использования позже? Если все верно, почему параметр не сохраняется?
РЕДАКТИРОВАНО:
Также пробовал:
add_action('init', 'add_query_vars');
с
function add_query_vars() {
global $wp;
$wp->add_query_var('my-preview'); // Альтернативный способ добавления переменной запроса
}
и wp_die(var_dump(get_query_var('my-preview')));
возвращает string(0) ""

Фильтр query vars здесь не нужен, так как вы не используете его в запросе. Добавление его в URL как GET-параметра не приведёт к его появлению в массиве query vars, поскольку нет механизма, который преобразует GET-переменную в query var. Вы лишь гарантировали, что она не будет удалена если будет добавлена в запрос.
Пока GET-переменная уникальна и не зарезервирована WordPress, ничто не мешает установить и затем получить доступ к ней стандартными средствами: $_GET['my-preview']
.

Согласно http://codex.wordpress.org/Query_Overview#More_on_WP-.3Eparse_request.28.29, функция parse_request()
удаляет параметры $_GET из URL. Когда я посещаю example.com/post123/?my-preview=123 (я сомневаюсь, что my-preview зарезервировано), WordPress удаляет GET-параметры, и в итоге я попадаю на example.com/post123/

Также вы сказали, что нет механизма для преобразования GET-параметров в query vars, но именно это делает шаг 4 в parse_request согласно указанной странице.

Если query_vars не является решением, почему WordPress удаляет мои GET-параметры и что я могу с этим сделать?

parse_request удаляет GET-переменные для целей разбора запроса, но не выполняет перенаправление на эту версию URL. Почему это не работает у вас, я не могу сказать — я постоянно делаю это без проблем. Только что проверил на чистой установке с темой twentytwelve, и всё работает как ожидается.

Ты был прав! Это плагин http://wordpress.org/plugins/404-redirected/ вызывал удаление GET-параметров. Странно. Теперь я вспоминаю, почему никогда не устанавливаю плагины старше 6 месяцев, не зная разработчика...
