WordPress как на ладони
wordpress jino

strip_shortcodes() WP 2.6

Удаляет/вырезает все шоткоды из переданного текста (контента).

Удаляться будут только те шоткоды, о которых WordPress знает, т.е. только зарегистрированные шоткоды. Конструкции вида [...] или [asd]...[/asd] удаляться не будут.

✈ 1 раз = 0.00012с = быстро | 50000 раз = 1.23с = быстро
Хуки из функции:
Возвращает

Строку. Текст без шоткодов.

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

$content = strip_shortcodes( $content );
$content(строка) (обязательный)
Текст, в котором нужно удалить все шоткоды.
По умолчанию: нет

Примеры

#1 Вырезаем шоткоды из контента

Удалим шоткоды в текстах на главной странице (home), но не будем ничего удалять на странице поста (single.php) или странице архивов (рубрики, метки, даты).

add_filter('the_content', 'remove_shortcode_from_index');
function remove_shortcode_from_index($content) {
  if ( is_home() ) {
	$content = strip_shortcodes( $content );
  }
  return $content;
}

#2 Удалим шоткоды, которых нет в WP

strip_shortcodes() не будет удалять конструкции похожие на шоткоды: [asd] или [asd]...[/asd], если они не зарегистрированные в WordPress. Чтобы это сделать, можно воспользоваться регулярным выражением:

$content = "1 [foo] [asd]text[/asd] 2";
$content = preg_replace( '~\[[^\]]+\]~', '', $content );
echo $content;

// Вернет: 1 text 2

Чтобы вырезать только нужный шорткод, например, [myshort] или [myshort]text[/myshort] используйте такую регулярку:

$content = "Начало [asd]text[/asd] конец. И еще один [myshort] и контентный [myshort]text[/myshort] все.";
$content = preg_replace( '~\[/?myshort[^\]]*\]~', '', $content );
echo $content;

// выведет: Начало [asd]text[/asd] конец. И еще один  и контентный text все.

Вырежем «контентный шорткод» вместе с контеном:

$content = "Начало [asd]text[/asd] конец. И еще один контентный [myshort]text[/myshort] все.";
$content = preg_replace( '~(?:\[(myshort)[^\]]*\].*?\[/\1\])|(?:\[myshort[^\]]*\])~s', '', $content );
echo $content;

// Выведет: Начало [asd]text[/asd] конец. И еще один контентный  все.

#3 Удалим шоткоды, которых нет в WP (новое с версии 4.4)

С версии 4.4. удалять шоткоды, о которых ВП ничего не знает стало проще - не нужно писать никаких регулярок. Все можно сделать стандартными функциями WordPress. А также через фильтр.

Удаляться шорткоды будут с помощью функции get_shortcode_regex(), в которую теперь можно передать массив, где указать название шоткода, который нужно вырезать из контента и таким образом получить нужную регулярку для использования её в preg_replace().

$content = "Начало [asd]text[/asd] конец. И еще один контентный [myshort]text[/myshort] все.";
$regex   = get_shortcode_regex( array('myshort') );
$content = preg_replace( "/$regex/", '', $content );
echo $content;

// Выведет: Начало [asd]text[/asd] конец. И еще один контентный  все.

#4 Удаление несуществующего шорткода через фильтр

Или можно добавить несуществующий шорткод в фильтр strip_shortcodes_tagnames, чтобы эта функция strip_shortcodes() удаляла указанный шорткод в том числе.

// дбавим несуществующий шорткод в массив для удаления
add_filter( 'strip_shortcodes_tagnames', function($tags_to_remove){
	$tags_to_remove[] = 'myshort';
	return $tags_to_remove;
} );

$content = "Начало [asd]text[/asd] конец. И еще один контентный [myshort]text[/myshort] все.";
$content = strip_shortcodes( $content );
echo $content;

// Выведет: Начало [asd]text[/asd] конец. И еще один контентный  все.

