WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

add_shortcode() WP 2.5

Добавляет новый шоткод и хук для него.

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

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

Результат, который возвращает функция (обработчик шоткода) всегда должен возвращаться, а не выводиться на экран.

Шоткоды - это конструкция вида: [somename] или [somename id="123" size="medium"] или [somename]текст[/somename] в тексте, которые будут заменены другим текстом созданным функцией-хуком отвечающим за шоткод.

Видео о шорткодах в WordPress:

Хуков нет.

Возвращает

Ничего не возвращает.

Использование

add_shortcode( $tag , $func );
$tag(строка) (обязательный)

Название шоткода, который будет использоваться в тексте. Например: 'gallery'.

В названии нельзя использовать пробелы и нестандартные символы вроде: & / < > [ ] =.
По умолчанию: нет

$func(строка) (обязательный)

Название функции, которая должна сработать, если найден шоткод.

Функция получает 3 параметра, каждый из них может быть передан, а может нет:

  • $atts (массив)
    Ассоциативный массив атрибутов указанных в шорткоде.
    По умолчанию: '' (пустая строка - нет атрибутов)

  • $content (строка)
    Текст шорткода, когда используется закрывающая конструкция шорткода: [foo]текст шорткода[/foo]
    По умолчанию: ''

  • $tag (строка)
    Тег шорткода. Может пригодится для передачи в доп. функции. Пр: если шорткод - [foo], то тег будет - foo.
    По умолчанию: текущий тег

По умолчанию: нет

Примеры

#1. Пример регистрации шоткода [footag foo="bar"]:

function footag_func( $atts ){
	 return "foo = ". $atts['foo'];
}
add_shortcode('footag', 'footag_func');

// результат: 
// шоткод в тексте будет заменен на "foo = bar"

#1.2. Установка белого списка атрибутов шорткода

Для того чтобы шорткод мог иметь только указанные нами параметры и у этих параметров были значения по умолчанию, нужно использовать функцию shortcode_atts():

add_shortcode( 'bartag', 'bartag_func' );
function bartag_func( $atts ){
	// белый список параметров и значения по умолчанию
	$atts = shortcode_atts( array(
		'foo' => 'no foo',
		'baz' => 'default baz'
	), $atts );

	return "foo = {$atts['foo']}";
}

#2. Регистрация шорткода с контентом

Пример создания такого шоткода: [baztag]здесь текст[/baztag]:

add_shortcode( 'baztag', 'baztag_func' );
function baztag_func( $atts, $content ) {
	 return "content = $content";
}

// результат:
// конструкция шоткода будет заменена на "content = здесь текст"

#3. Регистрация шоткода для классов

Если ваш плагин написан классом:

class MyPlugin {
	 function baztag_func( $atts, $content ) {
			return "content = $content";
	 }
}
add_shortcode( 'baztag', array( 'MyPlugin', 'baztag_func' ) );

#4 Вставка iframe через шорткод

Этот пример показывает как создать шорткод, чтобы потом через него вставлять iframe.

function Generate_iframe( $atts ) {
	$atts = shortcode_atts( array(
		'href'   => 'http://site.ru',
		'height' => '550px',
		'width'  => '600px',     
	), $atts );

	return '<iframe src="'. $atts['href'] .'" width="'. $atts['width'] .'" height="'. $atts['height'] .'"> <p>Your Browser does not support Iframes.</p></iframe>';
}
add_shortcode('iframe', 'Generate_iframe');
// использование: [iframe href="http://www.exmaple.com" height="480" width="640"]

Код add shortcode: wp-includes/shortcodes.php VER 5.1.1

<?php
function add_shortcode( $tag, $callback ) {
	global $shortcode_tags;

	if ( '' == trim( $tag ) ) {
		$message = __( 'Invalid shortcode name: Empty name given.' );
		_doing_it_wrong( __FUNCTION__, $message, '4.4.0' );
		return;
	}

	if ( 0 !== preg_match( '@[<>&/\[\]\x00-\x20=]@', $tag ) ) {
		/* translators: 1: shortcode name, 2: space separated list of reserved characters */
		$message = sprintf( __( 'Invalid shortcode name: %1$s. Do not use spaces or reserved characters: %2$s' ), $tag, '& / < > [ ] =' );
		_doing_it_wrong( __FUNCTION__, $message, '4.4.0' );
		return;
	}

	$shortcode_tags[ $tag ] = $callback;
}

Cвязанные функции

Из раздела: Шорткоды

