WordPress как на ладони

Глобальные переменные в WordPress

Мы часто используем функции, чтобы получить какие-то данные на странице и не подозреваем о том, что эти данные можно взять из глобальных переменных. Например, имя автора на странице автора. А иногда мы просто не знаем как получить нужные данные, где они находятся. Эта статья расскажет о том как получить все важные данные текущей страницы из переменных PHP которые уже установлены в WordPress. Такие данные остается только взять...

Замечу, что если есть равнозначный вариант получить данные через функцию, то лучше получает через функцию. Потому что это может избавить от багов в будущем - при обновлении в следующих версиях, название глобальной переменной может измениться. А то что измениться название функции - это мало вероятно. К тому же, измененные функции не удаляются, а уходят в раздел запрещенные, но по-прежнему продолжают работать... Вот такой пример:

// текущего пользователя можно получить через глобальную переменную
global $current_user;

// или через функцию, что предпочтительнее
$current_user = wp_get_current_user();

Смотрите также константы в WordPress

Что такое глобальные переменные?

Это переменные PHP, которые «видно» везде.

Чтобы получить доступ к глобальной переменной перед ней нужно указать ключевое слово global:

<?php
global $cat;
echo $cat;

Или можно использовать супер-глобальный массив $GLOBALS:

<?php echo $GLOBALS['cat']; ?>

Глобальные переменные — это обычные переменные, которые определены в глобальной области (основной части) PHP. Чтобы понять что такое глобальная область, представьте самый первый php файл, обычно это index.php - это глобальная область кода (глобальная область видимости). Если в таком файле определить переменную, то она автоматически станет глобальной. Но если в таком файле создать функцию и определить переменную внутри этой функции, то она будет локальной — область видимости такой переменной не выходит за пределы функции. То же касается классов и их методов (функций)...

А что, если в «глобальный» файл подключается другой файл? Допустим, в главный файл index.php мы подключаем еще один файл wp-load.php - require_once 'wp-load.php';. Код этого подключенного файла также становится глобальным, и переменные напрямую определенные в этом файле автоматически становятся глобальными.

Рассмотрим на примере. Допустим, код ниже мы вставляем в файл темы functions.php, который в свою очередь подключается в глобальную область видимости и любые переменные указанные в нём напрямую, становятся глобальными.

<?php
$var = 'Привет мир!'; // эта переменная становится глобальной

// функция
function my_func(){
	echo $var;
}
my_func(); // вызов: получим ошибку уровня Notice,
		   // потому что в области видимости функции нет переменной $var

// функция
function my_func2(){
	global $var; // определим $var глобально

	// теперь $var это глобальная переменная

	echo $var; // Привет мир!

	// изменим переменную - изменится глобальная переменная
	$var = 'Пока мир';
}
my_func2(); // выведет: 'Привет мир!'

// выведем переменную $var за пределами функций
echo $var; // выведет: 'Пока мир'
		   // потому что мы изменили глобальную $var в функции my_func2()

Этот код объясняет суть глобальных переменных, как они видны и не видны внутри функций.

Глобальную переменную можно создать из локальной области видимости, например из функции:

<?php
echo $var; // вызовет ошибку - переменная не определена

function my_func2(){
	global $var; // Создадим глобальную переменную $var

	$var = 'Привет мир';
}
my_func2(); // вызовем функцию

echo $var; // выведет 'Привет мир'

Заметка: ключевое слово global выставляет ссылку на указанную переменную, а не создает новую. Следующие конструкции эквивалентны:

global $var;

// тоже самое что

$var = & $GLOBALS['var'];

Важно! Использовать глобальные переменные нужно осторожно!

Глобальных переменных очень много и их легко изменить. Например, если в начале файлы темы header.php написать $id = 2;, то глобальная переменная $id, которая содержала ID текущей записи измениться и использовать её уже нельзя!

Подобным образом тема или плагины могут менять глобальные переменные. Но все же, среди глоб. переменных есть, скажем так «занятые», о которых должен знать каждый разработчик и не должен использовать их в качестве глоб. переменных при создании плагина или темы. Как раз этот список и приведен в этой статье.

Переменные не из этой статьи использовать в коде не рекомендую. Вместо них следует найти альтернативное решение получить нужные данные, например с помощью соответствующей функции.

Глобальные переменные в WordPress

