Свои шорткоды для WordPress — как вставить в пост любой php код или функцию

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

С помощью этих кодов можно будет выводить любой контент, динамический или статический – не имеет значения, главное, что это дело можно добавить в любое место при написании поста, а в последствии вносить изменения только в одном месте и не редактировать кучу постов.

Давайте сразу покажу живые примеры, чтобы было понятнее, о чем идет речь. Вот парочка ссылок на мои модули для DLE: LinkEnso PRO, TagFace и CatFace.

Что общего между этими тремя разными страницами? Кроме того, разумеется, что там идет речь о модулях и DLE, на всех этих страницах есть вот такой замечательный блок с картинками и ссылками:

Пример блока, выводимого шорткодом

Этот блок представляет собой не что иное, как обычный html при просмотре исходного кода, и ничем не отличается от простого контента, вставленного при написании поста. Все так и есть, за исключением того, что выводится все это добро при помощи специального кода, который я сам придумал и вставил в пост в удобное место. И чтобы мне что-то исправить или добавить в этот блок, мне надо отредактировать только одну функцию в файле functions.php.

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

Пишем функцию и создаем свой шорткод в WordPress

Решил не катать долго вату, а сразу приступить к делу. А потому идем в редактор внешнего вида своей темы оформления и находим там файл functions.php. Ниже я приведу пример моей собственной функции, которая генерирует то, что вы видели на скриншоте выше.

/*** Вывод списка модулей в любом месте поста ***/
	function my_modules() {
		return '<div style="margin:10px 180px;"><table class="nobrd" cellpadding="0" cellspacing="0" border="0"><tr><th colspan="5" style="padding-bottom:10px;">Команда АлаичЪ\'а трудится непокладая рук и вот что у нас есть для вас:</th>
	</tr><tr>
		<td><img src="https://alaev.info/wp-content/uploads/2011/03/sitemap.png" alt="HTML SiteMap" title="HTML SiteMap" width="100" height="100" class="nobrd alignnone size-full"></td>
		<td><img src="https://alaev.info/wp-content/uploads/2011/05/catface.png" alt="CatFace" title="CatFace" width="100" height="100" class="nobrd alignnone size-full"></td>
		<td><img src="https://alaev.info/wp-content/uploads/2011/11/snvote-v.1.1.png" alt="SNVote" title="SNVote" width="100" height="100" class="nobrd alignnone size-full"></td>
		<td><img src="https://alaev.info/wp-content/uploads/2012/03/linkenso.png" alt="LinkEnso" title="LinkEnso" width="100" height="100" class="nobrd alignnone size-full"></td>
		<td><img src="https://alaev.info/wp-content/uploads/2012/06/tagface.png" alt="TagFace" title="TagFace" width="100" height="100" class="nobrd alignnone size-full"></td>
	</tr><tr>
		<th><a href="https://alaev.info/blog/post/1974">SiteMap</a></th>
		<th><a href="https://alaev.info/blog/post/2086">CatFace</a></th>
		<th><a href="https://alaev.info/blog/post/2435">SNVote Free</a><br /><a href="https://alaev.info/blog/post/2836">SNVote PRO</a></th>
		<th><a href="https://alaev.info/blog/post/3322">LinkEnso Free</a><br /><a href="https://alaev.info/blog/post/3982">LinkEnso PRO</a></th>
		<th><a href="https://alaev.info/blog/post/3857">TagFace</a></th>
	</tr></table></div>';
	}
	add_shortcode('DLEmod', 'my_modules');

