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

strip_shortcodes() WP 2.6

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

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

✈ 1 раз = 0.000307с = быстро | 50000 раз = 0.44с = очень быстро PHP 7.1.11, WP 4.9.6
Хуки из функции:
Возвращает

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

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

$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.7

<?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 47
Программист фрилансер. Кодингом на PHP занимаю с 2008 года.
3 коммента
  • campusboy2856 cайт: www.youtube.com/c/wpplus

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

    1
    Ответить1.1 год назад #
  • Михаил

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

Здравствуйте, !     Войти . Зарегистрироваться