Использование фильтра query_vars в WordPress

23 июл. 2013 г., 21:01:14
Просмотры: 18.1K
Голосов: 6

Я пытаюсь создать ссылку из админки 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) ""

2
Комментарии

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

Josh Levinson Josh Levinson
23 июл. 2013 г. 23:18:51
Все ответы на вопрос 1
6

Фильтр query vars здесь не нужен, так как вы не используете его в запросе. Добавление его в URL как GET-параметра не приведёт к его появлению в массиве query vars, поскольку нет механизма, который преобразует GET-переменную в query var. Вы лишь гарантировали, что она не будет удалена если будет добавлена в запрос.

Пока GET-переменная уникальна и не зарезервирована WordPress, ничто не мешает установить и затем получить доступ к ней стандартными средствами: $_GET['my-preview'].

23 июл. 2013 г. 23:52:43
Комментарии

Согласно 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/

Josh Levinson Josh Levinson
24 июл. 2013 г. 07:23:28

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

Josh Levinson Josh Levinson
24 июл. 2013 г. 07:28:59

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

Josh Levinson Josh Levinson
24 июл. 2013 г. 07:30:12

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

Milo Milo
24 июл. 2013 г. 07:37:18

Хм... Мне нужно будет это проверить и вернуться с ответом.

Josh Levinson Josh Levinson
24 июл. 2013 г. 17:37:36

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

Josh Levinson Josh Levinson
25 июл. 2013 г. 16:16:23
Показать остальные 1 комментариев