WordPress как на ладони
WordCamp Saint Petersburg 2018 wordpress jino

get_shortcode_regex() WP 2.5.1

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

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

✈ 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. Что возвращает функция

echo get_shortcode_regex();

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

#2 Указываем нужных шоткод

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

echo get_shortcode_regex( array('mytag') );

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

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

Проверим наличие в тексе шоткода 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()

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

Этот пример очень похож на предыдущий, с той лишь разницей, что он позволяет проверить все посты на наличие в их контенте нужного нам шоткода 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; // определили что нужно подключать стили и хорош...
		}    
	}
}

Код get shortcode regex: wp-includes/shortcodes.php VER 4.9.5

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

	if ( empty( $tagnames ) ) {
		$tagnames = array_keys( $shortcode_tags );
	}
	$tagregexp = join( '|', 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.
	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 brocket for escaping shortcodes: [[tag]]
}

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

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

Danya 47
Программист фрилансер. Кодингом на PHP занимаю с 2008 года.
get_shortcode_regex Комментариев нет

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

    Ваш комментарий
    Предпросмотр