get_shortcode_regex()WP 2.5.0

Возвращает регулярное выражение которое используется для поиска шоткодов в тексте.

Эта функция объединяет все зарегистрированные теги шоткодов в одно регулярное выражение.

1 раз — 0.000015 сек (очень быстро) | 50000 раз — 0.07 сек (скорость света) | PHP 7.0.8, WP 4.6.1

Хуков нет.

Возвращает

Строку. Регулярное выражение.

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

$pattern = get_shortcode_regex( $tagnames );
$tagnames(массив) (WP 4.4)
Список шорткодов, которые нужно найти.
По умолчанию: null (все зарегистрированные шорткоды)

Примеры

1

#1 Проверим используется ли в посте нужный шоткод

Проверим наличие в тексе шоткода your-shortcode и сделаем что-нибудь если используется:

add_action( 'wp', 'your_prefix_detect_shortcode' );
function your_prefix_detect_shortcode(){
	global $post;

	$pattern = get_shortcode_regex();

	if ( preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
		&& array_key_exists( 2, $matches )
		&& in_array( 'your-shortcode', $matches[2] )
	) {
		// Шоткод используется
	}
}

Этот пример будет работать, если глобальная переменная $post определена. wp - самое раннее действие, когда мы может это определить.

Для проверки наличия шоткода, также есть специальная функция has_shortcode()

1

#2 Проверка наличия шоткода в тексте нескольких постов

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

add_action( 'wp', 'your_prefix_detect_shortcode' );
function your_prefix_detect_shortcode(){
	global $wp_query;

	$posts = $wp_query->posts;

	$pattern = get_shortcode_regex();

	foreach ( $posts as $post ){
		if ( preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches )
			&& array_key_exists( 2, $matches )
			&& in_array( 'videoannotation', $matches[2] )
		) {
			// подключаем свой сss и js

			break; // определили что нужно подключать стили и хорош...
		}
	}
}
0

#3 Что возвращает функция

echo get_shortcode_regex();

// выведет примерно такую строку, зависит от зарегистрированных шоткодов
// \[(\[?)(embed|wp_caption|caption|gallery|playlist|audio|video)(?![\w-])([^\]\/]*(?:\/(?!\])[^\]\/]*)*?)(?:(\/)\]|\](?:([^\[]*+(?:\[(?!\/\])[^\[]*+)*+)\[\/\])?)(\]?)

Этот пример показывает, что вернет функция, если использовать параметр $tagnames.

echo get_shortcode_regex( array('mytag') );

//> \[(\[?)(mytag)(?![\w-])([^\]\/]*(?:\/(?!\])[^\]\/]*)*?)(?:(\/)\]|\](?:([^\[]*+(?:\[(?!\/\])[^\[]*+)*+)\[\/\])?)(\]?)

Заметки

  • Global. Массив. $shortcode_tags

Список изменений

С версии 2.5.0 Введена.
С версии 4.4.0 Added the $tagnames parameter.

Код get_shortcode_regex() WP 6.5.2

function get_shortcode_regex( $tagnames = null ) {
	global $shortcode_tags;

	if ( empty( $tagnames ) ) {
		$tagnames = array_keys( $shortcode_tags );
	}
	$tagregexp = implode( '|', array_map( 'preg_quote', $tagnames ) );

	/*
	 * WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcode_tag().
	 * Also, see shortcode_unautop() and shortcode.js.
	 */

	// phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- don't remove regex indentation
	return '\\['                             // Opening bracket.
		. '(\\[?)'                           // 1: Optional second opening bracket for escaping shortcodes: [[tag]].
		. "($tagregexp)"                     // 2: Shortcode name.
		. '(?![\\w-])'                       // Not followed by word character or hyphen.
		. '('                                // 3: Unroll the loop: Inside the opening shortcode tag.
		.     '[^\\]\\/]*'                   // Not a closing bracket or forward slash.
		.     '(?:'
		.         '\\/(?!\\])'               // A forward slash not followed by a closing bracket.
		.         '[^\\]\\/]*'               // Not a closing bracket or forward slash.
		.     ')*?'
		. ')'
		. '(?:'
		.     '(\\/)'                        // 4: Self closing tag...
		.     '\\]'                          // ...and closing bracket.
		. '|'
		.     '\\]'                          // Closing bracket.
		.     '(?:'
		.         '('                        // 5: Unroll the loop: Optionally, anything between the opening and closing shortcode tags.
		.             '[^\\[]*+'             // Not an opening bracket.
		.             '(?:'
		.                 '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag.
		.                 '[^\\[]*+'         // Not an opening bracket.
		.             ')*+'
		.         ')'
		.         '\\[\\/\\2\\]'             // Closing shortcode tag.
		.     ')?'
		. ')'
		. '(\\]?)';                          // 6: Optional second closing bracket for escaping shortcodes: [[tag]].
	// phpcs:enable
}