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

Содержание

What Is the functions.php File?

The WordPress functions.php file comes included with all free and premium WordPress themes. To the untrained eye, it may not look like much, but the functions file is a powerful tool that enables you to do a lot of interesting things.


The WordPress Codex describes the functions file like this:

“You can use it to call functions, both PHP and built-in WordPress, and to define your own functions. You can produce the same results by adding code to a WordPress Plugin or through the WordPress Theme functions file.”

In simple terms, the functions file enables you to add custom code to your site. It lets you create new functions or reference existing ones in customized ways. As the Codex points out, this makes the functions file very similar to a plugin, but there are some differences between the two.

The most important difference is that the functions file belongs to a specific theme. If you were to change themes or update to a newer version, the changes you’ve made would disappear. For this reason, you should consider creating a child theme and adding the new code to the child’s functions file instead. This way, you can update the parent theme without losing your changes.

Плагин как альтернатива файлу functions.php

Существует более правильный способ добавлять новые функции для вашего сайта. Необходимо добавить пустой плагин для WordPress и активировать его. Затем в него можно добавлять новые функции, как раньше делали это c файлом functions.php.

Создайте новый файл с расширением .php, например: «functionsphp.php» с кодом:

<?php
/* ====================================
 * Plugin Name: Functions.PHP
 * Description: Мой новый functions.php
 * Version: 1.0
 * ==================================== */

function functionsphp_head_info(){
 echo "\n<!-- Плагин Functions.PHP активен -->\n";
}
add_action('wp_head', 'functionsphp_head_info');

Скопируйте любые функции, которые обычно помечаются как «вставить в functions.php» в ваш новый плагин. После внесение изменений активируйте плагин. Не забудьте выключать плагин при добавлении новых строчек кода. Если после очередной функции сайт выдает ошибки, возможно вы нарушали синтаксис кода или данный код не актуален для вашей версии движка\темы.

Для начинающих разработчиков или для тех кто сам захочет написать функцию для WordPress есть хороший инструмент: Generatewp

Как редактировать файл functions.php WordPress?

В Интернет вы легко найдёте куски кодов , которые нужно добавить в файл функций, чтобы изменить и дополнить функционал темы.

Структура этих кодов узнаваемо проста: в начале идёт function, далее название функции, далее код. В конце кода могут быть: (хук действия) (хук фильтра).

Теоретическое использование подобных функций довольно простое. Вам нужно проверить код на правильный синтаксис (это можно сделать тут: phpcodechecker.com) и вставить в файл .

Однако напрямую вставлять новую функцию в файл функций рабочего проекта я вам не рекомендую, и вот почему.

Во-первых, неправильный код или его неправильная вставка непосредственно в файл функций могут «убить» ваш сайт.

Примечание: Проблемы с доступностью сайта в результате ошибок на WordPress принято называть «Белый экран смерти». Самое простое решение проблемы «белого экрана» наличие резервной копии сайта. Читать: Резервное копирование сайта WordPress. О более сложных решениях поговорим в следующих статьях.

Ещё раз обращу ваше внимание: самая простая ошибка в коде в виде пропущенной точки с запятой, может заставить весь ваш сайт исчезнуть. Во-вторых, если вставляемый код правильный и начнёт работать, он исчезнет после первого обновления вашей темы

Во-вторых, если вставляемый код правильный и начнёт работать, он исчезнет после первого обновления вашей темы.

В-третьих, если вы смените тему все ваши новые добавленные функции перестанут работать.

Типы страниц и названия файлов

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

Ниже указана страница сайта и соответствующий ей список PHP файлов. Такие файлы должны находится в корневой папке темы.

  • (когда используется шаблон страницы)
  • (для древовидного типа с поддержкой шаблонов. С WP 4.7)
  • (позволяет указать шаблон для отдельной картинки)
  • (тоже что и attachment.php)

Под началом и концом MIME типа, имеется виду первая и последняя часть MIME типа, разделенная . Например, MIME-тип текстового файла: и значит будет проверяться наличие файл text.php, затем plain.php, затем text-plain.php.