Код strip shortcodes: wp-includes/shortcodes.php VER 4.9.1

<?php
function strip_shortcodes( $content ) {
	global $shortcode_tags;

	if ( false === strpos( $content, '[' ) ) {
		return $content;
	}

	if (empty($shortcode_tags) || !is_array($shortcode_tags))
		return $content;

	// Find all registered tag names in $content.
	preg_match_all( '@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches );

	$tags_to_remove = array_keys( $shortcode_tags );

	/**
	 * Filters the list of shortcode tags to remove from the content.
	 *
	 * @since 4.7.0
	 *
	 * @param array  $tag_array Array of shortcode tags to remove.
	 * @param string $content   Content shortcodes are being removed from.
	 */
	$tags_to_remove = apply_filters( 'strip_shortcodes_tagnames', $tags_to_remove, $content );

	$tagnames = array_intersect( $tags_to_remove, $matches[1] );

	if ( empty( $tagnames ) ) {
		return $content;
	}

	$content = do_shortcodes_in_html_tags( $content, true, $tagnames );

	$pattern = get_shortcode_regex( $tagnames );
	$content = preg_replace_callback( "/$pattern/", 'strip_shortcode_tag', $content );

	// Always restore square braces so we don't break things like <!--[if IE ]>
	$content = unescape_invalid_shortcodes( $content );

	return $content;
}

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

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

Danya 50
Программист фрилансер. Кодингом на PHP занимаю с 2008 года.
strip_shortcodes 9 комментариев
  • campusboy1951 cайт: www.youtube.com/c/wpplus

    Как удалить определенный шоткод? К примеру стандартную gallery.

    1
    • Kama4696

      Для этого есть специальная функция remove_shortcode()

      • campusboy1951 cайт: www.youtube.com/c/wpplus

        Её то я видел, конечно smile Но я понял она работает так: удаляет функцию обработчик, то есть галерея не будет преобразована в привычный вид и отобразиться в записи потом просто сам шоткод. Так?

        • Kama4696

          Если, например, вставить в functions.php

          remove_shortcode('gallery');

          то при просмотре записи, в контенте шорткод не будет обработан и будет выведен как есть:

          [gallery ids="375,291,166"]

          Если нужно вырезать и его, то вешаем на хук the_content фильтр:

          $content = preg_replace( '~\[gallery[^\]]*\]~', '', $content );

          В админке в виз редакторе, галерея будет поддерживаться...

          Подробнее см. remove_shortcode()

          • campusboy1951 cайт: www.youtube.com/c/wpplus

            Ну я вот про тоже. Ищу способ, чтобы в контенте потом он не появлялся вовсе. Надо как-то регулярку писать, чтобы вырезала.

            • Kama4696

              Дополнил свой ответ smile

              • campusboy1951 cайт: www.youtube.com/c/wpplus

                Спасибо большое! Только желательно примеры в сам пост добавить smile Вырезание следующих типов шоткодов:

                • [my-shortcode]
                • [my-shortcode param1='foo' param2='boo'] (есть в коммменте твоём)
                • [my-shortcode]bla-bla-bla[/my-shortcode]
                • Вырезать все (такой уже есть в посте)
                • Kama4696

                  Подправил регулярку чтобы и [my-shortcode] вырезала.

                  Чтобы вырезать сложный шорткод, юзай такую регулярку

                  $content = preg_replace( '~\[(myshortcode)[^\]]*\].*?\[\/\1\]~s', '', $content );
                  // вырежет: [myshortcode] data [/myshortcode]

                  Добавил пример в remove_shortcode()

  • Михаил

    Я вообще не могу понять что куда вставлять и в функшн пхп и шорткод пхп вставлял, не вырезает мои шорткоды на главной они выводятся в кратком описании, Помогите распишите что за чем не могу понять, работы много голова кругом у же не варит не чё.

    Ответить13 дней назад #

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

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