Шорткоды — это специальный размеченный код, который помещается в записях для вызова какого-либо дополнительного содержимого. Тэг [ gallery ], к примеру, является шорткодом. В WordPress существует возможность создания своих собственных шорткодов, благодаря которым можно расширить имеющийся функционал, что идеально подходит для «неблоггерских» сайтов. Добавить шорткод можно посредством плагинов или при помощи файла functions.php.
Добавление шорткода при помощи файла functions.php
1. Начнем с создания простого шорткода, который будет выводить произвольный текст.
2. Для начала добавим в файл functions.php новую функцию.
function text_example() { return 'Why, this text was just output using the shortcode tag you created! Smashing.'; }
3. Теперь привяжем эту функцию к шорткоду:
add_shortcode('textftw', 'text_example');
Таким образом, мы создали шорткод [textftw], связанный с функцией text_example. В каком бы месте этот шорткод не был размещен, он выведет текст сообщения ‘Why, this text was just output using the shortcode tag you created! Smashing.’ Теперь пойдем дальше и создадим шорткод для продвижения своего RSS фида.
4. Добавим функцию, выполняющую продвижение:
function rss_promotion() { return '<div class="rsspromot">Never miss a beat - <a href="http://notesblog.com/feed/"> subscribe to the RSS feed!</a></div>'; }
5. Привяжем созданную функцию к шорткоду:
add_shortcode('rsspromo', 'rss_promotion');
6. Теперь мы получили шорткод [rsspromo], который вставляет вместо себя div контейнер. Можно выполнить его стилизацию:
div.rsspromo { background: #eee; Border: 1px solid #bbb; color: #444; font-size: 16px; font-style: italic; } div.rsspromo a { font-weight:bold; font-style:normal; }
Плавающий текст
Следующий пример демонстрирует одну интересную особенность, присутствующую в теме Notes Blog Core. Шорткод [pull], определенный ниже, позволяет управлять выравниванием какого-либо текстового блока:
function pullquote( $atts, $content = null ) { extract(shortcode_atts(array( 'float' => '$align', ), $atts)); return '<blockquote class="pullquote ' . $float . '">' . $content . '</blockquote>'; } add_shortcode('pull', 'pullquote');
Фактически, данный пример похож на предыдущие, однако, за одним исключением. Здесь мы извлекаем массив shortcode_atts(), в котором часть $content = null сообщает, что данный шорткод должен быть закрыт. Весь контент располагается между открывающим и закрывающим тегами шорткода. Единственный параметр, который сейчас определен — это float. Опытные дизайнеры знают, что классы alignleft и alignright определяют стандартное выравнивание в WordPress. При использовании шорткода пользователь самостоятельно устанавливает требуемое выравнивание, например: [ pull float=»alignright» ]My text[ /pull ]. Эта строка будет интерпретирована следующим образом:
<blockquote class="pullquote alignright">My text</blockquote>
Удобное решение для людей, не желающих вручную редактировать HTML-код. Если вам понадобятся иные атрибуты, отличные от float, вы всегда можете добавить их в массив и затем вызвать в нужном месте.
Вложенные шорткоды
При помощи шорткодов можно создавать различные интересные структуры, например:
[shortcode-1] [shortcode-2] [/shortcode-2] [/shortcode-1]
Здесь действуют те же самые правила, что и в HTML-коде. Следующий участок кода будет выполнен с ошибками:
[shortcode-1] [shortcode-2] [/shortcode-1] [/shortcode-2]
Однако, для того чтобы структура из шорткодов могла правильно работать, необходимо разрешить вложенные шорткоды, что осуществляется функцией do_shortcode(). В рамках примера c [pull] это будет выглядеть следующим образом:
function pullquote( $atts, $content = null ) { extract(shortcode_atts(array( 'float' => '$align', ), $atts)); return '<blockquote class="pullquote ' . $float . '">' . do_shortcode($content) . '</blockquote>'; } add_shortcode('pull', 'pullquote');
Помните, что шорткоды работают только в пределах содержания, поскольку они напрямую связаны с тегом шаблона the_content(). Однако, имеется способ расширить границы их применимости, что осуществляется при помощи использования do_shortcode() и добавления фильтров. Почему бы нам не добавить поддержку шорткодов к зонам виджетов?
Следующий пример позволяет добавить поддержку шорткодов к виджету, отвечающему за вывод произвольного текста:
add_filter('widget_text', 'do_shortcode');
Здесь мы подцепляем функцию do_shortcode() к функции widget_text() посредством фильтра.
Подробнее о шорткодах и их API можно узнать в кодексе: codex.wordpress.org/Shortcode_API.
Интересно, а как заставить работать вне поста плагины jquery collapse-o-natic, и cforms? У этих плагинов тоже есть шорткоды!