Функция GET_SHORTCODE_REGEX() в WordPress: подробное регулярное выражение

Функция GET_SHORTCODE_REGEX() в WordPress

Функция GET_SHORTCODE_REGEX() используется для получения регулярного выражения, которое помогает в поиске шорткодов (shortcodes) в контенте. Это регулярное выражение объединяет теги шорткодов и содержит несколько подшаблонов для облегчения обработки.

Подробности о регулярном выражении

Регулярное выражение содержит 6 различных подшаблонов, которые помогают распарсить (разобрать) шорткоды:

  1. Дополнительная открывающая квадратная скобка [ — позволяет экранировать (избегать обработки) шорткоды, используя двойные квадратные скобки [[.
  2. Имя шорткода — это название шорткода, который вы создаете.
  3. Список аргументов шорткода — это параметры, которые могут передаваться вашему шорткоду.
  4. Самозакрывающийся тег / — используется для закрытия шорткода без контента.
  5. Содержимое шорткода — это текст или HTML-код, который находится между открывающим и закрывающим шорткодами.
  6. Дополнительная закрывающая квадратная скобка ] — также позволяет экранировать шорткоды с двойными квадратными скобками.

Использование функции

Эта функция используется в нескольких других функциях, таких как:

  • apply_shortcodes()
  • get_post_galleries()
  • do_shortcode()

Зачем это нужно?

Функция работает очень быстро:

  • За 1 раз — 0.000015 сек (очень быстро).
  • За 50000 раз — 0.07 сек (выросла скорость).

Возвращаемое значение

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

Пример использования функции

Основной синтаксис

get_shortcode_regex( $tagnames );
  • $tagnames (массив) — Список шорткодов для поиска.
  • По умолчанию: все зарегистрированные шорткоды.

Примеры

Пример 1: Получение регулярного выражения шорткодом

echo get_shortcode_regex();

На выходе будет что-то подобное:

[([?)(embed|wp_caption|caption|gallery|playlist|audio|video)(?![w-])...(]?)

Если использовать параметр $tagnames:

echo get_shortcode_regex(array('mytag'));

На выходе:

[([?)(mytag)(?![w-])...

Пример 2: Проверка на наличие конкретного шорткода в записи

Давайте проверим, есть ли ваш шорткод в тексте и сделаем какое-либо действие, если он есть (например, подключим CSS-стили или JavaScript-файл):

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])) {
        // Подключить css и js
    }
}

Этот пример будет работать, если глобальная переменная $post определена.

Пример 3: Проверка на наличие шорткодов в нескольких записях

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

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])) {
            // Подключить css и js
            break; // Мы определили, что надо подключить стили и т.д.
        }
    }
}

Заметки

  • Глобальный массив: $shortcode_tags

Изменения в функции

  • С версии 2.5.0 — введена функция.
  • С версии 4.4.0 — добавлен параметр $tagnames.

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

  • add_shortcode()
  • apply_shortcodes()
  • do_shortcode()
  • gallery_shortcode()
  • has_shortcode()
  • remove_all_shortcodes()
  • remove_shortcode()
  • shortcode_atts()
  • shortcode_exists()
  • shortcode_parse_atts()
  • strip_shortcodes()
  • wp_audio_shortcode()
  • wp_playlist_shortcode()
  • wp_video_shortcode()

Таким образом, функция GET_SHORTCODE_REGEX() является мощным инструментом для работы со шорткодами в WordPress и позволяет легко находить и обрабатывать их в контенте.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *