has_shortcode() Инклюд скрипта при наличии shortcode в WordPress


Крупные и функциональные проекты требуют активного использования javascript. Пользователь привык, что сайты работают быстро, без лишних «скачков» по страницам, при этом снабжены всякого рода слайдерами, валидаторами форм, dropdown меню и т.д. Для всего этого добра используется js. Однако, перенасыщение страницы скриптами приводит не только к утяжелению (т.к. каждый скрипт грузится на машину пользователя) но и к нагрузкам, т.к. привычные нам скрипты выполняются на стороне клиента, т.е. пользователя, зашедшего на сайт.

Я хочу рассказать, как мы в SASecurity Group решаем проблему использования большого количества скриптов, в крупных проектах. И, самое главное, не использования их вовсе, в те моменты, когда они попросту не нужны.

Те, кто занимается разработкой под WordPress или просто им пользуется, в курсе, что есть такая полезная сущность, как shortcode (шорткоды). Это конструкции типа [что_то] или [что_то параметр=»что_то»]. Эти самые шорткоды используются для самых разных вещей. Например, вставки видео с youtube, не используя код вставки, а просто обернув адрес видео таким вот шорткодом (правда, для этого нужен плагин).

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

Итак, к делу. Чтобы скрипт не «висел» подключенный на всех страницах, его можно подключать только в тот момент, когда WordPress обнаружил соответствующий шорткод. В остальные моменты его просто не будет. Удобно, не правда ли? При этом, тут нет ничего заоблочного — все давно имеется в кодексе. Как я уже писал, обсуждая современные реалии движка WordPress — он давно вышел за рамки обычного блога.

has_shortcode(); — функция, которая проверяет наличие шорткода. Она то нам и нужна.

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


  • Vladimir Morf

    Вот только вопрос, что делать с Ajax либо с do_shortcode?
    т.е. то, что не входит в сам контент поста, а прописано в контенте шаблона.

    • Вопрос, конечно, интересный. Но немного не в тему, ибо в записи речь идет об инклюде при наличии шорткода. Если говорить про инклюд в зависимости от других обстоятельств, то тут add_filter()/add_action() надо вешать на другие события. На какие? Все зависит от конкретной ситуации. Списки событий так же имеются:

      1. http://codex.wordpress.org/Plugin_API/Action_Reference
      2. http://codex.wordpress.org/Plugin_API/Filter_Reference

      Так или иначе при получении инфо вы используете либо вордпресовский ajax, либо цикл, либо другие функции и всегда можно найти к чему привязаться.

      • Vladimir

        Наверное, плохо выразился. Шорткод может быть вставлен прямо внутрь шаблона через do_shortcode или запись(контент) может подгружаться на страницу через Ajax, но при этом скрипты уже будут вставлены на странице и «по-простому» их не поменять. Ваш вариант через has_shortcode подходит только в самом простом случае. если шорткод вставлен только в запись(контент) и никуда более.

        А если он, к примеру, вставлен в подвал?

        И вроде как action тут не помогут, т.к. анализ нужно произвести до отдачи страницы клиенту.

        Одно из решений представлено тут http://codecanyon.net/item/caretta-shortcodes-system/4977575

        • Ну так о том и речь 🙂 Я отлично понял о чем вы. Просто мое решение именно для использования с шорткодом. Использование функции, обрабатывающей шорткод, с произвольным контентом, посредством do_shortcode — это все же немного другое.

          Другая задача, другие средства реализации)) Может напишу какой-нибудь материал на эту тему. Кстати, по поводу ajax: а как насчет использования ajax вордпресса?

          P.S. приведенное решение интересное, да

          • Vladimir

            использования с шорткодом

            это часть функционала шорткодов в системе, поэтому его нельзя отбрасывать или выделять в другую задачу. Т.к. текущая реализация больно условная.

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