<?php
/**
- * WordPress API for creating bbcode like tags or what WordPress calls
- * "shortcodes." The tag and attribute parsing or regular expression code is
+ * WordPress API for creating bbcode-like tags or what WordPress calls
+ * "shortcodes". The tag and attribute parsing or regular expression code is
* based on the Textpattern tag parser.
*
* A few examples are below:
return;
}
- if ( 0 !== preg_match( '@[<>&/\[\]\x00-\x20]@', $tag ) ) {
- /* translators: %s: shortcode name */
- $message = sprintf( __( 'Invalid shortcode name: %s. Do not use spaces or reserved characters: & / < > [ ]' ), $tag );
+ if ( 0 !== preg_match( '@[<>&/\[\]\x00-\x20=]@', $tag ) ) {
+ /* translators: 1: shortcode name, 2: space separated list of reserved characters */
+ $message = sprintf( __( 'Invalid shortcode name: %1$s. Do not use spaces or reserved characters: %2$s' ), $tag, '& / < > [ ] =' );
_doing_it_wrong( __FUNCTION__, $message, '4.4.0' );
return;
}
return $content;
// Find all registered tag names in $content.
- preg_match_all( '@\[([^<>&/\[\]\x00-\x20]++)@', $content, $matches );
+ preg_match_all( '@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches );
$tagnames = array_intersect( array_keys( $shortcode_tags ), $matches[1] );
if ( empty( $tagnames ) ) {
* 6 - An extra ] to allow for escaping shortcodes with double [[]]
*
* @since 2.5.0
+ * @since 4.4.0 Added the `$tagnames` parameter.
*
* @global array $shortcode_tags
*
- * @param array $tagnames List of shortcodes to find. Optional. Defaults to all registered shortcodes.
+ * @param array $tagnames Optional. List of shortcodes to find. Defaults to all registered shortcodes.
* @return string The shortcode search regular expression
*/
function get_shortcode_regex( $tagnames = null ) {
return $m[0];
}
- if ( isset( $m[5] ) ) {
- // enclosing tag - extra parameter
- return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, $m[5], $tag ) . $m[6];
- } else {
- // self-closing tag
- return $m[1] . call_user_func( $shortcode_tags[$tag], $attr, null, $tag ) . $m[6];
+ /**
+ * Filters whether to call a shortcode callback.
+ *
+ * Passing a truthy value to the filter will effectively short-circuit the
+ * shortcode generation process, returning that value instead.
+ *
+ * @since 4.7.0
+ *
+ * @param bool|string $return Short-circuit return value. Either false or the value to replace the shortcode with.
+ * @param string $tag Shortcode name.
+ * @param array $attr Shortcode attributes array,
+ * @param array $m Regular expression match array.
+ */
+ $return = apply_filters( 'pre_do_shortcode_tag', false, $tag, $attr, $m );
+ if ( false !== $return ) {
+ return $return;
}
+
+ $content = isset( $m[5] ) ? $m[5] : null;
+
+ $output = $m[1] . call_user_func( $shortcode_tags[ $tag ], $attr, $content, $tag ) . $m[6];
+
+ /**
+ * Filters the output created by a shortcode callback.
+ *
+ * @since 4.7.0
+ *
+ * @param string $output Shortcode output.
+ * @param string $tag Shortcode name.
+ * @param array $attr Shortcode attributes array,
+ * @param array $m Regular expression match array.
+ */
+ return apply_filters( 'do_shortcode_tag', $output, $tag, $attr, $m );
}
/**
$out[$name] = $default;
}
/**
- * Filter a shortcode's default attributes.
+ * Filters a shortcode's default attributes.
*
* If the third parameter of the shortcode_atts() function is present then this filter is available.
* The third parameter, $shortcode, is the name of the shortcode.
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] );
+ 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;
}
/**
+ * Strips a shortcode tag based on RegEx matches against post content.
+ *
+ * @since 3.3.0
*
- * @param array $m
- * @return string|false
+ * @param array $m RegEx matches against post content.
+ * @return string|false The content stripped of the tag, otherwise false.
*/
function strip_shortcode_tag( $m ) {
// allow [[foo]] syntax for escaping a tag