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

Зависимости в WordPress

При создании чего-либо никогда не бывает эффективно изобретать велосипед. В программировании люди приняли эту концепцию и создали библиотеку инструментов на многих языках. Мы называем эти инструменты «зависимостями». Инструмент, который предоставляет библиотеку зависимостей, релевантных в этом контексте, — это Composer, менеджер зависимостей для PHP.

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

к содержанию ↑

Проблема

Представьте себе сайт WordPress с двумя плагинами; «Плагин A» и «Плагин B». Оба они используют зависимость «большая / зависимость». «Плагин A» требует версии v1.0, «плагин B» намного новее и требует версии v3.0. Это приведет к проблемам, если функции, классы или константы были определены в обеих версиях, но имеют разную функциональность. В PHP вы можете определить только класс и, таким образом, загрузить только одну версию. Ваш код ожидает класс из версии v1.0, но из-за порядка загрузки v3.0 может быть первым активным классом.

к содержанию ↑

Решение

Есть два пути решения этой проблемы:

  1. Использование Composer в качестве централизованного инструмента управления зависимостями для управления всеми зависимостями во всей установке WordPress.
  2. Убедитесь, что каждый плагин имеет вариацию зависимостей с уникальными именами для всех используемых классов, функций или констант (например, CustomPrefixSomePackage вместо SomePackage).

Первое решение требует некоторых изменений в основном коде WordPress и поэтому нереально для большой группы текущих пользователей. Некоторые инструменты помогут вам установить и настроить установку WordPress с помощью Composer для управления всеми зависимостями (плагины, темы, инструменты, которые вы хотите использовать для своего пользовательского кода). Мы настоятельно рекомендуем изучить доступные в настоящее время параметры и использовать единое централизованное место для управления зависимостями. Это даст вам полный контроль и понимание кода, который вы используете для запуска своего сайта.

Второе решение — преобразование зависимостей, которые вы используете, в вариант, который вы используете в своем коде, — это часть, о которой я подробно расскажу в этом посте.

Реализация в WP Post Rating полностью совместима с обоими путями решения и дает накладные расходы.

к содержанию ↑

Почему мы это делаем сейчас?

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

WordPress увеличил минимальную версию PHP с 5.2 до 5.6 в выпуске WordPress 5.2. Это открывает мир библиотек и инструментов, которые мы можем и хотим использовать в нашем программном обеспечении. Инструменты и библиотеки, которые были стандартным решением для проектов, на которые не накладывалось ограничение PHP 5.2.

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

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

к содержанию ↑

Как нам это сделать?

Реализация имеет три различных окружения, на которые она влияет:

  1. Выпуск плагина Composer
  2. Выпуск плагина WordPress.org
  3. Развитие

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

Выпустить как пакет Composer

Мы добавили необходимые нам зависимости в нашу конфигурацию Composer:

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

Релиз на WordPress.org

Чтобы подготовить пакет, который будет выпущен на WordPress.org, мы создаем артефакт плагина, который развертывается в репозитории WordPress.

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

Для JavaScript это означает уменьшенные версии файлов, для CSS это означает скомпилированные версии вместо исходных файлов (Sass). Для зависимостей это означает вариант с уникальным именем для всех классов, функций и констант в этих зависимостях.

Используемые инструменты:

  • Webpack — Создает файлы JavaScript и минимизирует их.
  • SASS — Создает файлы CSS.
  • Humbug’s PHP Scoper — Изменяет зависимости, чтобы сделать их уникальными.
к содержанию ↑

Префикс кода: PHP Scoper

PHP Scoper предоставляет возможность выполнять модификации кода. Он специально создан для «префикса всех пространств имен PHP в файле / каталоге, чтобы изолировать код, связанный в PHAR».

PHAR — это исполняемые файлы PHP, которые также живут в экосистеме, где нет глобальной системы управления зависимостями.

PHP Scoper поможет вам со следующими задачами:

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

Создание артефакта состоит из следующих шагов:

  • Создание папки с артефактами (artifact)
  • Создание ресурсов (JavaScript и CSS и минимизация изображений). См. Альтернативная установка NPM
  • Копирование всех необходимых файлов в папку артефактов.
  • Добавление префиксов к зависимостям
    • Создание зависимостей с префиксом в папке vendor_prefixed.
    • Удалите зависимости без префикса из конфигурации Composer.
    • Скопируйте папки vendor_prefixed и vendor в артефакт.
к содержанию ↑

Исключение: интерфейсы PSR

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

к содержанию ↑

Разработка плагина

Во время разработки мы хотим иметь возможность использовать зависимость, используемую при установке WordPress.org, а также при установке плагина Composer.

Чтобы он работал в обеих ситуациях (с Composer и без него), мы динамически добавляем псевдонимы PHP для классов и интерфейсов, которые начинаются с определенного префикса. Это позволяет нам всегда ссылаться на версию класса с префиксом в коде, даже если загружен вариант без префикса (через Composer).

Плагин рейтинга создан автором этого блога. Буду очень признателен, если вы сможете его поддержать (ссылка)

p.s. Если статья была полезной и вас переполняет чувство благодарности, можете поддержать меня долларом на патреоне

Об авторе

Web Developer. I have expirience in FrontEnd, Backend, Devops. PHP, Python, Javascript (Vue.js, React.js)

Смотреть посты