Во время генерации страницы, WordPress получает кучу данных и важные из них сохраняются в глобальных переменных. Например:

  • ID рубрики на странице рубрики - $cat.
  • Или все полученные посты на странице рубрик - $wp_query.
  • Или объект поста на странице поста - $post.

Таким образом, в WordPress создается куча глобальных переменных, которые можно использовать в своем коде. Рассмотрим самые важные из них ниже.

Общие переменные

$wp_rewrite(объект)
Хранит все о правилах перезаписи URL. Глобальный экземпляр класса WP_Rewrite. Устанавливается в файле wp-setings.php до события setup_theme.
$wp_scripts(WP_Scripts)
Хранит все подключенные и поставленные на вывод скрипты. Глобальный экземпляр класса WP_Scripts.
$wp_styles(WP_Styles)
Хранит все подключенные и поставленные на вывод стили. Глобальный экземпляр класса WP_Styles.
$wpdb(объект)
Хранит текущее подключение к базе данных. Глобальный экземпляр класса wpdb. Позволяет общаться с базой данных.
$table_prefix(строка)
Префикс таблицы в базе данных.
$wp_admin_bar(WP_Admin_Bar)
Все данные админ бара.
$wp_meta_boxes(массив)
Объект всех зарегистрированных метабоксов. Содержит их ID, параметры (args), функции обратного вызова (callback) и заголовки всех типов записей, включая произвольные.
$wp_registered_sidebars(массив)
Все данные о зарегистрированных областях для сайдбара.
$wp_registered_widgets(массив)
Данные всех зарегистрированных виджетов.
$wp_registered_widget_controls(массив)
____
$wp_registered_widget_updates(массив)
____
$allowedposttags(массив)
Допустимые HTML теги при публикации записи. Список смотрите в файле wp-includes/kses.php.
$allowedtags(массив)
Допустимые HTML теги при комментировании. Список смотрите в файле wp-includes/kses.php.
$wp_filter(массив)
Все хуки WordPress.
$wp_actions(массив)
Массив с названиями событий в индексе и количеством сколько раз сработало событие в значении.
$wp_object_cache(WP_Object_Cache)
Весь объектный кэш. Он хранится так, когда не установлен плагин объектного кэша... Глобальный экземпляр класса WP_Object_Cache.
$shortcode_tags(массив)
Все зарегистрированные шорткоды и их данные.
$wp_embed(WP_Embed)

Класс отвечающий за встраивание объектов. Например когда в тексте статьи из ссылки на youtube видео создается HTML код этого видео. Переменная содержит экземпляр класса WP_Embed.

В основе работы этого класса лежит класс WP_oEmbed - он содержит в себе основную функциональность встраиваний, а WP_Embed это своего рода обертка. Получить объект WP_oEmbed можно через функцию: _wp_oembed_get_object(). Отдельно у этого объекта нет глобальной переменной.

$wp_oembed(WP_oEmbed)
Такой глобальной переменной нет! Получить объект WP_oEmbed можно через функцию: _wp_oembed_get_object().
$wp_taxonomies(массив)
Данные всех таксономий.
$wp_post_types(массив)
Данные всех типов записей. Массив объектов WP_Post_Type
$l10n(массив)
Массив всех переводов. Содержит объекты MO класса полученные из файлов .mo. Смотрите load_textdomain().
$l10n_unloaded(массив)
Массив доменов, переводы для которых были выгружены (отменены). Массив с элементами: 'domain' => true. Смотрите unload_textdomain().
$wp_post_statuses(массив)
Массив данных о всех статусах записей. publish, future и т.д.
$current_user(WP_User)
Объект данных текущего пользователя - экземпляр WP_User. Некоторое данные вынесены в отдельные глобальные переменные для быстрого доступа: $user_login, $user_ID, $user_email, $user_url, $user_identity (обычно логин).
$wp_roles(WP_Roles)
Все данные ролей пользователей на сайте.
$wpsmiliestrans(массив)
Массив специальных строк, которые можно перевести в смайлики. Перевод текста в смайлики. :x в смайлик, :| в смайлик и т.д.
$super_admins(массив)
Массив ID пользователей, которые имеют дополнительные права супер-администратора в MU сборке. Эта глобальная переменная устанавливается владельцем сайта (например в файле wp-config.php). Если установлено, то переменная переписывает (перебивает) список супер-админов в базе данных.
$content_width(число)
Устанавливает ширину контента сайта. Используется в файле functions.php.
$wp_filesystem(объект)