Полный список MIME типов смотрите в описании get_allowed_mime_types().

  • (если страница пагинации)
  • (если страница пагинации)
  • (если страница пагинации)
  • (если страница пагинации)
  • (если страница пагинации)
  • (если страница пагинации
  • (логика постоянных страниц, если для главной выбрана страница)

Страница блога появляется, когда для главной выбрана постоянная страница

Шаблоны встраивания используются когда запрашивается запись через REST API. Встраивания появились в версии 4.5 и позволяют встраивать ваши записи в чужие сайты. См. get_post_embed_url()

Чтобы изменить только контент встраивания, можно в теме создать файл и описать там HTML. Оригинальный HTML находится в файле движка /wp-includes/theme-compat/embed-content.php

Причины для обновления php

Необходимо отметить 2 самые важные причины — это безопасность и работоспособность всего сайта. Еще совсем недавно все администраторы знали о прекращении обновления php версии 5.2, а сейчас, по прошествии всего чуть меньше двух лет, язык программирования php уже доступен в 7 версии.

Говоря простым языком, обновлено полностью ядро php, появились новые и упрощены старые функции. В результате увеличения передачи данных, увеличилась и скорость работы.

Что касается cms-систем, то joomla например, уже имеет последнюю версию php после того как вышла версия 3.7 этого движка. Конечно и популярный блоговый движок wordpress тоже может работать на последней версии php, нужно только правильно осуществить этот переход.

Сам движок может и будет работать без проблем, но работоспособность напрямую зависит от настроек параметров вашего хостинга. Все эти настройки необходимо настроить самостоятельно, либо обратиться в службу поддержки хостинга.

В связи с этим, краткая рекомендация. Если вы не дождались ответа от своего хостинг-провайдера, меняйте не задумываясь такой хостинг. Лично я пользуюсь услугами хостинга beget.


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

Что касается администраторов занимающихся только управлением таких сайтов и не имеющих необходимых знаний, то здесь необходимо обратиться к владельцу сайта или к программисту создавшему движок.

Ошибки PHP 7.1 и WordPress

WordPress же уже давно полностью готов и корректно функционирует с PHP 7.1, как и плагины, обновление которых происходит время от времени. Однако если же вы используете какой-либо плагин в WordPress, который обновлялся последний раз года четыре назад, то проблема может возникнуть.

Однако проверяется это достаточно легко – визуальной проверкой функционала, что реализуется плагинами в движке WordPress.

Также для проверки корректности функционирования стоит включить DEBUG режим в WordPress (как его включить), и посмотреть лог файл, который создаётся в случае наличия ошибок

Если в нём будут прописываться ошибки, то стоит обратить внимание на файл и путь к нему, который эту самую ошибку вызывает

Как я уже говорил, WordPress полностью готов к PHP 7.1 и никаких ошибок в логе быть не должно. В моём случае ошибок не было вовсе, причём на всех сайтах, которые я переводил на PHP 7.1. Однако это связанно с тем, что я в своей работе использую малое количество плагинов, и преимущественно популярных, которые время от времени обновляются.

Однако если у вас лог будет писаться ошибка, то стоит найти её причину. Вероятнее всего причиной ошибки (даже если визуально всё работает корректно, как и до перевода на PHP 7.1) будет являться устаревший плагин. В этом случае необходимо подыскать замену старому плагину, который не только не отвечает современным требованиям, но и может являться потенциально уязвимым.

Необходимо понимать, что любой плагин является дополнением к WordPress, который в свою очередь неустанно обновляется сообществом разработчиков. И даже если сейчас всё прекрасно, то в новой версии WordPress может быть упразднена\заменена та или иная функция, и плагин не только не сможет выполнять свои обязанности, но и вовсе «поломает» работоспособность сайта.

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

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

Как узнать версию php

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

Способов проверки достаточно много, самыми простыми являются непосредственно проверка версии php в аккаунте хостинга и второй — создание файла проверки версии php.

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

Для этого создаем файл в любом редакторе со следующим содержимым: <?php phpinfo(); ?> и сохраняем под тем же именем phpinfo.php

Затем данных файл нужно закачать в корень своего сайта и обратиться к нему в адресной строке своего браузера (http://ваш_домен/phpinfo.php).

В результате получим всю необходимую информацию касающуюся не только версии php, но и все что нужно для администратора.

Что лучше использовать – functions.php или плагин?

Чем functions.php отличается от плагина? Если объяснять просто – то ничем.

Разница «плагинов» и «functions.php» в назначении и порядке выполнения. Первым загружается functions.php, плагины подгружаются после, но могут быть отключены через админ-панель. functions.php же загружается всегда. Но если выполнять одинаковый программный код по средством плагина и functions, выполняться они будут одинакового и их место выполнения никак не повлияет на скорость работы сайта.

Процесс подключения functions.php происходит во время инициализации текущей темы, после подключения функций WordPress.

Процесс подключения functions.php

index.php
       wp-blog-header.php
              wp-load.php
                     wp-config.php
                            wp-settings.php
                                   // Подключаются самые базовые функции (подключение к БД $wpdb и система фильтров)
                                   // Подключаются базовые фильтры

                                   // SHORTINIT: Остановка загрузки, где есть только самое базовое: if ( SHORTINIT ) return false;

                                   // подключается вся среда WordPress: базовые функции, фильтры
                                   
                                   // подключаются must-use плагины, затем срабатывает событие:
                                   do_action( 'muplugins_loaded' );
                                   
                                   // подключаются активированные плагины, затем срабатывает событие:
                                   do_action( 'plugins_loaded' );

                                   // устанавливаются глобальные переменные: wp_the_query, wp_query, wp_rewrite, wp, wp_widget_factory, wp_roles ...
                                   
                                   do_action( 'setup_theme' );
                                   // устанавливается текущая тема
                                   // подключается файл темы >>>>>>>>>>>> functions.php <<<<<<<<<<<<
                                   do_action( 'after_setup_theme' );

                                   // событие, когда среда WP, все плагины и тема полностью подключены, но на экран еще ничего не выведено:
                                   do_action( 'init' );
                                   
                                   // проверка статуса сайта для мультисайтовой сборки

                                   // тоже самое что init только после проверки статуса (до этой строки работа PHP может не дойти)
                                   do_action( 'wp_loaded' );
                            
              wp() // заполняет основной запрос WP и все глобальные переменные связанные с ним

              wp-includes/template-loader.php // подключает нужный файл шаблона

Как работает иерархия шаблонов WordPress

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

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

  1. WordPress будет искать файл шаблона под названием category-hosting.php в каталоге текущей темы.
  2. Если файл category-hosting.php не будет найден, WordPress будет искать тот, который использует идентификатор категории, например, category-2.php.
  3. Если WordPress не найдёт ни одного из этих параметров, он будет искать общий файл category.php.
  4. Если же и файл с именем category.php не будет найден, WordPress откатится назад и будет искать шаблон archive.php.
  5. Наконец, если все остальные действия закончатся безуспешно, платформа загрузит файл index.php вашей темы и будет использовать его в качестве шаблона страницы.

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

Какая версия PHP для wordpress предпочтительней

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

И все обновления делаются в первую очередь для безопасности, а уж потом — для улучшения функционала. Найдя брешь в коде любого движка (wordpress, joomla, opencart и пр.), разработчики всегда ее ликвидируют и на основе этого выходит новая версия php для wordpress и других cms-систем.

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

Расскажу один случай из моей практики. Ко мне обратился администратор сайта из Германии и попросил объяснить ситуацию с обновлением Joomla.


Когда я разобрался, причина оказалась проста до безобразия. Форма контактов была создана с помощью стороннего компонента. И как потом оказалось, разработчики данного компонента перестали его поддерживать и соответственно, версия php этого расширения была уже старовата (5.6).

А так как обновленная cms-joomla работает уже на версии php 7.1, то и форма контактов стала выдавать ошибку.

Этот случай не единичный, такое происходит повсеместно из-за упущения самих администраторов сайтов.

Поэтому версия php для wordpress должна быть не ниже 7.0, иначе большинство расширений просто не будут работать.

Почему вы должны перейти на PHP 7+

PHP 7.2 теперь не только официально включен в список рекомендуемых требований для WordPress , но и имеет множество преимуществ в плане скорости, производительности и безопасности .

1. Скорость и производительность

Если ваш сайт работает на более старой версии PHP, обновление до последней версии даст вам немедленный прирост производительности — больше, чем любая другая настройка сайта WordPress.

Когда был выпущен PHP 7.0, он получил признание за значительный прирост производительности. Фактически, официальный тест PHP с использованием WordPress 4.1.1 показывает, что PHP 7.0 позволяет серверам выполнять вдвое больше запросов в секунду, чем PHP 5.6 с вдвое меньшей задержкой.

Мы недавно публиковали тесты производительности, сравнивая PHP 5.6, PHP 7.0, PHP 7.1, PHP 7.2 и PHP 7.3. Их результаты показывают, что PHP 7.3 выполняет в 3 раза больше запросов в секунду по сравнению с PHP 5.6.

Если вам нужны дополнительные доказательства повышения производительности, есть результаты тестирования, которые показали, что PHP 7.3, выпущенный в конце 2018 года, примерно на 5% быстрее, чем PHP 7.2 ,

2. Поддержка и совместимость

Совместимость — еще одна важная причина, по которой вы должны использовать последнюю версию PHP. Как и в любом программном обеспечении, разработчики будут поддерживать старые версии PHP в своих плагинах и темах только в течение определенного периода времени. Это приведет к тому, что активная поддержка старого программного обеспечения и обеспечение обратной совместимости будет невыгодной для разработчиков плагинов и тем. 

Фактически, проблемы со старыми версиями PHP регулярно возникают на форумах поддержки WordPress.org . Если вы поищете «T_Function», поиск выдаст более 2700 результатов.

Как объясняет Predrag Dubajic, разработчик WPMU DEV, в плагине Hustle ошибки T_Function обычно появляются, когда пользователь имеет устаревшую версию PHP:

3. Безопасность

Еще одна фундаментальная причина, по которой вы должны обновить PHP — это безопасность вашего сайта WordPress. Использование последней версии PHP гарантирует, что ваш сайт защищен от уязвимостей, выявленных в более старых версиях PHP.

Например: согласно данным CVE об уязвимостях безопасности, в этом году в PHP было обнаружено 18 известных уязвимостей. В 2017 году было обнаружено 43 уязвимости, а в 2016 году было обнаружено огромное количество 107 уязвимостей.

Эти уязвимости включают DoS, выполнение кода, внедрение SQL, XSS и многие другие типы эксплойтов.

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

Минимальная версия PHP для плагинов WordPress

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

На сегодняшний день эта запись не делает ничего, кроме выражения намерений автора плагина поддерживать эту версию. Работа ведётся таким образом, чтобы на странице добавления нового плагина отображались все плагины, которые ищет пользователь, но отсутствовала возможность установить те плагины, для которых требуется более новая версия PHP.

Другая задача, над которой работает команда — это блокировка обновлений плагинов, если для новой версии требуется более высокая версия PHP. Это даёт авторам плагинов лучший контроль над тем, какие версии PHP они хотят поддерживать, и, будем надеяться, побудит владельцев сайтов обновить программное обеспечение на сервере.

Изменение позволит авторам плагинов выбирать более современные функциональные возможности и синтаксис PHP, не беспокоясь о том, что их плагин сломается для конечного пользователя.

Чтобы не было ошибок, учитывайте 4 момента:

Пример, у нас была такая структура:

<?php
........здесь код.........
?>

Если Вы добавили php код так, то это вызовет ошибку или, что еще хуже, белый экран, когда показ ошибок отключен:

<?php
........здесь код.........
   <?php
   ...... здесь добавленный код ........
   ?>
........здесь код.........
?>

Правильно так:

<?php
........здесь код.........

   ........ здесь добавленный код ........

........здесь код.........
?>

Такой код вызовет ошибку:

<?php
 ...... здесь код ........
?>
<?php
 ...... здесь добавленный код ........
?>

А этот нет:

<?php
 ...... здесь код ........
?><?php
 ...... здесь добавленный код ........
?>

Логичнее его записать так:

<?php
 ...... здесь код ........

 ...... здесь добавленный код ........
?>

Бывает что перенос строки ставят в самом конце functions.php, вот тогда это становится настоящей проблемой, потому что все казалось бы правильно, но сайт не работает. На самом деле после ?> или  до <?php присутствуют невидимый символ переноса строки \n. Выглядит такая ошибка, крайне безобидно, вот так:

<?php
... начало файла ...
  ...... здесь код ........
... конец файла ...
?>
здесь пустая строчка

По этой причине многие разработчики вообще удаляют закрывающий тег ?>, это допустимо для PHP. Рекомендую всегда делать именно так:

<?php
... начало файла ...
  ...... здесь код ........
... конец файла ...

Если в functions.php присутствует функция, то внутри этой функции можно использовать теги и , например, для того, чтобы визуально выделить HTML код внутри функции:

<?php
... начало файла ...

function function_name(){
	?>
		 <div>это html код</div>
	<?php 
}

... конец файла ...
?>

Дело в том, что в этом случае функция только лишь регистрируется и не выполняет никаких действий. Все что внутри функции (между { }) не работает пока эта функция не будет вызвана, а вызываются такие функции обычно из шаблона или через фильтры, уже после того как отправлены HTTP заголовки. Поэтому в данном примере, мы можем игнорировать переносы строк и использовать ?> и <?php как угодно.

Еще одна заметка касательно файла functions.php: устанавливайте файлу кодировку UTF-8 (UTF-8 без BOM). Иначе, если функции в файле будет текст на кириллице, то он выведется непонятными символами: кракозябрами, каракулями — называйте как хотите.

Статьи до этого: Новичкам

Что такое Цикл WordPress — The Loop

Где PHP используется в WordPress?

Если вы скачаете последнюю версию WordPress с WordPress.org, вы можете открыть ZIP архив и убедиться в том, что большая часть основных файлов WordPress представляю собой PHP файлы.Точно также, любая, установленная вами тема, будет включать в себя кучу PHP файлов (скриншот ниже демонстрирует стандартную тему «Twenty Seventeen»):

Тема Twenty Seventeen

И как вы уже догадались, любые установленные вами плагины также будут включать в себя в основном PHP.

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

Например, одна из самых известных функций -the_content();. Хотя этот фрагмент кода выглядит достаточно невинно, фактически – это то, что использует ваша тема для отображения содержимого всех до единого, постов вашего блога. Да-да, вот этот крошечный фрагмент кода, после обработки веб-сервером кода PHP, может превратиться в пост из 10000 слов.

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

Устаревшие Особенности

PHP 7.4 не поддерживает несколько функций. Авторы плагинов и тем захотят ознакомиться с полным списком, чтобы определить, следует ли обновить какой-либо устаревший код. 

Вложенные тернарные операторы без скобок

Вложенные троичные операторы, как правило, являются тем, что вы должны избегать как разработчик. За ними трудно следить и они подвержены ошибкам. Однако, если вы собираетесь их применять, используйте хотя бы круглые скобки. В PHP 7.4 устарели вложенные троичные операторы без них.

Использование array_key_exists () для объектов

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

Доступ к смещению массива и строки с помощью фигурных скобок

Использование фигурных скобок для доступа к массиву и смещению строк — большая редкость. Убедитесь, что вы используете квадратные скобки, например вместо фигурных скобок .

Проверка расширений на совместимость с php 7

Как ни странно, но для wordpress например, можно установить еще один плагин Compatibility php, который и поможет узнать какие установленные плагины не дают нормально работать системе.

Это отличный и простой способ проверить совместимость вашего сайта с PHP 7. Причем проверить можно практически все, включая тему для wordpress.

Установка стандартная и после этого в панели инструментов появится дополнительная вкладка PHP Compatibility.

Плагин проверит все установленные плагины движка на совместимость что и позволит нам сократить время на поиск несовместимых расширений.

Чтобы внимательно рассмотреть, нажмите мышкой на изображение.

На скриншоте видно, что после нажатия на кнопку «Scan site again», плагин выдал всю информацию по установленным расширения. Наглядно виден разноцветный результат проверки.

Содержимое подозрительных плагинов можно просмотреть нажав на ссылку справа и увидеть адрес этой ошибки.

Таким образом, из установленных 23-х плагинов на блоге, необходимо отключить или удалить всего 3. Тем самым можно обеспечить себе уверенность в том, что обновление php пройдет без проблем.

Если не жалко времени, можно обойтись ручным способом удалить или отключить все плагины, а после настройки сервера на php 7, постепенно включать их по одному и проверять работу.

В этом случае нужно либо помнить все настройки, либо иметь файл с сохраненными настройками.

Заполнение шаблона (интерполяция)

  • {{{data.unescaped}}} — неочищенные данные.
  • {{data.escaped}} — очищенные данные.
  • <# логика #> — обработать js (eval).
Префикс data.

data в шаблоне — это объект исходных данных. В шаблоне нужно использовать именно ключ data.

Чтобы соответствовать структуре данных возвращаемых функциями: wp_send_json_success() и wp_send_json_error(), wp.template оборачивает все полученные данные в переменную data. Поэтому перед каждым параметром в шаблоне нужно указывать data., иначе мы получим ошибку: .

<script type="text/html" id="tmpl-my-template">
   <p>Правильно {{{data.name}}}</p>
   <p>Неправильно {{{name}}}</p>
</script>
Пример шаблона
<script type="text/html" id="tmpl-my-template">

	<p>Это будет просто выведено.</p>

	<p>Выведем значение переменной escapedValue {{data.escapedValue}}.</p>

	<p>Если данные содержат разметку, выводим без экранирования:</p>
	{{{data.unescapedValue}}}

	<p>Когда нужно выполнить какую-то логику.</p>
	<# if ( data.trueValue ) { #>
		<p> Будет выведено, только если data.trueValue = true.</p>
	<# } #>

</script>

С этим читают