get_query_var vs глобальные переменные запроса в WordPress?
У меня есть переменные запроса, определенные в functions.php с помощью:
add_filter('init', 'add_query_vars');
function add_query_vars() {
global $wp;
$wp->add_query_var('profession');
}
До сих пор для получения переменной запроса в шаблонах страниц я использовал $profession = get_query_var('profession');
. Похожий пример $paged = get_query_var('paged');
также показан для переменной $paged
на странице Codex для get_query_var()
. Однако сегодня я узнал, что к переменным запроса можно обращаться как к глобальным переменным. Все, что мне нужно сделать - это объявить global $profession;
, и я могу использовать значение переменной в любом месте шаблона. Мне кажется, что это гораздо лучший способ доступа к переменным запроса без накладных расходов вложенных функций get_query_var()
.
Есть ли веская причина использовать get_query_var()
для получения переменных запроса вместо доступа к ним как к глобальным переменным? Если нет, то зачем вообще существует get_query_var()
?

get_query_var()
является обёрткой для $wp_query->get($var);
. Однако глобальная переменная $wp_query
не всегда идентична той, что была установлена во время запроса. В этом и заключается основная проблема с query_posts()
.
Другие плагины также могут непреднамеренно перезаписывать эти переменные. Я видел плагины, которые добавляли $i
в глобальное пространство имён…
Возвращаемые значения также различаются:
$GLOBALS['missing_var']
вернётNULL
, если такой переменной не существует. Строгая проверка типа выглядит так:if ( NULL !== $GLOBALS['missing_var'] )
.get_query_var('missing_var');
вернёт пустую строку, если переменная отсутствует. Строгая проверка типа:if ( '' !== get_query_var('missing_var')
.
Когда другие программисты работают с вашим кодом, они всегда могут проследить за get_query_var()
, чтобы увидеть резервное значение. С глобальными переменными такое невозможно.
Кроме того, существуют планы по сокращению количества глобальных переменных в WordPress. Используйте API (функцию), и вы, скорее всего, будете в безопасности. Доступ к глобальным переменным, напротив, может привести к проблемам.

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