Экземпляр подобранного объекта расширяющего класс WP_Filesystem_Base, для работы с файлами на сервере. Экземпляром может быть один из классов: WP_Filesystem_Direct, WP_Filesystem_FTPext, WP_Filesystem_ftpsockets, WP_Filesystem_SSH2.

Переменная устанавливается функцией WP_Filesystem().

$wp_theme_directories
Массив в котором хранятся пути к папкам где находятся темы. Обычно там всего одни путь. Создается переменная функцией register_theme_directory().

Локализация (перевод)

$wp_locale(WP_Locale)
Данные текущей локали сайта (язык сайта). Глобальный экземпляр класса WP_Locale.
$locale(строка)
Локаль сайта, например ru_RU.
$weekday(массив)
Массив всех дней недели переведенные на текущую локаль. [ __('Sunday'), __('Monday'), ... ]
$weekday_initial(массив)
Массив первой буквы всех дней недели переведенные на текущую локаль. [ __('Sunday') => __('S'), __('Monday') => __('M'), ... ]
$weekday_abbrev(массив)
Массив сокращенных названий всех дней недели переведенные на текущую локаль. [ __('Sunday') => __('Sun'), __('Monday') => __('Mon'), ... ]
$month(массив)
Массив всех месяцев переведенных на текущую локаль. [ __('January'), __('February'), ... ]
$month_abbrev(массив)
Массив сокращенных названий всех месяцев переведенных на текущую локаль. [ __('January') => __('Jan'), __('February') => __('Feb'), ... ]

Основной запрос WordPress

ВАЖНО! Не используйте в своем коде названия перечисленных ниже переменных, потому что они используются ядром WordPress. А если вы все же их используете, то вы должны понимать что делаете.

Основной запрос делается функцией wp() методом WP::main().

$wp(WP)
Хранит текущий запрос самого WordPress - экземпляр WP класса, в котором указаны параметры запроса полученные из URL.

Переменные ниже устанавливаются методом WP::register_globals(), который вызывается из WP::main().

$wp_query(WP_Query)
$wp_the_query(WP_Query)

Хранит результат глобального запроса - экземпляр класса WP_Query. Устанавливается функцией query_posts().

$wp_the_query всегда должна быть равна $wp_query. Если вдруг кто-то использовал в своем коде функцию query_posts() вместо get_posts(), то переменная $wp_the_query позволяет вернуть значение $wp_query в правильное состояние, см. wp_reset_query().

$query_string(string)
Строка (параметры) текущего запроса.
$posts(array)
Все посты основного запроса WP_Query.
$post(WP_Post|null)
Объект WP_Post текущей записи. Если страница подразумевает вывод постов или поста.
$request(string)
SQL запрос на получение всех записей для текущей страницы.
$more(int)
Равно 1, когда срабатывает условие - is_single() || is_page().
$single(int)
Является ли текущая страница, страницей записи. Равно 1, когда срабатывает условие - is_single() || is_page().
$authordata(WP_User)
Данные пользователя get_userdata(). Устанавливается только на странице автора is_author().

Также методом WP::register_globals() в глобальные переменные извлекаются все переменные основного запроса WP_Query:

// Extract updated query vars back into global namespace.
foreach ( (array) $wp_query->query_vars as $key => $value ) {
	$GLOBALS[ $key ] = $value;
}

Смотрите WP_Query::parse_query() и WP_Query::fill_query_vars():

$attachment
$attachment_id
$author
$author__in
$author__not_in
$author_name
$cat
$category__and
$category__in
$category__not_in
$category_name
$day
$embed
$error
$favicon
$feed
$fields
$hour
$m
$menu_order
$meta_key
$meta_value
$minute
$monthnum
$name
$p
$page
$page_id
$paged
$pagename
$post__in
$post__not_in
$post_name__in
$post_parent
$post_parent__in
$post_parent__not_in
$post_status
$post_type
$preview
$robots
$s
$second
$sentence
$subpost
$subpost_id
$tag
$tag__and
$tag__in
$tag__not_in
$tag_id
$tag_slug__and
$tag_slug__in
$tb
$title
$w
$withcomments
$withoutcomments
$year

Внутри цикла WordPress

В цикле записей

Эти глобальные переменные можно использовать внутри цикла WordPress. Они меняются по ходу перебора элементов в цикле. Все они содержат информацию о текущей записи (посте) в цикле.

Устанавливаются методом WP_Query::setup_postdata(). Или оберткой для этого метода setup_postdata().

