The Internet abounds with examples of bad practices in WordPress development. Using do_shortcode() unnecessarily is one of the most pervasive.
do_shortcode() runs a fairly extensive regex (regular expression) that has to go through every possible shortcode. Konstantin Kovshenin has a good explanation of this:
That regex looks for all registered shortcodes within a string. For each match, it runs a replacement with a callback function, which also take the time to parse the shortcode attributes, before finally calling the actual callback function that’s been registered with
add_shortcode.
Searching for the callback (function) and using it directly is preferable to using do_shortcode(). But what if you can’t? What if it’s in an object class?
Here is a simple utility function you can use to run a shortcode’s callback function, even if it’s in a class. It supports passing attributes and content.
/**
* Call a shortcode function by its tag name.
*
* Directly executes a shortcode's callback function using the shortcode's
* tag name. Can execute a function even if it's in an object class.
* Simply pass the shortcode's tag and an array of any attributes.
*
* @global array $shortcode_tags
* @param string $tag The shortcode tag name.
* @param array $atts The attributes (optional).
* @param array $content The shortcode content (null by default).
*
* @return string|bool False on failure, the result of the shortcode on success.
*/
function do_shortcode_func( $tag, array $atts = array(), $content = null ) {
global $shortcode_tags;
if ( ! isset( $shortcode_tags[ $tag ] ) ) {
return false;
}
return call_user_func( $shortcode_tags[ $tag ], $atts, $content, $tag );
}
Leave a Reply