7-мая версия PHP увидела свет в недавнем 2015 году. Новый виток в развитии этого языка программирования принес много возможностей для всех тех, кто использует PHP . Среди преимуществ новой версии следует выделить скорость. Так, по данным разработчиков, скорость работы скриптов на PHP 7 , по сравнению с предыдущими версиями, возросла почти в два раза. В связи с этим, многие владельцы сайтов, на которых установлены более старые версии PHP , хотят перейти на новую.
Зачем проверять на совместимость?
Следует отметить, что перед тем, как в панели управления Вашего хостинга менять версию PHP на более новую и быструю, необходимо проверить сайт WordPress на совместимость с ней, а именно темы и плагины. Такая необходимость возникает из-за того, что обычно в новых версиях программного обеспечения какие-то функции добавляются, а некоторые вообще перестают существовать. Если в каком-то плагине или теме используется несуществующие в новой версии функции или методы, то это привет к ошибке, что может нарушить работу сайта в целом.
Как проверить на совместимость с PHP 7.0?
Плагин PHP Compatibility Checker
Плагин PHP Compatibility Checker позволяет просканировать весь сайт и указать, какие из его компонентов (темы, плагины) не совместимы с выбранной версией PHP . Для начала необходимо его установить и активировать, после чего в админ-панели перейти Инструменты -> PHP Compatibility .
Как видим, плагин предлагает весьма понятные настройки. Для начала проверки необходимо выбрать версию PHP , на совместимость с которой хотите проверить сайт (блок PHP Version ). Удобной функцией плагина является выбор статуса проверяемых компонентов. Доступны на выбор два варианта: либо проверять среди активных тем и плагинов, либо в неактивных (поле Plugin / Theme Status ). Для старта проверки нужно нажать кнопку Scan site again .
Результат проверки также можно загрузить в текстовом файле, нажав для этого кнопку Download Report .
Я относительно часто публикую различные сниппеты для WordPress, которые сильно упрощают жизнь. И почти всегда я акцентирую внимание на том, как правильно их подключить.
Конечно, проще и привычнее пойти традиционным путем и тупо вставить сниппет в файл functions.php вашей активной темы. Но в 9 из 10 случаев будет целесообразнее и правильнее вынести код сниппета в отдельный плагин . В крайнем случае, добавить его в специальный функциональный плагин вашего сайта. Т.н. Site-Specific WordPress Plugin , в котором-то и будет храниться весь дополнительный функционал вашего сайта.
Зачем это нужно
Поясню на простом примере. Допустим, вы разработали сайт со сложной структурой, массой кастомных типов данных, таксономий, фильтров, меню, с поддержкой огромного количества произвольных полей и пользовательских настроек. Всю кастомизацию, как и подобает в таком случае, вы разместили в файле functions.php . Все хорошо, но пройдет какое-то время, и перед вами встанет задача редизайна. Вы захотите сменить или разработать новую тему. Тогда-то и начнутся проблемы. Потому что весь функционал сайта, интегрированный в старую тему, отключится вместе с ней.
Как же быть
Нужно понять простую истину. В файле функций темы должны располагаться только функции, относящиеся к дизайну вашего сайта. Конкретно к той теме, файл функций которой редактируется. А вся т.н. «механика», рабочий функционал сайта и все его кастомизации правильнее размещать в плагинах. Или в одном плагине. Тогда при смене темы, он останется нетронутым.
Создаем специальный плагин функций WordPress
На самом деле, все делается очень просто.
- В директории плагинов вашего WordPress создаете папку. Например: /wp-content/plugins/mysite-plugin/ ;
- Создаете в этой папке файл, назвав его, к примеру, my-plugin.php ;
- Вставляете в этот файл примерно такой код:
- Переходите в настройки управления плагинами и активизируете свой новый плагин.
Заголовок, описание и комментарии к коду можно заменить на свои. Теперь все необходимые сниппеты и кастомизацию вы можете размещать в этом плагине. Не боясь потерять функционал сайта при очередной смене активной темы.
На этом можно и остановиться, но с моей стороны было бы не совсем правильно не упомянуть про т.н. MU-плагины .
MU-плагины (Must Use Plugins)
MU-плагины бывают очень полезны в случаях, когда отключение плагина недопустимо и может вызвать критические ошибки в работе сайта. Например, на клиентских сайтах. Во-избежании некорректных действий клиента в консоли управления сайтом.
MU-плагины - это плагины обязательного использования WordPress, которые устанавливаются в специальную директорию и всегда активны. MU-плагины не отображаются в общем списке плагинов сайта, для них существует отдельная вкладка. Их возможно отключить лишь непосредственно удалив файл MU-плагина из директории.
Преимущества MU-плагинов
- MU-плагины не нужно активировать, они всегда активны, их невозможно отключить в консоли управления сайтом;
- MU-плагин подключается и активируется банальной закачкой файла плагина в директорию mu-plugins;
- MU-плагины загружаются в алфавитном порядке перед загрузкой обычных плагинов.
Обратите внимание, поддиректории у MU-плагинов, в отличие от обычных, не поддерживаются. В крайнем случае можно создать плагин и написать в нем простенький загрузчик, который будет загружать плагины из директорий. Примерно, так:
В заключение
Как видите, ничего принципиально сложного в использовании функциональных плагинов нет. А преимущества их использования налицо. Мне не раз приходилось слышать такое мнение, что плагины создают на сайт какую-то неимоверную нагрузку. У многих пользователей существуют некие предубеждения о вреде использования плагинов. Это не совсем верно. Вред могут нанести левые, неизвестно кем разработанные и неизвестно откуда скачанные плагины. Плохая оптимизация работы плагина, использование устаревших функций PHP и WordPress. Вред может быть от большого количества одновременно работающих плагинов. Особенно с дублирующим функционалом. Возможен и банальный конфликт плагинов, плагинов с темой. А при грамотном и разумном подходе, плагины принесут вашему сайту исключительно пользу .
Подпишитесь на мой телеграм и первыми получайте новые материалы, в т.ч. которых нет на сайте.
Плагины - это способ расширить функциональность приложения без изменения его исходного кода. Функции, реализованные плагином, продолжают работать после установки обновлений приложения, когда перезаписываются его файлы. Исходный код плагина оформляется в независимых файлах, которые лишь подключаются к приложению.
Локализация
Локализация плагинов реализуется полностью аналогично локализации приложений (документация). В папке locale следует разместить файлы переводов *.po и *.mo и подключать ключи в коде следующим образом:
- _wp("string") в PHP (вместо метода _w(), который работает только с локализацией приложения, следует использовать метод _wp(), подгружающий локализацию плагина),
- [`string`] в шаблонах Smarty (здесь нет отличий от локализации приложений).
Название и описание плагина (name и description в конфигурационном файле) переводятся с использованием локализации плагина по умолчанию, таким образом указывать "name" => _wp("НАЗВАНИЕ ПЛАГИНА") не надо - достаточно просто указать "name"=>"НАЗВАНИЕ ПЛАГИНА" .
Использование локализации в статических методах
В случае вызова публичных статических методов классов плагина во внешнем окружении, например, в коде темы дизайна, локализация плагина автоматически не подключается, и функция _wp() не возвращает перевод строки, как ожидалось. Для того чтобы использовать локализацию плагина в таких методах, необходимо помещать все вызовы функции _wp() внутри специальной конструкции, выделенной жирным шрифтом в показанном ниже примере:
Class appMyPlugin extends waPlugin { public static function displayData() { //в обеих строках укажите ID приложения и своего плагина waLocale::loadByDomain(array("app_id", "plugin_id")); waSystem::pushActivePlugin("plugin_id", "app_id"); $result = _wp("..."); waSystem::popActivePlugin(); return $result; } }
База данных
Если плагин использует собственные таблицы в базе данных, то имена таблиц должны начинаться с фрагмента вида __ , например: shop_ebay_ tablename .
Подключение плагина
Для того чтобы написанный плагин заработал, необходимо подключить его в системном конфигурационном файле приложения wa-config/apps/ APP_ID/plugins.php , добавив в него строку:
"plugin_id" => true
Пример этого файла для приложения «Блог» (wa-config/apps/blog/plugins.php):
true, "tag" => true, "category" => true, "gravatar" => true, "favorite" => true, "troll" => true,);
В этом же файле можно отключить ненужные плагины.
install.php и uninstall.php
Если при установке плагина требуется выполнить какие-то нестандартные действия (например, добавить новые поля в существующие таблицы приложения), то логику таких действий необходимо описать в конфигурационном файле lib/config/install.php . Пример добавления дополнительного поля в таблицу при установке плагина:
$model = new waModel(); try { $model->query("SELECT `custom_field` FROM `shop_product` WHERE 0"); } catch (waDbException $e) { $model->exec("ALTER TABLE `shop_product` ADD `custom_field` INT(11) UNSIGNED NULL DEFAULT NULL"); }
Действия, которые нужно выполнить при удалении плагина, аналогичным образом описывайте в файле lib/config/uninstall.php .
Создание и удаление собственных таблиц плагина в файлах install.php и uninstall.php описывать не нужно — таблицы автоматически создаются и удаляются на основании содержимого другого конфигурационного файла: db.php . См. « ».
Пример
Плагинная платформа была внедрена во фреймворк вместе с приложением «Блог », поэтому для дальнейшего изучения рекомендуем установить это приложение и рассмотреть плагины, написанные для него (плагины устанавливаются через «Инсталлер»). Для «Блога» написаны плагины различной направленности и практического применения: для фронтенда, бекенда, расширяющие возможности пользовательского интерфейса, выгрузки данных и пр.
Приветствуют, друзья. Сегодня мы с вами разберемся в том, как заставить работать любой PHP код в виджетах, статьях и на страницах WordPress. По умолчанию такая функция в этой CMS недоступна и максимум, на что может рассчитывать пользователь – это внедрение HTML кода.
Почему PHP код не работает по-умолчанию
Казалось бы, почему разработчики не наградили столь популярный и удобный движок полезными возможностями по автоматическому исполнению PHP кода. Поначалу я задумывался об этом, но пришел к выводу, что такая политика ведется с позиции безопасности, ведь, неумелое применение PHP в виджетах или внутри записей может привести к непоправимым последствиям – в базе данных что-нибудь нарушится и весь сайт крякнет.
Поэтому, работа с PHP отдана на откуп программистов или людей более менее продвинутых в этом вопросе – непосредственно в файлах любые скрипты исполняются.
Для публичных сайтов (там, где несколько авторов) исполнение PHP в теле статьи повышается риск умышленного саботажа, так как любой автор может получить полный доступ к сайту через окно редактирования статей.
По степени опасности я бы разделил всю эту ситуацию на 3 уровня:
- Оставить все как задумали разработчики – безопасно, случайно или умышленно повредить сайт сложно.
- Разрешить исполнение PHP в виджетах – средний уровень опасности, только администратор сайта имеет доступ.
- Применение кода везде – опасно, так как управлять сайтом может каждый кто допущен к редактированию статей и страниц (модераторы, авторы)
Для чего нужен PHP в виджетах
Вопрос индивидуальный, так как реализовать с помощью этого языка программирования можно все что угодно. Лично меня к написанию этого поста подтолкнул заказ клиента, сайт которого я сейчас делаю. На нем необходимо было вывести в сайдбаре в отдельном виджете список новостей из одной рубрики – «Новости». В стандартных виджетах WordPress нет такой возможности.
Вопрос стоял между поиском плагина с соответствующими возможностями или применением несложного PHP кода. Скрипт для такой задачи, действительно, небольшой и нагружать сайт лишним плагином, который больше нигде использоваться не будет, не хотелось.
В целом, разрешая исполнение PHP, мы можем решить 2 задачи:
- Заменить часть плагинов сайта на скрипты и снизить таким способом нагрузку на хостинг;
- Реализовать функции, для которых плагинов пока не существует.
На первом этапе я расскажу о виджетах, а потом, отдельным блоком про вывод кода в контенте.
Плагины для PHP в виджетах
Преимущество плагинов: При смене темы оформления WordPress не нарушается работа функций добавленных в шаблон, все продолжает работать не требуя вмешательства вебмастера. Хуки добавленные в шаблон при смене темы придется переносить на новую вручную.
В моем примере выше, я делаю сайт для клиента и, если он захочет самостоятельно сменить дизайн, то пропадут настройки, которые сделаны через файлы functions.php и др., поэтому я максимально упрощаю ему управление сайтом, опираясь на плагины (тем более, в его нише трафик невелик и нагрузки много не будет).
PHP Code Widget
Этот плагин я давно использую в своей работе, он добавляет в список доступных виджет, похожий на обычный текстовый, только способный обрабатывать кроме текста и HTML еще и PHP.
PHP Code Widget присутствует в официальном репозитарии WordPress, легко находится по названию. Как устанавливать такие плагины .
Настроек не требуется, виджет в списке появится сразу после установки и активации плагина. В сайдбар перетаскиваете «PHP Code» и добавляете туда любой скрипт.
PHP в виджете WordPress без плагина
В этом случае нам потребуется хук, который будет подменять стандартную функцию, обеспечивающую работу текстового WordPress виджета, функцией разрешающей обрабатывать PHP.
Такой хук добавляется в файл functions.php текущей темы (в самом конце перед закрывающей скобкой?>). После этого, новых вариантов виджета, как в случае с плагином, не появляется, PHP коды начинают работать в стандартном текстовом.
Готовый код:
Add_filter("widget_text"," text_html_php_widget ",100); function text_html_php_widget($text) { if(strpos($text,"") !== false) { ob_start(); eval("?>".$text); $text = ob_get_contents(); ob_end_clean(); } return $text; }
Первая строка является фильтром, который заменяет при каждом вызове стандартную функцию текстового виджета на новую – text_html_php_widget, а далее идет описание самой новой функции.
Зачем PHP код в статьях и постах WordPress
Внутри записей исполняемый PHP код требуется значительно реже, чем в виджетах, поэтому в первой части статьи я отдельно рассматривал сайдбар, чтобы вы могли не подключать потенциально опасные функции без необходимости.
Но и в постах бывает потребность использования скриптов. Самый частый пример – это вывод карты сайта без плагина. Правда, для карты можно использовать другой приём – сделать специальный шаблон страницы (это отдельная тема).
Мне однажды понадобилось выводить PHP для следующей цели:
Делал я видео сайт. Серии сериала выводились в плейлистах по сезонам и надо было под каждым плейлистом сезона вывести список серий со ссылкой на свою страницу. Похоже на карту сайта, только сложнее – вывод делать надо было списками отдельных рубрик. Можно было вручную HTML кодом каждую ссылку прописать, но там несколько сот серий и процедура муторная. Тем более, при появлении новой серии ссылку на нее пришлось бы добавлять вручную – неудобно. Вот я и решил использовать PHP функции для реализации.
Плагин для исполнения PHP в контенте Exec-PHP
Несмотря на то, что этот плагин не обновлялся уже 7 лет, он прекрасно справляется с обязанностями. И я его выбрал не просто так – он не использует никаких шорткодов, как конкуренты, а дает возможность вставлять в записи WordPress код в чистом виде, начиная с .
Плагин Exec-PHP есть в репозитарии и устанавливается через меню в админке движка.
Из настроек есть только одна – разрешение/запрет на исполнение кода в текстовом виджете, возможности отключить работу в постах и на страницах отсутствует, если надо ее убрать – деактивируем плагин.
Для вставки PHP кода в статью, должен быть переведен в HTML режим (вкладка «Текст»). Визуальный режим, скорее всего, код попортит.
Выполнение PHP кода в статьях WordPress без плагина
По аналогии с виджетами, мы можем заменить плагин на специальную функцию, разрешающую выполнение PHP скриптов в контенте. К сожалению, мне не удалось найти вариант, при котором код работал бы автоматически как в случае с плагином, реагируя на теги. Требуется использование шорткода. Моих познаний в PHP не хватило для самостоятельного написания нужной функции, за сим привожу как есть. Работа с шорткодом имеет существенный недостаток, осложняющий работу, о нем я расскажу ниже.
Как работать с описанной ниже функцией
- Вставляем ее в файл functions.php темы;
- В нужном месте статьи вставляем конструкцию – исполняемый код без
Функция:
/* Запуск php в статьях и страницах WordPress: код */ function start_php($matches){ eval("ob_start();".$matches."$inline_execute_output = ob_get_contents();ob_end_clean();"); return $inline_execute_output; } function inline_php($content){ $content = preg_replace_callback("/\((.|\n)*?)\[\/startphp\]/", "start_php", $content); $content = preg_replace("/\((.|\n)*?)\[\/startphp\]/", "$1", $content); return $content; } add_filter("the_content", "inline_php");
Недостаток
Если внутри вставляемого PHP кода есть HTML вставки или текст, то он работать не будет. Любой текст или теги придется вставлять с помощью команды echo, что не всегда удобно. То есть, код должен быть чисто PHP-шный на 100 правильного формата.
Правильно
Echo "Так работать будет";
Неправильно
Echo "Эта строка правильная"; Так работать не будет
В плагине Exec-PHP такой заморочки нет – и текст и HTML исполнятся, но все элементы PHP кода должны быть обрамлены в соответствующие теги.
Для многих вебмастеров тема, описанная в этой статье открывает бесконечные возможности для творчества – можно реализовать то, чего раньше сделать не получалось, а также избавиться от массы плагинов, заменив их на разные фильтры, функции и хуки.
В этом руководстве мы подробно рассмотрим как создать плагин WordPress со своей собственной страницей администрирования. Характерная особенность любого плагина – это отделение своего кода от кода ядра WordPress. Если с плагином что-то произойдёт, остальная часть сайта будет работать.
- Текстовый редактор
Для выполнения шагов этого руководства вам понадобиться текстовый редактор, например, Notepad++ или среда разработки NetBeans . Также вам нужен доступ по FTP в вашей учётной записи на хостинге и .
Данное плагин WordPress руководство написано для тех, кто уже имеет . По руководству мы создадим новую функцию, вызовем существующие функции WordPress, используя их как параметры.
Что такое плагин WordPress?
Плагин WordPress – это автономный код, который улучшает и расширяет функциональность WordPress. Используя любую комбинацию PHP, HTML, CSS, JavaScript/jQuery или ряда других языков программирования, плагин WordPress может добавить новые характеристики к любой части вашего сайта, включая Консоль Администрирования. Вы можете изменять поведение WordPress по умолчанию или полностью удалять ненужное поведение. Плагины позволяют легко настраивать WordPress под себя и свои потребности.
Поскольку плагин WordPress это отдельный код, он не пересекается непосредственно с какой либо частью кода ядра WordPress. Плагин может быть скопирован или установлен на любую установку WordPress. Альтернативный (и очень не рекомендуемый) путь внесения изменений в WordPress – написание новой функции в файл WordPress functions.php , который находится в каталоге /wp-includes/ или в файл functions.php , который является частью вашей темы. Это может привести к ряду возможных проблем.
WordPress и его темы регулярно обновляются. И пока вы используете дочернюю тему WordPress , очередное обновление будет перезаписывать файл functions.php , а добавленный вами новый код будет удален и придётся его добавлять снова и снова. Ещё один неудобный момент может возникнуть, если вы напишете много функций и в одной из них будет ошибка, которую вы никак не может отследить, вам может потребоваться заменить текущий файл оригинальным, однако при этом придётся пожертвовать всеми остальными функциями. Это повлечёт за собой большое количество PHP-ошибок на сайте, потому как вызовы уже удалённых функций ещё будут осуществляться из других мест.
Плагины же никогда автоматически не перезаписываются и не удаляются при обновлении WordPress. Если в коде вашего плагина WordPress есть ошибки, вы можете просто отключить его в Админ Консоли на время исправления ошибки. В случае, если в вашем плагине серьёзная ошибка, WordPress иногда может самостоятельно автоматически отключить его, чтобы сохранить функционирование всего сайта.
Что такое хук (hook)?
Плагины WordPress взаимодействуют с кодом ядра через так называемые хуки (hooks , от англ. hook – крючок). К ним, как к крючкам можно “цеплять” выполнение каких-либо интересных нам функций. В WordPress есть два вида хуков:
- Action hooks или хуки-события (добавить/удалить пользовательскую функцию к некоторому событию).
- Filter hooks или хуки-фильтры (для изменения данных, обрабатываемых функциями).
События и Хуки-события
Посещение любой страницы WordPress-сайта – это вызов множества функций PHP (называемых событиями – actions ). Функции привязываются к хукам-событиям (action hooks) . Механизм хуков-событий предоставляется WordPress. Вы можете добавлять свои функции к какому-либо событию из списка событий, используя механизм хуков и они будут запускаться по запуску этого события. Вы также можете удалять уже существующие функции из любого списка хуков-событий. Хуки-события привязаны к выполнению определённого события. Например, перед закрытием тега на любой странице, вызывается хук-событие wp_head() и запускается ряд функций, которые привязаны к этому хуку wp_head() .
Добавление функций на хук события, используя add_action()
Чтобы добавить функцию на любой хук-событие, ваш плагин WordPress должен вызвать функцию WordPress под названием add_action() , как минимум с двумя параметрами.
// Хук события "init", вызывается после того, как WordPress завершает загрузку кода ядра add_action("init", "add_Cookie"); // Установка cookie с текущим временем дня function add_Cookie() { setcookie("last_visit_time", date("r"), time()+60*60*24*30, "/"); }
- хука-события (action hook) , к которому собираемся связать свою функцию.
- Второй обязательный параметр – имя функции (function) , которую будем запускать.
- приоритет (priority) функции, которую вы собираетесь запустить. Вы можете привязать сколько угодно функций к одном хуку события и обращаться к ним в любом порядке. Приоритет запуска по умолчанию – 10, ваша функция запускается сразу после встроенных функций WordPress. Функция с приоритетом 11 запустится следующей и так далее.
- количество аргументов , означает сколько параметров ваша пользовательская функция может принять. По умолчанию количество параметров равно 1.
Пример кода плагина для отображения текста после раздела футера (footer) на каждой странице
Этот плагин WordPress перехватывает хук-событие wp_footer() , который вызывается сразу перед закрытием тега