Edit File by line
/home/zeestwma/richards.../wp-inclu...
File: shortcodes.php
<?php
[0] Fix | Delete
/**
[1] Fix | Delete
* WordPress API for creating bbcode-like tags or what WordPress calls
[2] Fix | Delete
* "shortcodes". The tag and attribute parsing or regular expression code is
[3] Fix | Delete
* based on the Textpattern tag parser.
[4] Fix | Delete
*
[5] Fix | Delete
* A few examples are below:
[6] Fix | Delete
*
[7] Fix | Delete
* [shortcode /]
[8] Fix | Delete
* [shortcode foo="bar" baz="bing" /]
[9] Fix | Delete
* [shortcode foo="bar"]content[/shortcode]
[10] Fix | Delete
*
[11] Fix | Delete
* Shortcode tags support attributes and enclosed content, but does not entirely
[12] Fix | Delete
* support inline shortcodes in other shortcodes. You will have to call the
[13] Fix | Delete
* shortcode parser in your function to account for that.
[14] Fix | Delete
*
[15] Fix | Delete
* {@internal
[16] Fix | Delete
* Please be aware that the above note was made during the beta of WordPress 2.6
[17] Fix | Delete
* and in the future may not be accurate. Please update the note when it is no
[18] Fix | Delete
* longer the case.}}
[19] Fix | Delete
*
[20] Fix | Delete
* To apply shortcode tags to content:
[21] Fix | Delete
*
[22] Fix | Delete
* $out = do_shortcode( $content );
[23] Fix | Delete
*
[24] Fix | Delete
* @link https://developer.wordpress.org/plugins/shortcodes/
[25] Fix | Delete
*
[26] Fix | Delete
* @package WordPress
[27] Fix | Delete
* @subpackage Shortcodes
[28] Fix | Delete
* @since 2.5.0
[29] Fix | Delete
*/
[30] Fix | Delete
[31] Fix | Delete
/**
[32] Fix | Delete
* Container for storing shortcode tags and their hook to call for the shortcode.
[33] Fix | Delete
*
[34] Fix | Delete
* @since 2.5.0
[35] Fix | Delete
*
[36] Fix | Delete
* @name $shortcode_tags
[37] Fix | Delete
* @var array
[38] Fix | Delete
* @global array $shortcode_tags
[39] Fix | Delete
*/
[40] Fix | Delete
$shortcode_tags = array();
[41] Fix | Delete
[42] Fix | Delete
/**
[43] Fix | Delete
* Adds a new shortcode.
[44] Fix | Delete
*
[45] Fix | Delete
* Care should be taken through prefixing or other means to ensure that the
[46] Fix | Delete
* shortcode tag being added is unique and will not conflict with other,
[47] Fix | Delete
* already-added shortcode tags. In the event of a duplicated tag, the tag
[48] Fix | Delete
* loaded last will take precedence.
[49] Fix | Delete
*
[50] Fix | Delete
* @since 2.5.0
[51] Fix | Delete
*
[52] Fix | Delete
* @global array $shortcode_tags
[53] Fix | Delete
*
[54] Fix | Delete
* @param string $tag Shortcode tag to be searched in post content.
[55] Fix | Delete
* @param callable $callback The callback function to run when the shortcode is found.
[56] Fix | Delete
* Every shortcode callback is passed three parameters by default,
[57] Fix | Delete
* including an array of attributes (`$atts`), the shortcode content
[58] Fix | Delete
* or null if not set (`$content`), and finally the shortcode tag
[59] Fix | Delete
* itself (`$shortcode_tag`), in that order.
[60] Fix | Delete
*/
[61] Fix | Delete
function add_shortcode( $tag, $callback ) {
[62] Fix | Delete
global $shortcode_tags;
[63] Fix | Delete
[64] Fix | Delete
if ( '' === trim( $tag ) ) {
[65] Fix | Delete
_doing_it_wrong(
[66] Fix | Delete
__FUNCTION__,
[67] Fix | Delete
__( 'Invalid shortcode name: Empty name given.' ),
[68] Fix | Delete
'4.4.0'
[69] Fix | Delete
);
[70] Fix | Delete
return;
[71] Fix | Delete
}
[72] Fix | Delete
[73] Fix | Delete
if ( 0 !== preg_match( '@[<>&/\[\]\x00-\x20=]@', $tag ) ) {
[74] Fix | Delete
_doing_it_wrong(
[75] Fix | Delete
__FUNCTION__,
[76] Fix | Delete
sprintf(
[77] Fix | Delete
/* translators: 1: Shortcode name, 2: Space-separated list of reserved characters. */
[78] Fix | Delete
__( 'Invalid shortcode name: %1$s. Do not use spaces or reserved characters: %2$s' ),
[79] Fix | Delete
$tag,
[80] Fix | Delete
'& / < > [ ] ='
[81] Fix | Delete
),
[82] Fix | Delete
'4.4.0'
[83] Fix | Delete
);
[84] Fix | Delete
return;
[85] Fix | Delete
}
[86] Fix | Delete
[87] Fix | Delete
$shortcode_tags[ $tag ] = $callback;
[88] Fix | Delete
}
[89] Fix | Delete
[90] Fix | Delete
/**
[91] Fix | Delete
* Removes hook for shortcode.
[92] Fix | Delete
*
[93] Fix | Delete
* @since 2.5.0
[94] Fix | Delete
*
[95] Fix | Delete
* @global array $shortcode_tags
[96] Fix | Delete
*
[97] Fix | Delete
* @param string $tag Shortcode tag to remove hook for.
[98] Fix | Delete
*/
[99] Fix | Delete
function remove_shortcode( $tag ) {
[100] Fix | Delete
global $shortcode_tags;
[101] Fix | Delete
[102] Fix | Delete
unset( $shortcode_tags[ $tag ] );
[103] Fix | Delete
}
[104] Fix | Delete
[105] Fix | Delete
/**
[106] Fix | Delete
* Clears all shortcodes.
[107] Fix | Delete
*
[108] Fix | Delete
* This function clears all of the shortcode tags by replacing the shortcodes global with
[109] Fix | Delete
* an empty array. This is actually an efficient method for removing all shortcodes.
[110] Fix | Delete
*
[111] Fix | Delete
* @since 2.5.0
[112] Fix | Delete
*
[113] Fix | Delete
* @global array $shortcode_tags
[114] Fix | Delete
*/
[115] Fix | Delete
function remove_all_shortcodes() {
[116] Fix | Delete
global $shortcode_tags;
[117] Fix | Delete
[118] Fix | Delete
$shortcode_tags = array();
[119] Fix | Delete
}
[120] Fix | Delete
[121] Fix | Delete
/**
[122] Fix | Delete
* Determines whether a registered shortcode exists named $tag.
[123] Fix | Delete
*
[124] Fix | Delete
* @since 3.6.0
[125] Fix | Delete
*
[126] Fix | Delete
* @global array $shortcode_tags List of shortcode tags and their callback hooks.
[127] Fix | Delete
*
[128] Fix | Delete
* @param string $tag Shortcode tag to check.
[129] Fix | Delete
* @return bool Whether the given shortcode exists.
[130] Fix | Delete
*/
[131] Fix | Delete
function shortcode_exists( $tag ) {
[132] Fix | Delete
global $shortcode_tags;
[133] Fix | Delete
return array_key_exists( $tag, $shortcode_tags );
[134] Fix | Delete
}
[135] Fix | Delete
[136] Fix | Delete
/**
[137] Fix | Delete
* Determines whether the passed content contains the specified shortcode.
[138] Fix | Delete
*
[139] Fix | Delete
* @since 3.6.0
[140] Fix | Delete
*
[141] Fix | Delete
* @global array $shortcode_tags
[142] Fix | Delete
*
[143] Fix | Delete
* @param string $content Content to search for shortcodes.
[144] Fix | Delete
* @param string $tag Shortcode tag to check.
[145] Fix | Delete
* @return bool Whether the passed content contains the given shortcode.
[146] Fix | Delete
*/
[147] Fix | Delete
function has_shortcode( $content, $tag ) {
[148] Fix | Delete
if ( ! str_contains( $content, '[' ) ) {
[149] Fix | Delete
return false;
[150] Fix | Delete
}
[151] Fix | Delete
[152] Fix | Delete
if ( shortcode_exists( $tag ) ) {
[153] Fix | Delete
preg_match_all( '/' . get_shortcode_regex() . '/', $content, $matches, PREG_SET_ORDER );
[154] Fix | Delete
if ( empty( $matches ) ) {
[155] Fix | Delete
return false;
[156] Fix | Delete
}
[157] Fix | Delete
[158] Fix | Delete
foreach ( $matches as $shortcode ) {
[159] Fix | Delete
if ( $tag === $shortcode[2] ) {
[160] Fix | Delete
return true;
[161] Fix | Delete
} elseif ( ! empty( $shortcode[5] ) && has_shortcode( $shortcode[5], $tag ) ) {
[162] Fix | Delete
return true;
[163] Fix | Delete
}
[164] Fix | Delete
}
[165] Fix | Delete
}
[166] Fix | Delete
return false;
[167] Fix | Delete
}
[168] Fix | Delete
[169] Fix | Delete
/**
[170] Fix | Delete
* Returns a list of registered shortcode names found in the given content.
[171] Fix | Delete
*
[172] Fix | Delete
* Example usage:
[173] Fix | Delete
*
[174] Fix | Delete
* get_shortcode_tags_in_content( '[audio src="file.mp3"][/audio] [foo] [gallery ids="1,2,3"]' );
[175] Fix | Delete
* // array( 'audio', 'gallery' )
[176] Fix | Delete
*
[177] Fix | Delete
* @since 6.3.2
[178] Fix | Delete
*
[179] Fix | Delete
* @param string $content The content to check.
[180] Fix | Delete
* @return string[] An array of registered shortcode names found in the content.
[181] Fix | Delete
*/
[182] Fix | Delete
function get_shortcode_tags_in_content( $content ) {
[183] Fix | Delete
if ( false === strpos( $content, '[' ) ) {
[184] Fix | Delete
return array();
[185] Fix | Delete
}
[186] Fix | Delete
[187] Fix | Delete
preg_match_all( '/' . get_shortcode_regex() . '/', $content, $matches, PREG_SET_ORDER );
[188] Fix | Delete
if ( empty( $matches ) ) {
[189] Fix | Delete
return array();
[190] Fix | Delete
}
[191] Fix | Delete
[192] Fix | Delete
$tags = array();
[193] Fix | Delete
foreach ( $matches as $shortcode ) {
[194] Fix | Delete
$tags[] = $shortcode[2];
[195] Fix | Delete
[196] Fix | Delete
if ( ! empty( $shortcode[5] ) ) {
[197] Fix | Delete
$deep_tags = get_shortcode_tags_in_content( $shortcode[5] );
[198] Fix | Delete
if ( ! empty( $deep_tags ) ) {
[199] Fix | Delete
$tags = array_merge( $tags, $deep_tags );
[200] Fix | Delete
}
[201] Fix | Delete
}
[202] Fix | Delete
}
[203] Fix | Delete
[204] Fix | Delete
return $tags;
[205] Fix | Delete
}
[206] Fix | Delete
[207] Fix | Delete
/**
[208] Fix | Delete
* Searches content for shortcodes and filter shortcodes through their hooks.
[209] Fix | Delete
*
[210] Fix | Delete
* This function is an alias for do_shortcode().
[211] Fix | Delete
*
[212] Fix | Delete
* @since 5.4.0
[213] Fix | Delete
*
[214] Fix | Delete
* @see do_shortcode()
[215] Fix | Delete
*
[216] Fix | Delete
* @param string $content Content to search for shortcodes.
[217] Fix | Delete
* @param bool $ignore_html When true, shortcodes inside HTML elements will be skipped.
[218] Fix | Delete
* Default false.
[219] Fix | Delete
* @return string Content with shortcodes filtered out.
[220] Fix | Delete
*/
[221] Fix | Delete
function apply_shortcodes( $content, $ignore_html = false ) {
[222] Fix | Delete
return do_shortcode( $content, $ignore_html );
[223] Fix | Delete
}
[224] Fix | Delete
[225] Fix | Delete
/**
[226] Fix | Delete
* Searches content for shortcodes and filter shortcodes through their hooks.
[227] Fix | Delete
*
[228] Fix | Delete
* If there are no shortcode tags defined, then the content will be returned
[229] Fix | Delete
* without any filtering. This might cause issues when plugins are disabled but
[230] Fix | Delete
* the shortcode will still show up in the post or content.
[231] Fix | Delete
*
[232] Fix | Delete
* @since 2.5.0
[233] Fix | Delete
*
[234] Fix | Delete
* @global array $shortcode_tags List of shortcode tags and their callback hooks.
[235] Fix | Delete
*
[236] Fix | Delete
* @param string $content Content to search for shortcodes.
[237] Fix | Delete
* @param bool $ignore_html When true, shortcodes inside HTML elements will be skipped.
[238] Fix | Delete
* Default false.
[239] Fix | Delete
* @return string Content with shortcodes filtered out.
[240] Fix | Delete
*/
[241] Fix | Delete
function do_shortcode( $content, $ignore_html = false ) {
[242] Fix | Delete
global $shortcode_tags;
[243] Fix | Delete
[244] Fix | Delete
if ( ! str_contains( $content, '[' ) ) {
[245] Fix | Delete
return $content;
[246] Fix | Delete
}
[247] Fix | Delete
[248] Fix | Delete
if ( empty( $shortcode_tags ) || ! is_array( $shortcode_tags ) ) {
[249] Fix | Delete
return $content;
[250] Fix | Delete
}
[251] Fix | Delete
[252] Fix | Delete
// Find all registered tag names in $content.
[253] Fix | Delete
preg_match_all( '@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches );
[254] Fix | Delete
$tagnames = array_intersect( array_keys( $shortcode_tags ), $matches[1] );
[255] Fix | Delete
[256] Fix | Delete
if ( empty( $tagnames ) ) {
[257] Fix | Delete
return $content;
[258] Fix | Delete
}
[259] Fix | Delete
[260] Fix | Delete
// Ensure this context is only added once if shortcodes are nested.
[261] Fix | Delete
$has_filter = has_filter( 'wp_get_attachment_image_context', '_filter_do_shortcode_context' );
[262] Fix | Delete
$filter_added = false;
[263] Fix | Delete
[264] Fix | Delete
if ( ! $has_filter ) {
[265] Fix | Delete
$filter_added = add_filter( 'wp_get_attachment_image_context', '_filter_do_shortcode_context' );
[266] Fix | Delete
}
[267] Fix | Delete
[268] Fix | Delete
$content = do_shortcodes_in_html_tags( $content, $ignore_html, $tagnames );
[269] Fix | Delete
[270] Fix | Delete
$pattern = get_shortcode_regex( $tagnames );
[271] Fix | Delete
$content = preg_replace_callback( "/$pattern/", 'do_shortcode_tag', $content );
[272] Fix | Delete
[273] Fix | Delete
// Always restore square braces so we don't break things like <!--[if IE ]>.
[274] Fix | Delete
$content = unescape_invalid_shortcodes( $content );
[275] Fix | Delete
[276] Fix | Delete
// Only remove the filter if it was added in this scope.
[277] Fix | Delete
if ( $filter_added ) {
[278] Fix | Delete
remove_filter( 'wp_get_attachment_image_context', '_filter_do_shortcode_context' );
[279] Fix | Delete
}
[280] Fix | Delete
[281] Fix | Delete
return $content;
[282] Fix | Delete
}
[283] Fix | Delete
[284] Fix | Delete
/**
[285] Fix | Delete
* Filter the `wp_get_attachment_image_context` hook during shortcode rendering.
[286] Fix | Delete
*
[287] Fix | Delete
* When wp_get_attachment_image() is called during shortcode rendering, we need to make clear
[288] Fix | Delete
* that the context is a shortcode and not part of the theme's template rendering logic.
[289] Fix | Delete
*
[290] Fix | Delete
* @since 6.3.0
[291] Fix | Delete
* @access private
[292] Fix | Delete
*
[293] Fix | Delete
* @return string The filtered context value for wp_get_attachment_images when doing shortcodes.
[294] Fix | Delete
*/
[295] Fix | Delete
function _filter_do_shortcode_context() {
[296] Fix | Delete
return 'do_shortcode';
[297] Fix | Delete
}
[298] Fix | Delete
[299] Fix | Delete
/**
[300] Fix | Delete
* Retrieves the shortcode regular expression for searching.
[301] Fix | Delete
*
[302] Fix | Delete
* The regular expression combines the shortcode tags in the regular expression
[303] Fix | Delete
* in a regex class.
[304] Fix | Delete
*
[305] Fix | Delete
* The regular expression contains 6 different sub matches to help with parsing.
[306] Fix | Delete
*
[307] Fix | Delete
* 1 - An extra [ to allow for escaping shortcodes with double [[]]
[308] Fix | Delete
* 2 - The shortcode name
[309] Fix | Delete
* 3 - The shortcode argument list
[310] Fix | Delete
* 4 - The self closing /
[311] Fix | Delete
* 5 - The content of a shortcode when it wraps some content.
[312] Fix | Delete
* 6 - An extra ] to allow for escaping shortcodes with double [[]]
[313] Fix | Delete
*
[314] Fix | Delete
* @since 2.5.0
[315] Fix | Delete
* @since 4.4.0 Added the `$tagnames` parameter.
[316] Fix | Delete
*
[317] Fix | Delete
* @global array $shortcode_tags
[318] Fix | Delete
*
[319] Fix | Delete
* @param array $tagnames Optional. List of shortcodes to find. Defaults to all registered shortcodes.
[320] Fix | Delete
* @return string The shortcode search regular expression
[321] Fix | Delete
*/
[322] Fix | Delete
function get_shortcode_regex( $tagnames = null ) {
[323] Fix | Delete
global $shortcode_tags;
[324] Fix | Delete
[325] Fix | Delete
if ( empty( $tagnames ) ) {
[326] Fix | Delete
$tagnames = array_keys( $shortcode_tags );
[327] Fix | Delete
}
[328] Fix | Delete
$tagregexp = implode( '|', array_map( 'preg_quote', $tagnames ) );
[329] Fix | Delete
[330] Fix | Delete
/*
[331] Fix | Delete
* WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcode_tag().
[332] Fix | Delete
* Also, see shortcode_unautop() and shortcode.js.
[333] Fix | Delete
*/
[334] Fix | Delete
[335] Fix | Delete
// phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- don't remove regex indentation
[336] Fix | Delete
return '\\[' // Opening bracket.
[337] Fix | Delete
. '(\\[?)' // 1: Optional second opening bracket for escaping shortcodes: [[tag]].
[338] Fix | Delete
. "($tagregexp)" // 2: Shortcode name.
[339] Fix | Delete
. '(?![\\w-])' // Not followed by word character or hyphen.
[340] Fix | Delete
. '(' // 3: Unroll the loop: Inside the opening shortcode tag.
[341] Fix | Delete
. '[^\\]\\/]*' // Not a closing bracket or forward slash.
[342] Fix | Delete
. '(?:'
[343] Fix | Delete
. '\\/(?!\\])' // A forward slash not followed by a closing bracket.
[344] Fix | Delete
. '[^\\]\\/]*' // Not a closing bracket or forward slash.
[345] Fix | Delete
. ')*?'
[346] Fix | Delete
. ')'
[347] Fix | Delete
. '(?:'
[348] Fix | Delete
. '(\\/)' // 4: Self closing tag...
[349] Fix | Delete
. '\\]' // ...and closing bracket.
[350] Fix | Delete
. '|'
[351] Fix | Delete
. '\\]' // Closing bracket.
[352] Fix | Delete
. '(?:'
[353] Fix | Delete
. '(' // 5: Unroll the loop: Optionally, anything between the opening and closing shortcode tags.
[354] Fix | Delete
. '[^\\[]*+' // Not an opening bracket.
[355] Fix | Delete
. '(?:'
[356] Fix | Delete
. '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag.
[357] Fix | Delete
. '[^\\[]*+' // Not an opening bracket.
[358] Fix | Delete
. ')*+'
[359] Fix | Delete
. ')'
[360] Fix | Delete
. '\\[\\/\\2\\]' // Closing shortcode tag.
[361] Fix | Delete
. ')?'
[362] Fix | Delete
. ')'
[363] Fix | Delete
. '(\\]?)'; // 6: Optional second closing bracket for escaping shortcodes: [[tag]].
[364] Fix | Delete
// phpcs:enable
[365] Fix | Delete
}
[366] Fix | Delete
[367] Fix | Delete
/**
[368] Fix | Delete
* Regular Expression callable for do_shortcode() for calling shortcode hook.
[369] Fix | Delete
*
[370] Fix | Delete
* @see get_shortcode_regex() for details of the match array contents.
[371] Fix | Delete
*
[372] Fix | Delete
* @since 2.5.0
[373] Fix | Delete
* @access private
[374] Fix | Delete
*
[375] Fix | Delete
* @global array $shortcode_tags
[376] Fix | Delete
*
[377] Fix | Delete
* @param array $m {
[378] Fix | Delete
* Regular expression match array.
[379] Fix | Delete
*
[380] Fix | Delete
* @type string $0 Entire matched shortcode text.
[381] Fix | Delete
* @type string $1 Optional second opening bracket for escaping shortcodes.
[382] Fix | Delete
* @type string $2 Shortcode name.
[383] Fix | Delete
* @type string $3 Shortcode arguments list.
[384] Fix | Delete
* @type string $4 Optional self closing slash.
[385] Fix | Delete
* @type string $5 Content of a shortcode when it wraps some content.
[386] Fix | Delete
* @type string $6 Optional second closing bracket for escaping shortcodes.
[387] Fix | Delete
* }
[388] Fix | Delete
* @return string Shortcode output.
[389] Fix | Delete
*/
[390] Fix | Delete
function do_shortcode_tag( $m ) {
[391] Fix | Delete
global $shortcode_tags;
[392] Fix | Delete
[393] Fix | Delete
// Allow [[foo]] syntax for escaping a tag.
[394] Fix | Delete
if ( '[' === $m[1] && ']' === $m[6] ) {
[395] Fix | Delete
return substr( $m[0], 1, -1 );
[396] Fix | Delete
}
[397] Fix | Delete
[398] Fix | Delete
$tag = $m[2];
[399] Fix | Delete
$attr = shortcode_parse_atts( $m[3] );
[400] Fix | Delete
[401] Fix | Delete
if ( ! is_callable( $shortcode_tags[ $tag ] ) ) {
[402] Fix | Delete
_doing_it_wrong(
[403] Fix | Delete
__FUNCTION__,
[404] Fix | Delete
/* translators: %s: Shortcode tag. */
[405] Fix | Delete
sprintf( __( 'Attempting to parse a shortcode without a valid callback: %s' ), $tag ),
[406] Fix | Delete
'4.3.0'
[407] Fix | Delete
);
[408] Fix | Delete
return $m[0];
[409] Fix | Delete
}
[410] Fix | Delete
[411] Fix | Delete
/**
[412] Fix | Delete
* Filters whether to call a shortcode callback.
[413] Fix | Delete
*
[414] Fix | Delete
* Returning a non-false value from filter will short-circuit the
[415] Fix | Delete
* shortcode generation process, returning that value instead.
[416] Fix | Delete
*
[417] Fix | Delete
* @since 4.7.0
[418] Fix | Delete
* @since 6.5.0 The `$attr` parameter is always an array.
[419] Fix | Delete
*
[420] Fix | Delete
* @param false|string $output Short-circuit return value. Either false or the value to replace the shortcode with.
[421] Fix | Delete
* @param string $tag Shortcode name.
[422] Fix | Delete
* @param array $attr Shortcode attributes array, can be empty if the original arguments string cannot be parsed.
[423] Fix | Delete
* @param array $m Regular expression match array.
[424] Fix | Delete
*/
[425] Fix | Delete
$return = apply_filters( 'pre_do_shortcode_tag', false, $tag, $attr, $m );
[426] Fix | Delete
if ( false !== $return ) {
[427] Fix | Delete
return $return;
[428] Fix | Delete
}
[429] Fix | Delete
[430] Fix | Delete
$content = isset( $m[5] ) ? $m[5] : null;
[431] Fix | Delete
[432] Fix | Delete
$output = $m[1] . call_user_func( $shortcode_tags[ $tag ], $attr, $content, $tag ) . $m[6];
[433] Fix | Delete
[434] Fix | Delete
/**
[435] Fix | Delete
* Filters the output created by a shortcode callback.
[436] Fix | Delete
*
[437] Fix | Delete
* @since 4.7.0
[438] Fix | Delete
* @since 6.5.0 The `$attr` parameter is always an array.
[439] Fix | Delete
*
[440] Fix | Delete
* @param string $output Shortcode output.
[441] Fix | Delete
* @param string $tag Shortcode name.
[442] Fix | Delete
* @param array $attr Shortcode attributes array, can be empty if the original arguments string cannot be parsed.
[443] Fix | Delete
* @param array $m Regular expression match array.
[444] Fix | Delete
*/
[445] Fix | Delete
return apply_filters( 'do_shortcode_tag', $output, $tag, $attr, $m );
[446] Fix | Delete
}
[447] Fix | Delete
[448] Fix | Delete
/**
[449] Fix | Delete
* Searches only inside HTML elements for shortcodes and process them.
[450] Fix | Delete
*
[451] Fix | Delete
* Any [ or ] characters remaining inside elements will be HTML encoded
[452] Fix | Delete
* to prevent interference with shortcodes that are outside the elements.
[453] Fix | Delete
* Assumes $content processed by KSES already. Users with unfiltered_html
[454] Fix | Delete
* capability may get unexpected output if angle braces are nested in tags.
[455] Fix | Delete
*
[456] Fix | Delete
* @since 4.2.3
[457] Fix | Delete
*
[458] Fix | Delete
* @param string $content Content to search for shortcodes.
[459] Fix | Delete
* @param bool $ignore_html When true, all square braces inside elements will be encoded.
[460] Fix | Delete
* @param array $tagnames List of shortcodes to find.
[461] Fix | Delete
* @return string Content with shortcodes filtered out.
[462] Fix | Delete
*/
[463] Fix | Delete
function do_shortcodes_in_html_tags( $content, $ignore_html, $tagnames ) {
[464] Fix | Delete
// Normalize entities in unfiltered HTML before adding placeholders.
[465] Fix | Delete
$trans = array(
[466] Fix | Delete
'&#91;' => '&#091;',
[467] Fix | Delete
'&#93;' => '&#093;',
[468] Fix | Delete
);
[469] Fix | Delete
$content = strtr( $content, $trans );
[470] Fix | Delete
$trans = array(
[471] Fix | Delete
'[' => '&#91;',
[472] Fix | Delete
']' => '&#93;',
[473] Fix | Delete
);
[474] Fix | Delete
[475] Fix | Delete
$pattern = get_shortcode_regex( $tagnames );
[476] Fix | Delete
$textarr = wp_html_split( $content );
[477] Fix | Delete
[478] Fix | Delete
foreach ( $textarr as &$element ) {
[479] Fix | Delete
if ( '' === $element || '<' !== $element[0] ) {
[480] Fix | Delete
continue;
[481] Fix | Delete
}
[482] Fix | Delete
[483] Fix | Delete
$noopen = ! str_contains( $element, '[' );
[484] Fix | Delete
$noclose = ! str_contains( $element, ']' );
[485] Fix | Delete
if ( $noopen || $noclose ) {
[486] Fix | Delete
// This element does not contain shortcodes.
[487] Fix | Delete
if ( $noopen xor $noclose ) {
[488] Fix | Delete
// Need to encode stray '[' or ']' chars.
[489] Fix | Delete
$element = strtr( $element, $trans );
[490] Fix | Delete
}
[491] Fix | Delete
continue;
[492] Fix | Delete
}
[493] Fix | Delete
[494] Fix | Delete
if ( $ignore_html || str_starts_with( $element, '<!--' ) || str_starts_with( $element, '<![CDATA[' ) ) {
[495] Fix | Delete
// Encode all '[' and ']' chars.
[496] Fix | Delete
$element = strtr( $element, $trans );
[497] Fix | Delete
continue;
[498] Fix | Delete
}
[499] Fix | Delete
12
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function