Немного разберем то, что написано. Для кого-то это совершенно непонятная абракадабра :)

  • my_modules – это название функции, я его придумал сам, можете использовать здесь любое другое название, чего душа пожелает.
  • return ' … '; – собственно html-контент, который мы хотим вывести в посте на месте шорткода, т.е. наш блок. Важно знать, что если где-то в вашем контенте внутри return будут встречаться апострофы, как у меня «АлаичЪ\'а», то их надо экранировать обратным слешем, в примере это видно.
  • add_shortcode('DLEmod', 'my_modules'); – это функция, которая создаст для нас шорткод. Здесь используется WordPress Shortcode API, содержащий набор функций для работы с регулярками и не только…короче, это для вас не важно. В общем, использование этой команды создаст для нас шорткод с названием [ DLEmod ] (без пробелов между названием и скобками) и будет выводить на его месте содержимое функции my_modules.

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

Если хотите, в будущем я рассмотрю возможности работы непосредственно работы с регулярными выражениями, без использования WordPress API.

Пользуйтесь на здоровье, пишите комментарии и задавайте вопросы. Спасибо за внимание!

Александр «АлаичЪ» Алаев
Александр «АлаичЪ» Алаев

Вот уже 18 лет я профессионально занимаюсь созданием и продвижением сайтов и 13 лет с удовольствием пишу в любимый блог. Создал заслужившие доверие в seo-сообществе программы FastTrust и ComparseR и известный сервис для проверки траста сайтов CheckTrust.ru.

В 2014 основал веб-студию «АлаичЪ и Ко» в Краснодаре: 1 место в рейтинге агентств интернет-маркетинга (Рейтинг Рунета), 2 место в рейтинге SEO-компаний (CMSmagazine), 12 место в рейтинге известность бренда SEO-компаний в России (SeoNews).

Выступаю на профильных конференциях (All In Top, SEO Conference, SEMPRO, Baltic Digital Days). Веду канал в telegram про seo и бизнес. SEO-специалист года 2019 и 2020 (Sape).

Ерунда и баянЪ!Зачет! Плюсую!
-1

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

30 000 руб.

Комплексный подход к решению поставленных задач: достижение топ-10 и увеличение трафика на сайт. В стоимость уже включены полный технический аудит и оптимизация сайта.

45 000 руб.

У вас недостаточно знаний и нужны ответы на вопросы?
Интересует мнение эксперта или надо проверить подрядчика?
Вы задаете вопрос — я отвечаю!

5 000 руб./час

Проведу подробное исследование вашего сайта и основных конкурентов, опубликую материал на блоге для обсуждения и коллективного поиска новых идей.

70 000 руб.

Я начал запись своего обучающего курса по seo-продвижению.

В каждом видео я разбираю какую-то одну важную тему, и делаю это последовательно, в порядке, подходящем для изучения с нуля. Видео выкладываются раз в неделю – по средам. Я думаю, весь курс будет состоять из 50-70 роликов, так до конца еще далеко, а значит самое время подписаться и начать изучение вместе со мной.

В блоке слева всегда будет выводиться самое свежее видео курса. Ссылки: на мой канал, на плейлист обучения.

