WordPress: подключаем javascript в плагине правильно, или скрипты многоразового использования (на примере плагинов jQuery) в плагинах WordPress
В процессе написания плагина AJAX-Read-More пришлось разработать и подключить jQuery плагин, который мне потребовался ещё в нескольких плагинах. Думал над тем, как разумнее его подключить в плагине, чтобы не было проблем при синхронизации версий плагина в том числе и при использовании SVN репозитория WordPress. Придумал, на эту тему и статья.
Структура папок
Для начала опишу структуру папок плагина, к которой пришёл:
- ajax-read-more – папка самого плагина
- ajax-read-more/jquery/ajax/readmore – папка используемого jQuery плагина.
Поясню, для чего вынес сценарий в отдельную папку. Для этого покажу пример повторного использования того же jQuery плагина в другом своём wordpress плагине.
В папке другого плагина создаём папку /jquery/ajax, и для неё (для ajax) устанавливаем свойство svn:externals
в значение ^/ajax-read-more/trunk/jquery/ajax/readmore readmore
(естественно – при условии, что оба плагина связаны с репозиторием плагинов wordpress). После чего выполняем svn действия commit, update – и вуаля, в созданной нами папке уже имеем актуальную версию необходимого нам сценария. Теперь для актуализации версии сценария достаточно сделать update.
Публикация сценария
Расположение сценария в папке плагина – первая часть марлезонского балета. Вторая его часть – публикация сценария на генерируемую страницу сайта. Сразу приведу своё решение, затем – несколько аргументов в его пользу.
Итак, в папке сценария (ajax-read-more/jquery/ajax/readmore) создаём php файл, лучше – с тем же именем, что и файл сценария. В моём случае — jquery.ajax.readmore.php:
<?php add_action('wp_enqueue_scripts', 'jquery_ajax_read_more_wp_enqueue_scripts'); function jquery_ajax_read_more_wp_enqueue_scripts() { wp_register_script( 'jquery.ajax.readmore', WP_PLUGIN_URL . '/' . dirname(plugin_basename(__FILE__)) . '/jquery.ajax.readmore.js', array('jquery'), '2.0.3', get_option('options-script-position') == 'footer' ); wp_enqueue_script('jquery.ajax.readmore'); }; ?>
Как видно, в описываемом файле “цепляюсь” на “событие” wp_enqueue_scripts
, и публикую сценарий. Вынес публикацию в отдельный файл по одной причине по сути – из-за версии сценария. Обратите внимание на 4ый параметр wp_register_script
. Если Вы не укажете значение этого параметра явно, будет использована версия wordpress, а причём здесь версия wordpress и версия нашего сценария? Указанная Вами версия будет фигурировать в url до файла сценария при генерации страницы, что позволяет исключить проблемы, связанные с использованием кэшированных версий сценария при его обновлении. Как только Вы укажете новую версию в 4ом параметре, url будет изменён, и клиенту будет загружена новая версия.
Прелесть приведённого варианта именно в том, что при “подключении” данного сценария в другой плагин через описанный механизм в предыдущем разделе будет синхронизирована версия не только самого сценария, но и данного .php файла.
Публикация сценария в коде плагина теперь выглядит следующим образом:
add_action('init', 'ajax_read_more_init'); function ajax_read_more_init() { ... if(!is_admin()) { ... require_once('jquery/ajax/readmore/jquery.ajax.readmore.php'); ... }; };
Вариант с require_once
вместо require
выбрал из следующих соображений: если сценарий уже опубликован (темой ли, или другим плагином) – то зачем же повторно пытаться его публиковать? Безусловно, wordpress ничего плохого при повторной регистрации не сгенерирует, но зачем же создавать проблемы, если можно их и не создавать?
Вот такое вот решение выношу на Ваш суд, коллеги. Ещё один маленький шаг в рамках выработки оптимальных решения для собственного framework для плагинов wordpress.
P.S. безусловно, могут быть сложности, если на одном блоге окажутся несколько плагинов, в которых версии одного и того же сценария будут разными. При предложенном решении будет опубликована только одна из них, несмотря на версию. Я ещё с кодом wordpress поразбираюсь, возможно – есть смысл вернуться к require
с унификацией имени функции и дополнительными проверками на повторное включение .php файла. Под унификацией имени фукнции подразумеваю следующее:
<?php add_action('wp_enqueue_scripts', 'jquery_ajax_read_more_wp_enqueue_scripts_2_0_3'); function jquery_ajax_read_more_wp_enqueue_scripts_2_0_3() { wp_register_script( 'jquery.ajax.readmore', WP_PLUGIN_URL . '/' . dirname(plugin_basename(__FILE__)) . '/jquery.ajax.readmore.js', array('jquery'), '2.0.3', get_option('options-script-position') == 'footer' ); wp_enqueue_script('jquery.ajax.readmore'); }; ?>
Лямбда функции решили бы эту проблему куда изящнее, но они требуют PHP 5.3, что пока есть не везде.
RSS комментарии
Обратная ссылка