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

strip_shortcodes()WP 2.5.0

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

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

1 раз — 0.000307 сек (быстро) | 50000 раз — 0.44 сек (очень быстро) | PHP 7.1.11, WP 4.9.6
Хуки из функции

Возвращает

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

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

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

Примеры

0

#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;
}
0

#2 Удалим шоткоды, которых нет в 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] конец. И еще один контентный  все.
0

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

Или можно добавить несуществующий шорткод в фильтр 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] конец. И еще один контентный  все.
0

#4 Удалим шорткоды, которых нет в 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)[^\]]*\].*?\[/\])|(?:\[myshort[^\]]*\])~s', '', $content );
echo $content;

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

Заметки

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

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

С версии 2.5.0 Введена.

Код strip_shortcodes() WP 6.5.2

function strip_shortcodes( $content ) {
	global $shortcode_tags;

	if ( ! str_contains( $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  $tags_to_remove 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;
}
Danya 50
Программист фрилансер. Кодингом на PHP занимаю с 2008 года.
Редакторы: Kama 9616, campusboy 4748
2 комментария
    Войти