Комментарии: 20 Написать комментарий
  1. Сергей (4 комм.)

    Спасибо за новую статью! Даже не смотря на приближение праздника АлаичЪ работает )

    Ответить
    • АлаичЪ

      А меня что-то накануне праздников наоборот прорвало, хочется писать, идеи вдруг появились, а главное желание писать... Но я сдержусь и кое-что вкусное опубликую только в следующем году :)

      Ответить
  2. rpob (5 комм.)

    Хах, часов 5 назад, как раз столкнулся с проблемой, что нужно было вставить php в WP, все искал плагины, потом отыскал exec_php. Эх, АлаичЪ, написал бы ты этот пост на пару часов раньше цены бы тебе не было :) Но все равно спасибо за статейку!

    Ответить
  3. Николай (4 комм.)

    На DLE есть что-то подобное?

    Ответить
    • Данил (16 комм.)

      Тоже интересует DLE, причем 9.7

      Все равно большее спасибо за статью

      Ответить
      • АлаичЪ

        У меня нет чего-то подобного для DLE, да и не планируется, потому что мне это не нужно.

        Ответить
        • Николай (4 комм.)

          Все понятно, спасибо. Просто поинтересовался, мало ли.

          Ответить
  4. Даниил (1 комм.)

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

    Ответить
    • АлаичЪ

      Попробуй что-нибудь такое:

      	function my_author() {
      		$author = get_the_author();
      		return $author;
      	}
      	add_shortcode('MyAuthor', 'my_author');

      Т.е. при написании поста надо будет вставлять тег [MyAuthor]

      Ответить
  5. Сергей (3 комм.)

    Правда шорт-коды не во всех темах WordPress работают((( У меня раньше была тема в которой их нельзя было подключить не плагинами, не в ручную... ну или может у меня руки не под это заточены))

    Ответить
  6. Александр (10 комм.)

    Здравствуйте, у меня на блоге стоит плагин для вывода последних статей — WordPress Related posts, он после установки автоматически ставит список похожих статей после постов

    и я попытался поставить между ним и самим постом скриптик для соц сетей,

    но как я ни пытался, скриптик отображается только после WordPress Related posts, а не до него.

    подскажите пожалуйста, куда код прописать, что б вот как у Вас было)))

    Ответить
    • АлаичЪ

      Выход один — вносить правки вручную, а не чтобы автоматически добавлялось. Как это сделать — смотрите readme к плагину.

      Ответить
  7. andrey (1 комм.)

    Шорткод выводиться вначале статьи, а не в том месте где я его указал в чем проблема?

    Ответить
    • АлаичЪ

      Скорее всего в том коде, который выводится при помощи шорткода. Для проверки рекомендую пр помоши шорткода выводить какое-нибудь слово, например "Привет!" :) Если оно будет выводиться там где надо, все окей. И если при вставке более сложного кода при помощи шорткода что-то куда-то уезжает — значит дело в css стилях.

      Ответить
  8. Зожиков (1 комм.)

    АлаичЪ: спасибо, полезный блог. Из того, что интересно было бы почитать еще — это 1. создание отдельного сайдбара для каждой рубрики и 2.создание форума на wp как у тебя.

    Ответить
  9. Сева (3 комм.)

    А как в шорткод вставить РСЯ?

    Adsense нормально, а вот РСЯ не хочет

    Сайт сразу "падает" после вставки этого кода:

    <!-- Яндекс.Директ -->

    <script type="text/javascript">

    yandex_partner_id = 138475;

    yandex_site_bg_color = 'FFFFFF';

    yandex_stat_id = 1;

    yandex_ad_format = 'direct';

    yandex_direct_type = 'posterHorizontal';

    yandex_direct_border_type = 'block';

    yandex_direct_limit = 2;

    yandex_direct_title_font_size = 3;

    yandex_direct_border_radius = true;

    yandex_direct_links_underline = false;

    yandex_direct_border_color = 'CC0000';

    yandex_direct_title_color = 'CC0000';

    yandex_direct_url_color = 'CC0000';

    yandex_direct_text_color = 'CC0000';

    yandex_direct_hover_color = 'CC0000';

    yandex_direct_favicon = false;

    yandex_no_sitelinks = true;

    document.write ('<scr'+'ipt type="text/javascript" src="//an.yandex.ru/system/context.js"></scr'+'ipt>');

    </script>

    Ответить
    • АлаичЪ

      Попробуй экранировать апострофы. То есть писать не ' а \' — во всем коде надо сделать эту замену.

      Ответить
      • Сева (3 комм.)

        Александр, боязно изменять код РСЯ — запрещено правилами.

        Нашёл выход — простейший плагин для создания шорткодов

        https://wordpress.org/plugins/scode-by-mojwp/

        Нужно для отслеживания срезов РСЯ (в каждой рубрике на сайте — свой срез)

        Ответить
  10. Сергей (1 комм.)

    Люди, не мучайтесь, используйте плагин Adinserter.

    Ответить