$post(WP_Post)
Объект текущей записи (поста). На странице записи - это сама запись. На странице рубрики это текущая запись в цикле.
$authordata(WP_User)
Объект автора текущей записи. Объект описан в WP_User.
$currentday(строка)
День, когда был опубликован текущий пост.
$currentmonth(строка)
Месяц, когда был опубликован текущий пост.
$page(число)
Страница текущей записи, когда пост разделен на страницы с помощью тега <!--nextpage-->.
$pages(массив)
Контент страниц текущей записи (поста). Каждая страница тут разделяется с помощью тега <!--nextpage-->.
$multipage(логический)
Определяет разделяется ли текущая запись на страницы с помощью тега <!--nextpage-->. Содержит true или false.
$numpages(число)
Количество страниц, если запись разделена на страницы с помощью тега <!--nextpage-->.
$more(логический)
Есть ли тег <!--more--> в записи.

В цикле комментариев

$comment(WP_Comment)
Объект текущего комментария в цикле. Пример такого объекта смотрите в описании get_comment()

В лицевой части (фрон-энде)

$template(строка)
Путь к файлу шаблона, который отвечает за вывод HTML кода текущей страницы. Например: C:/sites/example.com/www/wp-content/themes/twentyfifteen/archive.php

В админ-панели

$current_screen(массив)
Данные текущего экрана админки. См. get_current_screen()
$pagenow(строка)

Определяет на какой странице мы сейчас находимся - текущую страницу админ-панели. Хранит название php файла, который обрабатывает текущую страницу. Например options-general.php. Берется последний элемент получаемый из $_SERVER['PHP_SELF'] и где нужно значение стандартизируется.

Устанавливается переменная рано, сразу после события muplugins_loaded, но до события plugins_loaded.

Переменная также устанавливается и во фронте, только там она почти всегда содержит index.php или wp-login.php.

$post_type(строка)
Тип записи в админке. На странице записи или таксономии.
Массив данных с элементами меню админки, которые были добавлены через add_menu_page(). Содержит Массив массивов данных каждого меню.
Массив данных с элементами под-меню админки, которые были добавлены через add_submenu_page(). Содержит Массив массивов данных каждого под-меню.
$admin_page_hooks(массив)

Элементы главного меню админки в массиве. Где индекс массива это ID меню, который указывается в четвертом параметре add_menu_page().

Почти тоже самое что $menu, только это индексный массив.

Пример:

Array(
	[index.php]               => dashboard
	[separator1]              => separator1
	[upload.php]              => media
	[link-manager.php]        => links
	[edit-comments.php]       => comments
	[edit.php]                => posts
	[edit.php?post_type=page] => pages
	[separator2]              => separator2
	[themes.php]              => appearance
	[plugins.php]             => plugins
	[users.php]               => users
	[tools.php]               => tools
	[options-general.php]     => settings
	[separator-last]          => separator-last
	[woocommerce]             => woocommerce
)

Переменные версий

$wp_version(строка)
Текущая версия WordPress
$wp_db_version(число)
Текущая версия базы данных
$tinymce_version(строка)
Текущая версия редактора TinyMCE
$manifest_version(строка)
Версия манифеста кэша
$required_php_version(строка)
Минимальная версия PHP, которая требуется для текущего WordPress
$required_mysql_version(строка)
Минимальная версия MySQL , которая требуется для текущего WordPress

Переменные браузеров

Эти переменные содержат данные о текущем браузере, который использует пользователь.

$is_iphone(логический)
iPhone Safari
$is_chrome(логический)
Google Chrome
$is_safari(логический)
Safari
$is_NS4(логический)
Netscape 4
$is_opera(логический)
Opera
$is_macIE(логический)
Mac Internet Explorer
$is_winIE(логический)
Windows Internet Explorer
$is_gecko(логический)
FireFox
$is_lynx(логический)
Linux
$is_IE(логический)
Глобальная переменная определяется WordPress и используется для определения того, является ли текущий браузер Internet Explorer.
$is_edge(логический)
Microsoft Edge

Переменные веб-сервера

Эти глобальные переменные содержат данные на каком сервере работает WordPress.

$is_apache(логический)
Apache HTTP Server
$is_IIS(логический)
Microsoft Internet Information Services (IIS)
$is_iis7(логический)
Microsoft Internet Information Services (IIS) v7.x

Мультисайт

$blog_id(число)
ID текущего блога
10 комментариев
    Войти