Глобальные переменные в 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_widgets(массив)
- Данные всех зарегистрированных виджетов.
- $wp_registered_widget_controls(массив)
- ____
- $wp_registered_widget_updates(массив)
- ____
- Допустимые HTML теги при публикации записи. Список смотрите в файле wp-includes/kses.php.
- Допустимые HTML теги при комментировании. Список смотрите в файле wp-includes/kses.php. См. allowed_tags()
- $wp_filter(массив)
- Все хуки WordPress.
- $wp_actions(массив)
- Массив с названиями событий в индексе и количеством сколько раз сработало событие в значении.
- $wp_object_cache(WP_Object_Cache)
- Весь объектный кэш. Он хранится так, когда не установлен плагин объектного кэша... Глобальный экземпляр класса WP_Object_Cache.
- Все зарегистрированные шорткоды и их данные.
- $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().
- Данные пользователя 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)
- Объект текущей записи (поста). На странице записи - это сама запись. На странице рубрики это текущая запись в цикле.
- Объект автора текущей записи. Объект описан в 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
,index.php
. Берется последний элемент получаемый из$_SERVER['PHP_SELF']
и где нужно значение стандартизируется.Переменная также устанавливается и во фронте, только там она почти всегда содержит
index.php
илиwp-login.php
.Устанавливается сразу после события muplugins_loaded, но до события plugins_loaded.
ВАЖНО! Эта переменная не установлена на момент загрузки главного файла mu-плагина или плагина активированного для сети мультисайт.
- $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