Правильный способ модификации плагина
Какой самый лучший способ модифицировать плагин? Я часто хочу внести небольшие изменения в одну или две функции в большом плагине. Это легко сделать, но мне приходится использовать комментарии для пометки моих изменений и модифицировать плагин снова после обновления. В идеале я хотел бы оставить плагин в покое и внести свои изменения в другом месте, как мы делаем с темами и дочерними темами. Могу ли я создать плагин, который будет зависеть от родительского плагина и переопределять его функционал?
«Правильный» способ, очевидно, зависит от плагина. Некоторые плагины легче редактировать, чем другие, но большинство плагинов можно фактически модифицировать с помощью других плагинов.
Например, если плагин имеет функцию, подключенную к WordPress через действие (action), то для вас не составит труда создать другой плагин, который отключит эту функцию с помощью remove_action, а затем добавит вашу заменяющую функцию. Такой метод позволит вам заменить отдельные функции в плагинах своими модифицированными версиями, не изменяя исходный плагин.
Тот же принцип, очевидно, работает и с фильтрами (filters).
По моему мнению, лучший подход — либо форкнуть плагин для поддержки ваших изменений, либо отправить патчи разработчику плагина, чтобы ваши изменения стали частью оригинального плагина.
Создание "дочернего плагина" — не такая простая задача. Концепция "дочерней темы" в основном относится к файлам шаблонов, которые используются, а не к функциям темы (и на самом деле, файлы functions.php из родительской и дочерней темы загружаются оба, что действительно вызывает проблемы при некорректном кодировании functions.php в любой из тем).
Типы изменений, которые я вношу, специфичны для данного сайта, поэтому я не думаю, что форки или отправка патчей будут уместны. Я обязательно учту эти варианты для более общих улучшений плагинов.
Mike Wheaton
Лучшим способом будет просто клонировать его, изменить название плагина в заголовке и изменить имя директории. Таким образом, у вас также может быть оригинальная версия установленной, но не активированной, и вы по-прежнему будете получать уведомления о выходе обновлений.
<?php
/*
Plugin Name: Название плагина
Plugin URI: http://URI_страницы_с_описанием_плагина_и_обновлений
Description: Краткое описание плагина.
Version: Версия плагина, например: 1.0
Author: Имя автора плагина
Author URI: http://URI_автора_плагина
License: "Слаг" названия лицензии, например GPL2
*/
?>
Это все равно требует просмотра новых версий плагина для поиска изменений (я предполагаю, что инструмент сравнения версий может помочь), а затем копирования этих изменений в мой кастомный плагин.
Полагаю, я мог бы скачать плагин и использовать SVN для слияния изменений с моей кастомной версией.
Mike Wheaton
На странице плагина есть прямая ссылка на diff-файл в логе разработки. Например, вот diff, сгенерированный для W3 Total Cache
Chris_O
Это относительно просто, если плагин находится под управлением системы контроля версий Git, благодаря её распределённой природе. Однако многие плагины WordPress (и все из официального репозитория) используют Subversion. Я использую vendor branches и svn_load_dirs.php, если мне действительно необходимо изменить плагин, но для этого требуется достаточно высокий уровень комфорта с Subversion.
Если плагин не предоставляет репозитория, я рекомендую преобразовать его в репозиторий Git самостоятельно и вручную применять новые версии.
В конечном итоге, системы контроля версий — это единственный разумный способ повторного применения изменений к новым версиям исходного кода.
Я согласен с ответом Анники Бэкстром, но хотел бы поделиться своим предпочтительным решением.
Так как большинство плагинов находятся под SVN, я использую инструмент git-svn для создания git-зеркала.
Затем я просто создаю ветку и фиксирую там свои изменения.
Когда плагин обновляется в основном репозитории, я просто забираю изменения из SVN-репозитория и мержу их в свою пользовательскую ветку.
Если это еще не было упомянуто, вы можете заменить любую функцию, которая была сделана заменяемой (pluggable). Заменяемые функции выглядят следующим образом:
if (! function_exists('function_name')) {
function function_name() {
//...
}
}
Затем вы можете просто переопределить функцию самостоятельно (в файле functions.php, используя плагин Code Snippets или в своем собственном плагине).
К сожалению, большинство плагинов не делают свои функции заменяемыми; в лучшем случае, только некоторые из их функций являются заменяемыми.
Ты имеешь в виду, что можно переопределить конкретную функцию в плагине своей собственной функцией и при этом продолжать получать обновления плагина?
johny why