WordPress: Shortcodes entfernen bzw. ersetzen

WordPress bietet eine einfache Möglichkeit Shortcodes für all mögliche Zwecke zu erstellen. Es gibt sogar Generatoren, mit denen die Erstellung von Shortcodes „Zwischendurch“ bewerkstelligt werden kann. Viele WordPress Plugins bieten Shortcodes an, doch wenn man dann mal ein Plugin deaktiviert, weil man etwas anderes gefunden hat, dann bleiben die Shortcodes in den Inhalten. Man muss also alle Shortcodes per Hand entfernen, oder man ersetzt sie mit ein wenig PHP-Zauberei.

In unserem Beispiel wollen wie alle Shortcodes [mein_shortcode color="red" text="Mein Text"] in Beiträgen mit leeren String ersetzen. Das Schnipsel kann außerdem dazu verwendet werden, wenn das Plugin welches die Shortcodes einfügt, aktiv ist. Hiermit werden alle Shortcodes mit leeren Strings ersetzt. Es spielt auch keine Rolle, ob die Farbe blau statt rot ist.

Schnipsel

/**
 * Entfernt die Shortcodes aus dem Inhalt in Beiträgen.
 *
 * @param string $content
 *
 * @return string
 */
add_filter( 'the_content', function( $content ) {

	// Shortcodes nur in Beiträgen entfernen
	if ( ! is_singular( 'post' ) ) {
		return $content;
	}

	preg_match_all( '~\[mein_shortcode.*?[]]+~', $content, $matches, PREG_SET_ORDER, 0 );

	if ( $matches ) {
		$shortcodes = [];

		foreach ( $matches as $match ) :
			$shortcodes[] = $match[0];
		endforeach;

		// Hier ersetzen wir unsere Shortcodes
		$content = str_replace( $shortcodes, '', $content );
	}

	return $content;
});Code-Sprache: PHP (php)

Jetzt werden alle [mein_shortcode]-Shortcodes in Beiträgen ersetzt. Um die Shortcodes vollständig zu entfernen, muss man den Inhalt $content der zum Schluss angefügt wird, mit wp_update_post weitergeben. Da dies aber in den wenigsten Fällen gewollt ist, gehe ich hier nicht näher darauf ein.

Durch Entfernung der Abfrage if ( ! is_singular( 'post' ) ) werden die Shortcodes in allen Inhalten entfernt, die mit the_content() arbeiten.

Regex

\[mein_shortcode.*?[]]+Code-Sprache: CSS (css)

Extra

Um alle Überschriften mithilfe von Regex (Regulärer Ausdruck) zu erhalten:

(<h[?[1-9]]?[>]+)(.*)([<]+.*[>]+)|(<h[?[1-9]]?(.*)?[>]+)(.*)([<]+.*[>]+)Code-Sprache: HTML, XML (xml)

Damit werden alle Überschriften gesammelt. So könnte man automatisch Anker hinterlegen, die dann anderweitig verwendet werden könnten.

Ein sehr guter Regex-Tester, den ich immer gerne verwende:

regex101 – regex101.com