В процессе написания плагина AJAX-Read-More пришлось разработать и подключить jQuery плагин, который мне потребовался ещё в нескольких плагинах. Думал над тем, как разумнее его подключить в плагине, чтобы не было проблем при синхронизации версий плагина в том числе и при использовании SVN репозитория WordPress. Придумал, на эту тему и статья.


Структура папок

WordPress: подключаем javascript в плагине правильно, или скрипты многоразового использования (на примере плагинов jQuery) в плагинах WordPress Для начала опишу структуру папок плагина, к которой пришёл:

  • ajax-read-more – папка самого плагина
  • ajax-read-more/jquery/ajax/readmore – папка используемого jQuery плагина.

Поясню, для чего вынес сценарий в отдельную папку. Для этого покажу пример повторного использования того же jQuery плагина в другом своём wordpress плагине.

WordPress: подключаем javascript в плагине правильно, или скрипты многоразового использования (на примере плагинов 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, что пока есть не везде.

Опубликовать комментарий

XHTML: Вы можете использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags Связь с комментариями статьи:
RSS комментарии
Обратная ссылка