WordPress как на ладони
Официальная конференция по WordPress в Moскве 18-19 августа, начало в 9:00 wordpress jino

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 4.9.8

<?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 47
Программист фрилансер. Кодингом на PHP занимаю с 2008 года.
12 комментов
Полезные 1 Все
  • @ campusboy2947 cайт: www.youtube.com/c/wpplus

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

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

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

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

      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.2 года назад #
      • @ campusboy2947 cайт: www.youtube.com/c/wpplus

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

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

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

    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);

    Ответить2.5 года назад #
    • @ campusboy2947 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
      Ответить2.5 года назад #
  • @ campusboy2947 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.2 год назад #
  • Вадим

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

    • @ campusboy2947 cайт: www.youtube.com/c/wpplus

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

      1
      • Вадим

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

  • Sergey

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

    Ответить4 месяца назад #
    • newbie32 cайт: yumchief.com

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

      1
      Ответить4 месяца назад #
  • Alexandrov Yan5 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;
    }
    Ответить2 месяца назад #
Здравствуйте, !     Войти . Зарегистрироваться