WordPress как на ладони
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.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 года.
add_shortcode 11 комментариев
Полезные 1 Вопросы 1 Все
  • campusboy1951 cайт: www.youtube.com/c/wpplus

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

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

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

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

      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
      Ответить2.5 года назад #
      • campusboy1951 cайт: www.youtube.com/c/wpplus

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

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

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

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

    Ответить1.9 года назад #
    • campusboy1951 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.8 года назад #
  • campusboy1951 cайт: www.youtube.com/c/wpplus

    Столкнулся со старнной штукой. Функция вывода инфы из произвольных полей:

    function get_ss_fp_product_cats(){
    	$items = '';
    
    	$fields = get_field('ss_fp_product_cat', 'option');
    
      if ( ! empty( $fields ) ) {
    
    	foreach ( $fields as $field ) {
    
    		$title = ( ! empty( $field['ss_prod_cat_alt_name'] ) ) ? $field['ss_prod_cat_alt_name'] : $field['ss_prod_cat_obj']->name;
    		$title = sprintf( '<div class="ss-pc-title"><span>%s</span></div>', $title );
    
    		$img = ( $field['ss_prod_cat_img'] ) ? $field['ss_prod_cat_img'] : get_template_directory_uri().'/img/item.jpg';
    		$img = sprintf( '<div class="ss-pc-img"><img class="trans03" src="%s"></div>', $img );
    
    	  $url = get_term_link( $field['ss_prod_cat_obj']->term_id );
    
    	  $items .= sprintf('<div class="ss-cat-item tac"><a href="%s"> %s %s </a></div>', $url, $title, $img);
    
    	}
    
    	return sprintf('<div class="ss-product-cats">%s</div>', $items);
    
      }
    
    }

    Если вывести результат работы функции через echo, то получаем:

    <div class="ss-product-cats">
      <div class="ss-cat-item tac">
    	<a href="http://my-site.ru/product-category/mebel-dlya-gostinoy/">
    	  <div class="ss-pc-title"><span>Гостиная</span></div>
    	  <div class="ss-pc-img"><img class="trans03" src="http://my-site.ru/wp-content/uploads/2016/08/Gostinaya.jpg"></div>
    	</a>
      </div>
      .
      .
      .
      <div class="ss-cat-item tac">
    	<a href="http://my-site.ru/product-category/mebel-dlya-prihozhey/">
    	  <div class="ss-pc-title"><span>Прихожая</span></div>
    	  <div class="ss-pc-img"><img class="trans03" src="http://my-site.ru/wp-content/uploads/2016/08/Prihozhaya.jpg"></div>
    	</a>
      </div>
    </div>

    А если через шорткод, то:

    <div class="ss-product-cats">
      <div class="ss-cat-item tac">
    	<a href="http://my-site.ru/product-category/mebel-dlya-gostinoy/">
    	  <div class="ss-pc-title"><span>Гостиная</span></div>
    	  <div class="ss-pc-img"><img class="trans03" src="http://my-site.ru/wp-content/uploads/2016/08/Gostinaya.jpg"></div>
    	  <p> 
    	</a>
      </div>
      .
      .
      .
      <div class="ss-cat-item tac">
    	<a href="http://my-site.ru/product-category/mebel-dlya-prihozhey/">
    	  <div class="ss-pc-title"><span>Прихожая</span></div>
    	  <div class="ss-pc-img"><img class="trans03" src="http://my-site.ru/wp-content/uploads/2016/08/Prihozhaya.jpg"></div>
    	  <p> 
    	</a>
      </div>
    </div>

    Откуда может взяться этот ненужный тег p?

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

      Чудес не бывает, проблема найдена. При использовании визуального редактора раньше в ACF PRO надо было выводить такой контент через функцию wpautop, вот так, к примеру:

      echo wpautop( get_field('ss_fp_main_text', 'option') );

      Но после обновления, скорее всего, её сразу вшили в плагин, потому wpautop друг в друге выдавали такую странность. Прописал так:

      echo get_field('ss_fp_main_text', 'option');

      Стало всё как надо. Багов нет, структурирование текста тоже сохранено.

      1
      Ответить1.2 года назад #
  • Илья

    Здравствуйте, подскажите, пожалуйста. Как правильно сделать, если у меня у плагина опции CSS. Шоткоды содержат id записи, в которой хранятся все эти настройки CSS.
    Мне надо получить post по id из атрибута, извлечь из него настройки CSS и залить их на страницу в wp_head. Но разве функция шоткода вызывается не позже, чем wp_head?

  • campusboy1951 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

  • glebkema4 cайт: glebkema.ru

    Опечатка: три разных написания шоткода. prankster2

    Текст шоткода, когда используется закрывающая конструкция шотркода: [foo]текст шорткода[/foo]

    И в следующем абзаце тоже шорткоды.

    1

Здравствуйте, !

Ваш комментарий