Функция get_shortcode_regex()
в WordPress генерирует регулярное выражение, которое используется для поиска шорткодов в тексте. Это мощный инструмент, который позволяет разработчикам искать, обрабатывать и работать с шорткодами на основе гибкого шаблона.
get_shortcode_regex( array $tagnames = null ): string
Параметры:
- $tagnames (массив, необязательный): Список шорткодов для поиска. По умолчанию функция возвращает регулярное выражение для поиска всех зарегистрированных шорткодов.
Возвращаемое значение:
- Возвращает строку с регулярным выражением для поиска указанных шорткодов.
Как работает get_shortcode_regex()
Функция генерирует регулярное выражение, которое включает различные подсовпадения для правильной обработки шорткодов. Вот основные подсовпадения, которые используются:
- Первый символ
[
, позволяющий обрабатывать экранированные шорткоды[[
. - Название шорткода.
- Аргументы шорткода.
- Символ
/
для самозакрывающихся шорткодов. - Содержимое шорткода, если он содержит контент.
- Закрывающий символ
]
, который также может быть двойным, чтобы экранировать шорткод.
Пример 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])) {
// Шорткод найден в контенте поста
}
}
Этот код будет работать на уровне действия wp
, где переменная $post
доступна. Если шорткод найден, можно выполнить необходимую логику (например, подключить стили или скрипты).
Пример 2: Поиск шорткодов во всех постах на главной странице
Иногда нужно проверить наличие шорткода в нескольких постах, например, на главной странице. Этот код позволяет искать шорткод в нескольких постах одновременно:
add_action('wp', 'your_prefix_detect_shortcode_in_posts');
function your_prefix_detect_shortcode_in_posts() {
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('gallery', $matches[2])) {
// Шорткод найден в одном из постов
// Можно подключить стили или скрипты
break; // Останавливаем цикл после первого найденного шорткода
}
}
}
Этот пример особенно полезен, если вы хотите динамически подключать стили или скрипты только при наличии определенного шорткода в контенте нескольких постов.
Пример 3: Получение информации о шорткодах в посте
Функция get_shortcode_regex()
в сочетании с preg_match_all()
позволяет получить полную информацию о шорткодах в посте, включая их аргументы и содержимое. Вот как это можно сделать:
function your_prefix_extract_shortcodes() {
global $post;
$pattern = get_shortcode_regex();
if (preg_match_all('/' . $pattern . '/s', $post->post_content, $matches) && array_key_exists(2, $matches)) {
$shortcode_count = count($matches[2]);
$shortcodes_array = $matches[2]; // Названия шорткодов
$atts_array = $matches[3]; // Аргументы шорткодов
for ($i = 0; $i < $shortcode_count; $i++) {
$shortcode = $shortcodes_array[$i];
$atts = shortcode_parse_atts($atts_array[$i]);
// Здесь можно обработать каждый шорткод и его атрибуты
}
}
}
Этот код извлекает все шорткоды из поста, их названия и аргументы, которые можно использовать для дальнейшей обработки.
Пример 4: Вывод регулярного выражения
Если вы хотите увидеть, какое регулярное выражение генерирует get_shortcode_regex()
, можно просто вывести его:
echo get_shortcode_regex();
Например, если у вас зарегистрированы шорткоды gallery
, audio
и video
, вывод будет что-то вроде:
\[(\[?)(gallery|audio|video)(?![\w-])([^\]\/]*(?:\/(?!\])[^\]\/]*)*?)(?:(\/)\]|\](?:([^\[]*+(?:\[(?!\/\])[^\[]*+)*+)\[\/\])?)(\]?)
Вы также можете передать массив с конкретными шорткодами:
echo get_shortcode_regex(array('mytag'));
// Выведет: \[(\[?)(mytag)(?![\w-])([^\]\/]*(?:\/(?!\])[^\]\/]*)*?)(?:(\/)\]|\](?:([^\[]*+(?:\[(?!\/\])[^\[]*+)*+)\[\/\])?)(\]?)
Важные моменты
- Оптимизация: Если вы обрабатываете большое количество постов или контента, будьте внимательны с использованием функции в цикле, так как регулярные выражения могут быть ресурсоемкими.
- Альтернатива: Для проверки наличия конкретного шорткода можно также использовать более простую функцию
has_shortcode()
, если не требуется работа с регулярными выражениями.
Заключение
Функция get_shortcode_regex()
— это мощный инструмент для поиска и обработки шорткодов в контенте WordPress. Она позволяет гибко взаимодействовать с шорткодами на основе регулярных выражений, что делает её незаменимой для сложных задач, связанных с обработкой контента.