do_shortcode( string $content, bool $ignore_html = false ): string

Searches content for shortcodes and filter shortcodes through their hooks.

Description

If there are no shortcode tags defined, then the content will be returned without any filtering. This might cause issues when plugins are disabled but the shortcode will still show up in the post or content.

Parameters

$contentstringrequired
Content to search for shortcodes.
$ignore_htmlbooloptional
When true, shortcodes inside HTML elements will be skipped.

Default:false

Return

string Content with shortcodes filtered out.

More Information

If there are no shortcode tags defined, then the content will be returned without any filtering. This might cause issues if a plugin is disabled as its shortcode will still show up in the post or content.

Source

function do_shortcode( $content, $ignore_html = false ) {
	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 );
	$tagnames = array_intersect( array_keys( $shortcode_tags ), $matches[1] );

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

	// Ensure this context is only added once if shortcodes are nested.
	$has_filter   = has_filter( 'wp_get_attachment_image_context', '_filter_do_shortcode_context' );
	$filter_added = false;

	if ( ! $has_filter ) {
		$filter_added = add_filter( 'wp_get_attachment_image_context', '_filter_do_shortcode_context' );
	}

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

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

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

	// Only remove the filter if it was added in this scope.
	if ( $filter_added ) {
		remove_filter( 'wp_get_attachment_image_context', '_filter_do_shortcode_context' );
	}

	return $content;
}

Changelog

VersionDescription
2.5.0Introduced.

User Contributed Notes

  1. Skip to note 10 content
    // Use shortcode in a PHP file (outside the post editor).
    echo do_shortcode( '' );
    // In case there is opening and closing shortcode.
    echo do_shortcode( '[iscorrect]' . $text_to_be_wrapped_in_shortcode . '[/iscorrect]' );
    // Enable the use of shortcodes in text widgets.
    add_filter( 'widget_text', 'do_shortcode' );
    // Use shortcodes in form like Landing Page Template.
    echo do_shortcode( '[contact-form-7 id="91" title="quote"]' );
    // Store the short code in a variable.
    $var = do_shortcode( '' );
    echo $var;
  2. Skip to note 15 content

    To only allow specific shortcodes in comments:

    add_filter('get_comment_text', function ($comment) {
        $finalComment = '';
        $allowed = ['snippet', 'quote'];
        $parts = preg_split('/(\[\/?\w+\])/', $comment, null, PREG_SPLIT_DELIM_CAPTURE);
    
        for ($i = 0; $i < sizeof($parts); $i++) {
            if (preg_match('/\[\w+\]/', $parts[$i])) {
                $shortcodeName = substr($parts[$i], 1, -1);
                if (in_array($shortcodeName, $allowed)) {
                    $finalComment .= do_shortcode($parts[$i] . $parts[$i+1] . $parts[$i+2]);
                    echo '++' . $parts[$i] . $parts[$i+1] . $parts[$i+2] . '++' . $i;
                    $i += 2;
                } else {
                   $finalComment .= $parts[$i];  
                }
            } else {
                $finalComment .= $parts[$i];
            }
        }
        return $finalComment;
    });
  3. Skip to note 16 content

    An easy approach to defining and using shortcode.

    function wpdocs_custom_shortcode ( $content = null ) {
    	
    	/*------Declare Variables------*/
    	$part_1 = $part_2 = $part_3 = $part_4 = $part_5 = '';
    
    	/*------Starting Portion------*/
    	$part_1 .= '<div class="content-wrapper">';
    	$part_2 .= '<h3 class="content-heading">Here is a heading</h3>';
    	$part_3 .= '<div class="content-output">';
    
    	/*------Ending Portion------*/
    	$part_4 .= '</div>';
    	$part_5 .= '</div>';
    	
    	/*------Return------*/
    	return $part_1 . $part_2 . $part_3 . do_shortcode( $content ) . $part_4 . $part_5; 
    }
    /*------Register Shortcode------*/
    add_shortcode( 'shortcode_name', 'wpdocs_custom_shortcode' );

    Now you can use [shortcode_name]........ your content ........ [/shortcode_name] in your post editor.

  4. Skip to note 17 content

    Sometimes could be really useful to have a shortcode inside another:

    function wpdocs_concat_shortcodes() {
        $output = 'My new shortcode';
    
        // Add the old shortcode to the new one
        return do_shortcode( '[wpdocs_box]' ) . $output;
        
    }
    add_shortcode( 'wpdocs_both_shortcodes', 'wpdocs_concat_shortcodes' );

You must log in before being able to contribute a note or feedback.