Danya 50
Программист фрилансер. Кодингом на PHP занимаю с 2008 года.
20 комментов
Полезные 3 Вопросы 1 Все
  • @ campusboy3302 cайт: www.youtube.com/c/wpplus

    Результат который возвращает функция обработчик шоткода всегда должен возвращаться, а не выводиться на экран.

    Интересно, а для чего так? Ставишь echo и не работает, надо обязательно return. А как писать тогда сложные шорткоды? К примеру, я хочу запихнуть туда цикл (вывод похожих записей, к примеру). Как мне действовать? Приведите, пожалуйста, пример шорткода с использованием get_post или подобного, очень буду благодарен!

    -1
    Ответить3.10 года назад #
    • Kama7376

      Тут нет проблемы, собираете строку в переменную и возвращаете переменную:

      function last_posts_shortcode( $atts ){
      	$posts = get_posts( $atts['query'] );
      
      	$out = '<ul>';
      
      	foreach( $posts as $post ){
      		$out .= '<li><a href="'. get_permalink( $post->ID ) .'">'. $post->post_title .'</a></li>';
      	}
      
      	$out .= '</ul>';
      
      	return $out;
      }
      add_shortcode('last_posts', 'last_posts_shortcode' );
      2
      Ответить3.10 года назад #
      • @ campusboy3302 cайт: www.youtube.com/c/wpplus

        Да, действительно, проблем нет. Просто был поражен такой ситуацией. Привык, что в WP всё логично, а тут такая бяка. Спасибо, Тимур!

        -3
        Ответить3.10 года назад #
  • @ Андрей

    Подскажите как решить

    add_shortcode( 'stug_iv_average_passage-shortcode' , 'stug_iv_average_passage' );
    function stug_iv_average_passage(){
    	$stug_iv_average_passage = $wpdb->get_var('SELECT * FROM  `wp_pl_price` ', 0, 0);
    	echo "$stug_iv_average_passage";
    }

    Выдает ошибку

    Fatal error: Call to a member function get_var() on a non-object in /home/alicom/alicom.dp.ua/portfolio/game-lvl/wp-content/plugins/price/shortcode.php on line 11

    То есть проблема тут $stug_iv_average_passage = $wpdb->get_var('SELECT * FROMwp_pl_price', 0, 0);

    Ответить3.2 года назад #
    • @ campusboy3302 cайт: www.youtube.com/c/wpplus
      add_shortcode( 'stug_iv_average_passage-shortcode' , 'stug_iv_average_passage' );
      function stug_iv_average_passage(){
      	global $wpdb;
      	$stug_iv_average_passage = $wpdb->get_var('SELECT * FROM  `wp_pl_price` ', 0, 0);
      	return $stug_iv_average_passage;
      }
      1
      Ответить3.2 года назад #
  • @ campusboy3302 cайт: www.youtube.com/c/wpplus

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

    // Массив с сохраненными сообщениями
    $alert_boxes = array();
    
    /**
     * Выводит на экран текст сообщения и запоминает его.
     * Сохраненное сообщение выводится шоткодом [alert_r id="$id"]
     *
     * @param array $atts параметры шоткода (используется id)
     * @param string $content контент шоткода
     *
     * @return string блок(html) сообщением
     */
    function alert_callback( $atts = false, $content = '' ){
    	global $alert_boxes;
    
    	$tpl = '<div class="alert-message">%s</div>';
    	$id = ( empty($atts['id']) ) ? false : $atts['id'];
    
    	if( $id && $content ){
    		$alert_boxes[$id] = $content;
    	}elseif( ! empty($alert_boxes[$id]) ){
    		$content = $alert_boxes[$id];
    	}else{
    		$tpl = '';
    	}
    
    	return sprintf($tpl, $content);
    }
    add_shortcode('alert', 'alert_callback');
    
    /**
     * Выводит на экран текст сохраненного сообщения.
     * Сохранение происходит при использовании шоткода [alert id="$id"]$text[/alert]
     *
     * @param array $atts параметры шоткода (используется id)
     *
     * @return string блок(html) сообщением
     */
    function alert_r_callback( $atts = false ){
    	global $alert_boxes;
    
    	$tpl = '<div class="alert-message alert-message-repeat">%s</div>';
    	$id = ( empty($atts['id']) ) ? false : $atts['id'];
    
    	if( ! $id || empty($alert_boxes[$id]) ){
    		return '';
    	}
    
    	return sprintf($tpl, $alert_boxes[$id]);
    }
    add_shortcode('alert_r', 'alert_r_callback');

    В тексте человек использует шоткоды, к примеру так:

    [alert id='1']На ноль делить нельзя![/alert]
    
    Всякий текст, формулы
    
    [alert_r id='1']
    
    Ещё текст, формулы
    
    [alert id='2']Умножение любого числа на ноль даст ноль![/alert]
    
    Побольше умных слов и формул
    
    [alert_r id='1']
    
    Тут вообще жесть пошла, голова кипит от формул
    
    [alert_r id='2']

    И получает на выходе:

    <div class="alert-message">На ноль делить нельзя!</div>
    <p>Всякий текст, формулы</p>
    <div class="alert-message alert-message-repeat">На ноль делить нельзя!</div>
    <p>Ещё текст, формулы</p>
    <div class="alert-message">Умножение любого числа на ноль даст ноль!</div>
    <p>Побольше умных слов и формул</p>
    <div class="alert-message alert-message-repeat">На ноль делить нельзя!</div>
    <p>Тут вообще жесть пошла, голова кипит от формул</p>
    <div class="alert-message alert-message-repeat">Умножение любого числа на ноль даст ноль!</div>

    Вместо цифр в параметре ID можно писать что угодно. В данном случае нагляднее было бы писать шоткоды так:

    [alert id='деление на ноль']На ноль делить нельзя![/alert]
    
    Всякий текст, формулы
    
    [alert_r id='деление на ноль']

    Также хорошим тоном было бы использовать API кеширования WordPress, а не объявлять глобальную переменную, но это уже в версии 2.0 smile

    Ответить1.9 года назад #
  • Вадим

    Для начала хочу сказать огромное спасибо за каждую статью, которую я использовал и использую в будущем! Очень хороший сайт!
    У меня такая проблема: я вывожу рандомные посты внизу страницы, к постам добавляю описание с помощью плагина Custom Field Suite. Согласно документации выводить данные с этим плагином надо <?php echo CFS()->get( 'first_name' ); ?>, а как это сделать в внутри shordcode? Нельзя же использовать echo!
    Заранее благодарен за ответ!

    Ответитьгод назад #
    • @ campusboy3302 cайт: www.youtube.com/c/wpplus

      Не пишите echo smile Или включите буфер вначале, а потом очистите его и верните результат. В видео про шоткоды у нас всё это есть.

      1
      Ответитьгод назад #
      • Вадим

        Гляну видео, спасибо, не смотрел, думал там только повтор самой статьи. Кстати очень хороший подход к написанию постов, не все воспринимают на слух, не все любят читать, а так выбор есть! smile если вдруг и прочитал и посмотрел, то считай уже знаешь smile Спасибо!

        Ответитьгод назад #
  • Sergey

    Всем привет! у меня такая проблемка, хочу сделать типа быстрого заказа товара с картинко и кратким описанием товара,
    как это можно сделать? И можно ли что то на подобии этого сделать?
    За ранее вам спасибо!

    Ответитьгод назад #
    • newbie35 cайт: yumchief.com

      Во-первых, как ты представляешь себе ответ на свой вопрос? Ты хочешь сделать "типа быстрый заказ с картинкой и кратким описанием", так возьми и сделай. Возьми картинку, краткое описание, сверстай как тебе нравится, добавь кнопку для быстрого заказа. Во-вторых, не пытайся бензопилой забивать гвозди. Для интернет-магазина используй подходящую cms - битрикс, опенкарт, юми.

      1
      Ответитьгод назад #
  • Alexandrov Yan21 cайт: codyshop.ru

    Если шорткод выводится в начале страницы, а не в том месте, где вы его разместили. Делаем так:

    add_shortcode( 'my_shortcode', 'my_shortcode_func' );
    function my_shortcode_func(){ 
    	ob_start();
    
    	// здесь у вас будет некий код, например html верстка
    
    	$output = ob_get_contents();
    	ob_end_clean();
    	return $output;
    }
    3
    Ответить10 мес назад #
  • Добрый день, Друзья!

    Поскольку в настоящее время существует проверка сайтов на уникальный контент (конкретно в рамках данного сайта), возникла необходимость дублирования НЕКИХ частей контента, БЕЗ ДУБЛИРОВАНИЯ оных.
    Как я себе это представляю:

    Скажем на сайте существует некий текст, каждый абзац которого имеет уникальный id.
    Затем, с помощью Шорткодов ( в которые данный ID будет помещен) текст выводится в требуемом месте.

    Например:

    <p id="tovarishi">Товарищи! дальнейшее развитие различных форм деятельности требуют определения и уточнения позиций, занимаемых участниками в отношении поставленных задач. Разнообразный и богатый опыт новая модель организационной деятельности позволяет выполнять важные задания по разработке форм развития. Равным образом консультация с широким активом требуют определения и уточнения новых предложений. Идейные соображения высшего порядка, а также укрепление и развитие структуры способствует подготовки и реализации дальнейших направлений развития.
    </p>
    
    <p>Равным образом начало повседневной работы по формированию позиции позволяет оценить значение новых предложений. Значимость этих проблем настолько очевидна, что постоянный количественный рост и сфера нашей активности играет важную роль в формировании направлений прогрессивного развития.
    </p>

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

    Использование текстов в файле functions.php - не предлагать!
    Дело в том, что шорткодов (подобного типа) на сайте планируется использовать в огромном количестве. Так что, загрязнять functions.php - не хочется!!!

    Ответить7 мес назад #
  • Я так понимая в некоторых тегах не будет работать. У меня в атрибуте action тега form выводится как есть, а в src работает.

    Ответить2 мес назад #
  • У меня не получается изобразить require в шоткоде. Делаю так:

    function child_include( $atts ) {
    	$path1 = require_once( get_stylesheet_directory() . '\'/' . $atts['path'] . '\'' );
    	$path2 = require_once( get_stylesheet_directory() . '/' . $atts['path'] );
    	return $path1;
    }
    add_shortcode( 'inc-file', 'child_include' );

    С $path1 получаю ошибки

    Warning: require_once(A:\Server\home\clown-wp/wp-content/themes/csk'/inc/stickers.php'): failed to open stream: No such file or directory in A:\Server\home\clown-wp\wp-content\themes\csk\functions.php on line 231
    Fatal error: require_once(): Failed opening required 'A:\Server\home\clown-wp/wp-content/themes/csk'/inc/stickers.php'' (include_path='.;a:/server/modules/php/PHP-7.1;a:/server/modules/php/PHP-7.1/PEAR/pear') in A:\Server\home\clown-wp\wp-content\themes\csk\functions.php on line 231

    А с $path2 получаю, почему-то, цифру 1 unknw Хотя путь получается правильным. Но, вместо того, чтоб вставить содержимое файла, выводится просто цифра.

    Ответитьмесяц назад #
    • @ campusboy3302 cайт: www.youtube.com/c/wpplus

      Вы вчера ничего не усвоили с разговора))

      function child_include( $atts ) {
      	if ( isset( $atts['path'] ) ) { // Есть параметр
      		// Собираем полный путь к файлу
      		$path = get_stylesheet_directory() . '/' . $atts['path'];
      		if ( is_file( $path ) ) { // Есть такой файл
      			// Включаем буфер. Теперь ничего не выведется на экран
      			ob_start();
      			// Подключаем файл, который попытается "выплюнуть" нашу вёрстку на экран
      			include $path;
      			// Забираем из буфера всё что "выплюнул" подключенный файл и очищаем буфер
      			$content = ob_get_clean();
      		} else { // Нет файла
      			$content = 'Файл по переданному пути не найден.';
      		}
      	} else { // Нет параметра
      		$content = 'Путь к файлу не передан.';
      	}
      
      	return $content;
      }
      
      add_shortcode( 'inc-file', 'child_include' );
      2
      Ответитьмесяц назад #
      • Огромное спасибо! Но Вы ко мне несправедливы, я, конечно, тупка в php, но стараюсь. Сейчас, вот, убиваю все виджеты с php кодом, Вы же сказали, что это опасно. Но, как я уже признавалась, мне очень сложно даётся синтаксис. Огромное спасибо за помощь!

        Ответитьмесяц назад #
        • @ campusboy3302 cайт: www.youtube.com/c/wpplus

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

          1
          Ответитьмесяц назад #
  • Здравствуйте,
    Сайт и видео у вас отличные. Доходчиво и почти сразу всё понятно.
    Я как новичок стало интересно, а как сделать такой вариант:
    Скажем...
    ...у ВП есть стандартные блоки которые формируются из - header.php + ... + footer.php.
    В header.php и footer.php есть номер телефона, который по разному отображается.
    если в фунция.пхп мы пишем:

    add_shortcode('phone', 'show_phone');
    function show_phone() {
    	return '<span class="phone_code">+7 (000)</span><span class="phone_body"> 000-00-00</span>';
    }

    То как можно сделать так, чтобы:
    Вариант 1:
    в header.php и footer.php шоткод через

    <?php echo do_shortcode( '[phone]' ); ?>

    отображался по разному, к примеру:
    в header.php -

    <span class="phone_code">+7 (000)</span><span class="phone_body"> 000-00-00</span>

    в footer.php -

    <p>+7 (000) 000-00-00</p>

    (полагаю, что должна быть функция через if header.php {...} if footer.php {...})
    Вариант 2:
    Сделать один файл, к примеру, shortcode.php и в нём прописать все шоткоды, чтобы в нём потом что-то менять/править/удалять.
    (возникает необходимость прописывать два разных кода под один номер, т.е. отдельно для хедера, отдельно для футера)
    Вариант 3:
    Объединить варианты 1 и 2 в два файла, чтобы в shortcode.php указать [phone] - +7 000 000-00-00, а он уже в header.php стал выводиться как:

    <span class="phone_code">+7 (000)</span><span class="phone_body"> 000-00-00</span>

    а в footer.php стал выводиться как:

    <p>+7 (000) 000-00-00</p>
    Ответитьмесяц назад #
Здравствуйте, !     Войти . Зарегистрироваться