H69UNtblNBNpha2dtB1Odn8qYp1Qk5NK2gi7yfceofo9N
e:
/
home
/
ajudasindico
/
Web
/
wp-includes
/
Nama File / Folder
Size
Action
ID3
--
NONE
IXR
--
NONE
PHPMailer
--
NONE
Requests
--
NONE
SimplePie
--
NONE
Text
--
NONE
assets
--
NONE
block-patterns
--
NONE
block-supports
--
NONE
blocks
--
NONE
certificates
--
NONE
css
--
NONE
customize
--
NONE
fonts
--
NONE
images
--
NONE
js
--
NONE
php-compat
--
NONE
pomo
--
NONE
random_compat
--
NONE
rest-api
--
NONE
sitemaps
--
NONE
sodium_compat
--
NONE
theme-compat
--
NONE
widgets
--
NONE
admin-bar.php
32.69KB
Hapus
Edit
Rename
atomlib.php
11.668KB
Hapus
Edit
Rename
author-template.php
16.631KB
Hapus
Edit
Rename
block-editor.php
18.371KB
Hapus
Edit
Rename
block-i18n.json
0.309KB
Hapus
Edit
Rename
block-patterns.php
4.191KB
Hapus
Edit
Rename
block-template-utils.php
29.572KB
Hapus
Edit
Rename
block-template.php
10.521KB
Hapus
Edit
Rename
blocks.php
42.222KB
Hapus
Edit
Rename
bookmark-template.php
12.598KB
Hapus
Edit
Rename
bookmark.php
14.973KB
Hapus
Edit
Rename
cache-compat.php
1.021KB
Hapus
Edit
Rename
cache.php
9.29KB
Hapus
Edit
Rename
canonical.php
32.31KB
Hapus
Edit
Rename
capabilities.php
34.884KB
Hapus
Edit
Rename
category-template.php
54.396KB
Hapus
Edit
Rename
category.php
12.414KB
Hapus
Edit
Rename
class-IXR.php
2.483KB
Hapus
Edit
Rename
class-feed.php
0.517KB
Hapus
Edit
Rename
class-http.php
0.364KB
Hapus
Edit
Rename
class-json.php
42.423KB
Hapus
Edit
Rename
class-oembed.php
0.397KB
Hapus
Edit
Rename
class-phpass.php
6.542KB
Hapus
Edit
Rename
class-phpmailer.php
0.648KB
Hapus
Edit
Rename
class-pop3.php
20.349KB
Hapus
Edit
Rename
class-requests.php
29.718KB
Hapus
Edit
Rename
class-simplepie.php
95.781KB
Hapus
Edit
Rename
class-smtp.php
0.446KB
Hapus
Edit
Rename
class-snoopy.php
36.831KB
Hapus
Edit
Rename
class-walker-category-dropdown.php
2.412KB
Hapus
Edit
Rename
class-walker-category.php
8.27KB
Hapus
Edit
Rename
class-walker-comment.php
13.878KB
Hapus
Edit
Rename
class-walker-nav-menu.php
9.13KB
Hapus
Edit
Rename
class-walker-page-dropdown.php
2.646KB
Hapus
Edit
Rename
class-walker-page.php
7.421KB
Hapus
Edit
Rename
class-wp-admin-bar.php
17.052KB
Hapus
Edit
Rename
class-wp-ajax-response.php
5.117KB
Hapus
Edit
Rename
class-wp-application-passwords.php
11.948KB
Hapus
Edit
Rename
class-wp-block-editor-context.php
0.869KB
Hapus
Edit
Rename
class-wp-block-list.php
4.612KB
Hapus
Edit
Rename
class-wp-block-parser.php
14.861KB
Hapus
Edit
Rename
class-wp-block-pattern-categories-registry.php
4.431KB
Hapus
Edit
Rename
class-wp-block-patterns-registry.php
5.796KB
Hapus
Edit
Rename
class-wp-block-styles-registry.php
4.882KB
Hapus
Edit
Rename
class-wp-block-supports.php
5.172KB
Hapus
Edit
Rename
class-wp-block-template.php
1.773KB
Hapus
Edit
Rename
class-wp-block-type-registry.php
4.533KB
Hapus
Edit
Rename
class-wp-block-type.php
9.27KB
Hapus
Edit
Rename
class-wp-block.php
7.991KB
Hapus
Edit
Rename
class-wp-comment-query.php
46.334KB
Hapus
Edit
Rename
class-wp-comment.php
9.103KB
Hapus
Edit
Rename
class-wp-customize-control.php
25.108KB
Hapus
Edit
Rename
class-wp-customize-manager.php
196.558KB
Hapus
Edit
Rename
class-wp-customize-nav-menus.php
55.448KB
Hapus
Edit
Rename
class-wp-customize-panel.php
10.192KB
Hapus
Edit
Rename
class-wp-customize-section.php
10.716KB
Hapus
Edit
Rename
class-wp-customize-setting.php
29.082KB
Hapus
Edit
Rename
class-wp-customize-widgets.php
69.517KB
Hapus
Edit
Rename
class-wp-date-query.php
34.173KB
Hapus
Edit
Rename
class-wp-dependency.php
2.452KB
Hapus
Edit
Rename
class-wp-editor.php
69.537KB
Hapus
Edit
Rename
class-wp-embed.php
15.567KB
Hapus
Edit
Rename
class-wp-error.php
7.131KB
Hapus
Edit
Rename
class-wp-fatal-error-handler.php
7.397KB
Hapus
Edit
Rename
class-wp-feed-cache-transient.php
2.5KB
Hapus
Edit
Rename
class-wp-feed-cache.php
0.947KB
Hapus
Edit
Rename
class-wp-hook.php
15.323KB
Hapus
Edit
Rename
class-wp-http-cookie.php
7.213KB
Hapus
Edit
Rename
class-wp-http-curl.php
12.099KB
Hapus
Edit
Rename
class-wp-http-encoding.php
6.507KB
Hapus
Edit
Rename
class-wp-http-ixr-client.php
3.394KB
Hapus
Edit
Rename
class-wp-http-proxy.php
5.82KB
Hapus
Edit
Rename
class-wp-http-requests-hooks.php
1.938KB
Hapus
Edit
Rename
class-wp-http-requests-response.php
4.241KB
Hapus
Edit
Rename
class-wp-http-response.php
2.882KB
Hapus
Edit
Rename
class-wp-http-streams.php
16.259KB
Hapus
Edit
Rename
class-wp-http.php
38.974KB
Hapus
Edit
Rename
class-wp-image-editor-gd.php
15.295KB
Hapus
Edit
Rename
class-wp-image-editor-imagick.php
26.329KB
Hapus
Edit
Rename
class-wp-image-editor.php
16.262KB
Hapus
Edit
Rename
class-wp-list-util.php
6.825KB
Hapus
Edit
Rename
class-wp-locale-switcher.php
4.904KB
Hapus
Edit
Rename
class-wp-locale.php
13.654KB
Hapus
Edit
Rename
class-wp-matchesmapregex.php
1.758KB
Hapus
Edit
Rename
class-wp-meta-query.php
29.471KB
Hapus
Edit
Rename
class-wp-metadata-lazyloader.php
5.227KB
Hapus
Edit
Rename
class-wp-network-query.php
18.722KB
Hapus
Edit
Rename
class-wp-network.php
12.089KB
Hapus
Edit
Rename
class-wp-object-cache.php
13.233KB
Hapus
Edit
Rename
class-wp-oembed-controller.php
6.667KB
Hapus
Edit
Rename
class-wp-oembed.php
29.982KB
Hapus
Edit
Rename
class-wp-paused-extensions-storage.php
4.808KB
Hapus
Edit
Rename
class-wp-post-type.php
20.72KB
Hapus
Edit
Rename
class-wp-post.php
6.272KB
Hapus
Edit
Rename
class-wp-query.php
135.702KB
Hapus
Edit
Rename
class-wp-recovery-mode-cookie-service.php
6.308KB
Hapus
Edit
Rename
class-wp-recovery-mode-email-service.php
10.41KB
Hapus
Edit
Rename
class-wp-recovery-mode-key-service.php
4.17KB
Hapus
Edit
Rename
class-wp-recovery-mode-link-service.php
3.321KB
Hapus
Edit
Rename
class-wp-recovery-mode.php
11.111KB
Hapus
Edit
Rename
class-wp-rewrite.php
61.486KB
Hapus
Edit
Rename
class-wp-role.php
2.439KB
Hapus
Edit
Rename
class-wp-roles.php
8.236KB
Hapus
Edit
Rename
class-wp-session-tokens.php
7.251KB
Hapus
Edit
Rename
class-wp-simplepie-file.php
3.183KB
Hapus
Edit
Rename
class-wp-simplepie-sanitize-kses.php
1.733KB
Hapus
Edit
Rename
class-wp-site-query.php
29.648KB
Hapus
Edit
Rename
class-wp-site.php
7.254KB
Hapus
Edit
Rename
class-wp-tax-query.php
18.993KB
Hapus
Edit
Rename
class-wp-taxonomy.php
13.409KB
Hapus
Edit
Rename
class-wp-term-query.php
37.178KB
Hapus
Edit
Rename
class-wp-term.php
5.148KB
Hapus
Edit
Rename
class-wp-text-diff-renderer-inline.php
0.699KB
Hapus
Edit
Rename
class-wp-text-diff-renderer-table.php
16.401KB
Hapus
Edit
Rename
class-wp-theme-json-resolver.php
14.063KB
Hapus
Edit
Rename
class-wp-theme-json-schema.php
4.195KB
Hapus
Edit
Rename
class-wp-theme-json.php
61.309KB
Hapus
Edit
Rename
class-wp-theme.php
52.563KB
Hapus
Edit
Rename
class-wp-user-meta-session-tokens.php
2.92KB
Hapus
Edit
Rename
class-wp-user-query.php
37.177KB
Hapus
Edit
Rename
class-wp-user-request.php
2.145KB
Hapus
Edit
Rename
class-wp-user.php
21.702KB
Hapus
Edit
Rename
class-wp-walker.php
12.707KB
Hapus
Edit
Rename
class-wp-widget-factory.php
3.243KB
Hapus
Edit
Rename
class-wp-widget.php
17.723KB
Hapus
Edit
Rename
class-wp-xmlrpc-server.php
207.944KB
Hapus
Edit
Rename
class-wp.php
24.67KB
Hapus
Edit
Rename
class.wp-dependencies.php
13.68KB
Hapus
Edit
Rename
class.wp-scripts.php
18.5KB
Hapus
Edit
Rename
class.wp-styles.php
10.626KB
Hapus
Edit
Rename
comment-template.php
93.813KB
Hapus
Edit
Rename
comment.php
123.567KB
Hapus
Edit
Rename
compat.php
14.524KB
Hapus
Edit
Rename
cron.php
39.899KB
Hapus
Edit
Rename
date.php
0.396KB
Hapus
Edit
Rename
default-constants.php
10.017KB
Hapus
Edit
Rename
default-filters.php
30.728KB
Hapus
Edit
Rename
default-widgets.php
2.17KB
Hapus
Edit
Rename
deprecated.php
121.944KB
Hapus
Edit
Rename
embed-template.php
0.333KB
Hapus
Edit
Rename
embed.php
36.05KB
Hapus
Edit
Rename
error-protection.php
4.021KB
Hapus
Edit
Rename
feed-atom-comments.php
5.316KB
Hapus
Edit
Rename
feed-atom.php
2.977KB
Hapus
Edit
Rename
feed-rdf.php
2.605KB
Hapus
Edit
Rename
feed-rss.php
1.161KB
Hapus
Edit
Rename
feed-rss2-comments.php
3.975KB
Hapus
Edit
Rename
feed-rss2.php
3.71KB
Hapus
Edit
Rename
feed.php
22.428KB
Hapus
Edit
Rename
formatting.php
318.689KB
Hapus
Edit
Rename
functions.php
251.333KB
Hapus
Edit
Rename
functions.wp-scripts.php
13.121KB
Hapus
Edit
Rename
functions.wp-styles.php
8.37KB
Hapus
Edit
Rename
general-template.php
155.356KB
Hapus
Edit
Rename
global-styles-and-settings.php
6.21KB
Hapus
Edit
Rename
http.php
22.463KB
Hapus
Edit
Rename
https-detection.php
6.701KB
Hapus
Edit
Rename
https-migration.php
4.619KB
Hapus
Edit
Rename
kses.php
67.492KB
Hapus
Edit
Rename
l10n.php
57.655KB
Hapus
Edit
Rename
link-template.php
145.705KB
Hapus
Edit
Rename
load.php
49.001KB
Hapus
Edit
Rename
locale.php
0.158KB
Hapus
Edit
Rename
media-template.php
58.967KB
Hapus
Edit
Rename
media.php
180.748KB
Hapus
Edit
Rename
meta.php
61.213KB
Hapus
Edit
Rename
ms-blogs.php
24.584KB
Hapus
Edit
Rename
ms-default-constants.php
4.652KB
Hapus
Edit
Rename
ms-default-filters.php
6.35KB
Hapus
Edit
Rename
ms-deprecated.php
20.634KB
Hapus
Edit
Rename
ms-files.php
2.592KB
Hapus
Edit
Rename
ms-functions.php
91.922KB
Hapus
Edit
Rename
ms-load.php
19.322KB
Hapus
Edit
Rename
ms-network.php
3.575KB
Hapus
Edit
Rename
ms-settings.php
4.027KB
Hapus
Edit
Rename
ms-site.php
38.679KB
Hapus
Edit
Rename
nav-menu-template.php
22.75KB
Hapus
Edit
Rename
nav-menu.php
41.552KB
Hapus
Edit
Rename
option.php
75.102KB
Hapus
Edit
Rename
pluggable-deprecated.php
6.116KB
Hapus
Edit
Rename
pluggable.php
101.957KB
Hapus
Edit
Rename
plugin.php
33.414KB
Hapus
Edit
Rename
post-formats.php
6.913KB
Hapus
Edit
Rename
post-template.php
63.328KB
Hapus
Edit
Rename
post-thumbnail-template.php
10.633KB
Hapus
Edit
Rename
post.php
268.666KB
Hapus
Edit
Rename
query.php
34.944KB
Hapus
Edit
Rename
registration-functions.php
0.195KB
Hapus
Edit
Rename
registration.php
0.195KB
Hapus
Edit
Rename
rest-api.php
93.053KB
Hapus
Edit
Rename
revision.php
22.933KB
Hapus
Edit
Rename
rewrite.php
18.763KB
Hapus
Edit
Rename
robots-template.php
5.052KB
Hapus
Edit
Rename
rss-functions.php
0.249KB
Hapus
Edit
Rename
rss.php
22.439KB
Hapus
Edit
Rename
script-loader.php
110.872KB
Hapus
Edit
Rename
session.php
0.252KB
Hapus
Edit
Rename
shortcodes.php
20.93KB
Hapus
Edit
Rename
sitemaps.php
3.162KB
Hapus
Edit
Rename
spl-autoload-compat.php
0.431KB
Hapus
Edit
Rename
taxonomy.php
167.623KB
Hapus
Edit
Rename
template-canvas.php
0.578KB
Hapus
Edit
Rename
template-loader.php
2.941KB
Hapus
Edit
Rename
template.php
21.958KB
Hapus
Edit
Rename
theme-i18n.json
0.903KB
Hapus
Edit
Rename
theme-templates.php
5.404KB
Hapus
Edit
Rename
theme.json
5.602KB
Hapus
Edit
Rename
theme.php
124.052KB
Hapus
Edit
Rename
update.php
29.338KB
Hapus
Edit
Rename
user.php
157.788KB
Hapus
Edit
Rename
vars.php
5.68KB
Hapus
Edit
Rename
version.php
0.937KB
Hapus
Edit
Rename
widgets.php
67.579KB
Hapus
Edit
Rename
wlwmanifest.xml
1.021KB
Hapus
Edit
Rename
wp-db.php
106.221KB
Hapus
Edit
Rename
wp-diff.php
0.632KB
Hapus
Edit
Rename
<?php /** * 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: * * [shortcode /] * [shortcode foo="bar" baz="bing" /] * [shortcode foo="bar"]content[/shortcode] * * Shortcode tags support attributes and enclosed content, but does not entirely * support inline shortcodes in other shortcodes. You will have to call the * shortcode parser in your function to account for that. * * {@internal * Please be aware that the above note was made during the beta of WordPress 2.6 * and in the future may not be accurate. Please update the note when it is no * longer the case.}} * * To apply shortcode tags to content: * * $out = do_shortcode( $content ); * * @link https://developer.wordpress.org/plugins/shortcodes/ * * @package WordPress * @subpackage Shortcodes * @since 2.5.0 */ /** * Container for storing shortcode tags and their hook to call for the shortcode * * @since 2.5.0 * * @name $shortcode_tags * @var array * @global array $shortcode_tags */ $shortcode_tags = array(); /** * Adds a new shortcode. * * Care should be taken through prefixing or other means to ensure that the * shortcode tag being added is unique and will not conflict with other, * already-added shortcode tags. In the event of a duplicated tag, the tag * loaded last will take precedence. * * @since 2.5.0 * * @global array $shortcode_tags * * @param string $tag Shortcode tag to be searched in post content. * @param callable $callback The callback function to run when the shortcode is found. * Every shortcode callback is passed three parameters by default, * including an array of attributes (`$atts`), the shortcode content * or null if not set (`$content`), and finally the shortcode tag * itself (`$shortcode_tag`), in that order. */ function add_shortcode( $tag, $callback ) { global $shortcode_tags; if ( '' === trim( $tag ) ) { _doing_it_wrong( __FUNCTION__, __( 'Invalid shortcode name: Empty name given.' ), '4.4.0' ); return; } if ( 0 !== preg_match( '@[<>&/\[\]\x00-\x20=]@', $tag ) ) { _doing_it_wrong( __FUNCTION__, sprintf( /* translators: 1: Shortcode name, 2: Space-separated list of reserved characters. */ __( 'Invalid shortcode name: %1$s. Do not use spaces or reserved characters: %2$s' ), $tag, '& / < > [ ] =' ), '4.4.0' ); return; } $shortcode_tags[ $tag ] = $callback; } /** * Removes hook for shortcode. * * @since 2.5.0 * * @global array $shortcode_tags * * @param string $tag Shortcode tag to remove hook for. */ function remove_shortcode( $tag ) { global $shortcode_tags; unset( $shortcode_tags[ $tag ] ); } /** * Clear all shortcodes. * * This function is simple, it clears all of the shortcode tags by replacing the * shortcodes global by a empty array. This is actually a very efficient method * for removing all shortcodes. * * @since 2.5.0 * * @global array $shortcode_tags */ function remove_all_shortcodes() { global $shortcode_tags; $shortcode_tags = array(); } /** * Whether a registered shortcode exists named $tag * * @since 3.6.0 * * @global array $shortcode_tags List of shortcode tags and their callback hooks. * * @param string $tag Shortcode tag to check. * @return bool Whether the given shortcode exists. */ function shortcode_exists( $tag ) { global $shortcode_tags; return array_key_exists( $tag, $shortcode_tags ); } /** * Whether the passed content contains the specified shortcode * * @since 3.6.0 * * @global array $shortcode_tags * * @param string $content Content to search for shortcodes. * @param string $tag Shortcode tag to check. * @return bool Whether the passed content contains the given shortcode. */ function has_shortcode( $content, $tag ) { if ( false === strpos( $content, '[' ) ) { return false; } if ( shortcode_exists( $tag ) ) { preg_match_all( '/' . get_shortcode_regex() . '/', $content, $matches, PREG_SET_ORDER ); if ( empty( $matches ) ) { return false; } foreach ( $matches as $shortcode ) { if ( $tag === $shortcode[2] ) { return true; } elseif ( ! empty( $shortcode[5] ) && has_shortcode( $shortcode[5], $tag ) ) { return true; } } } return false; } /** * Search content for shortcodes and filter shortcodes through their hooks. * * This function is an alias for do_shortcode(). * * @since 5.4.0 * * @see do_shortcode() * * @param string $content Content to search for shortcodes. * @param bool $ignore_html When true, shortcodes inside HTML elements will be skipped. * Default false. * @return string Content with shortcodes filtered out. */ function apply_shortcodes( $content, $ignore_html = false ) { return do_shortcode( $content, $ignore_html ); } /** * Search content for shortcodes and filter shortcodes through their hooks. * * 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. * * @since 2.5.0 * * @global array $shortcode_tags List of shortcode tags and their callback hooks. * * @param string $content Content to search for shortcodes. * @param bool $ignore_html When true, shortcodes inside HTML elements will be skipped. * Default false. * @return string Content with shortcodes filtered out. */ function do_shortcode( $content, $ignore_html = false ) { global $shortcode_tags; if ( false === strpos( $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; } $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 ); return $content; } /** * Retrieve the shortcode regular expression for searching. * * The regular expression combines the shortcode tags in the regular expression * in a regex class. * * The regular expression contains 6 different sub matches to help with parsing. * * 1 - An extra [ to allow for escaping shortcodes with double [[]] * 2 - The shortcode name * 3 - The shortcode argument list * 4 - The self closing / * 5 - The content of a shortcode when it wraps some content. * 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 Optional. List of shortcodes to find. Defaults to all registered shortcodes. * @return string The shortcode search regular expression */ function get_shortcode_regex( $tagnames = null ) { global $shortcode_tags; if ( empty( $tagnames ) ) { $tagnames = array_keys( $shortcode_tags ); } $tagregexp = implode( '|', array_map( 'preg_quote', $tagnames ) ); // WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcode_tag(). // Also, see shortcode_unautop() and shortcode.js. // phpcs:disable Squiz.Strings.ConcatenationSpacing.PaddingFound -- don't remove regex indentation return '\\[' // Opening bracket. . '(\\[?)' // 1: Optional second opening bracket for escaping shortcodes: [[tag]]. . "($tagregexp)" // 2: Shortcode name. . '(?![\\w-])' // Not followed by word character or hyphen. . '(' // 3: Unroll the loop: Inside the opening shortcode tag. . '[^\\]\\/]*' // Not a closing bracket or forward slash. . '(?:' . '\\/(?!\\])' // A forward slash not followed by a closing bracket. . '[^\\]\\/]*' // Not a closing bracket or forward slash. . ')*?' . ')' . '(?:' . '(\\/)' // 4: Self closing tag... . '\\]' // ...and closing bracket. . '|' . '\\]' // Closing bracket. . '(?:' . '(' // 5: Unroll the loop: Optionally, anything between the opening and closing shortcode tags. . '[^\\[]*+' // Not an opening bracket. . '(?:' . '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag. . '[^\\[]*+' // Not an opening bracket. . ')*+' . ')' . '\\[\\/\\2\\]' // Closing shortcode tag. . ')?' . ')' . '(\\]?)'; // 6: Optional second closing brocket for escaping shortcodes: [[tag]]. // phpcs:enable } /** * Regular Expression callable for do_shortcode() for calling shortcode hook. * * @see get_shortcode_regex() for details of the match array contents. * * @since 2.5.0 * @access private * * @global array $shortcode_tags * * @param array $m Regular expression match array. * @return string|false Shortcode output on success, false on failure. */ function do_shortcode_tag( $m ) { global $shortcode_tags; // Allow [[foo]] syntax for escaping a tag. if ( '[' === $m[1] && ']' === $m[6] ) { return substr( $m[0], 1, -1 ); } $tag = $m[2]; $attr = shortcode_parse_atts( $m[3] ); if ( ! is_callable( $shortcode_tags[ $tag ] ) ) { _doing_it_wrong( __FUNCTION__, /* translators: %s: Shortcode tag. */ sprintf( __( 'Attempting to parse a shortcode without a valid callback: %s' ), $tag ), '4.3.0' ); return $m[0]; } /** * Filters whether to call a shortcode callback. * * Returning a non-false value from filter will short-circuit the * shortcode generation process, returning that value instead. * * @since 4.7.0 * * @param false|string $return Short-circuit return value. Either false or the value to replace the shortcode with. * @param string $tag Shortcode name. * @param array|string $attr Shortcode attributes array or empty string. * @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|string $attr Shortcode attributes array or empty string. * @param array $m Regular expression match array. */ return apply_filters( 'do_shortcode_tag', $output, $tag, $attr, $m ); } /** * Search only inside HTML elements for shortcodes and process them. * * Any [ or ] characters remaining inside elements will be HTML encoded * to prevent interference with shortcodes that are outside the elements. * Assumes $content processed by KSES already. Users with unfiltered_html * capability may get unexpected output if angle braces are nested in tags. * * @since 4.2.3 * * @param string $content Content to search for shortcodes. * @param bool $ignore_html When true, all square braces inside elements will be encoded. * @param array $tagnames List of shortcodes to find. * @return string Content with shortcodes filtered out. */ function do_shortcodes_in_html_tags( $content, $ignore_html, $tagnames ) { // Normalize entities in unfiltered HTML before adding placeholders. $trans = array( '[' => '[', ']' => ']', ); $content = strtr( $content, $trans ); $trans = array( '[' => '[', ']' => ']', ); $pattern = get_shortcode_regex( $tagnames ); $textarr = wp_html_split( $content ); foreach ( $textarr as &$element ) { if ( '' === $element || '<' !== $element[0] ) { continue; } $noopen = false === strpos( $element, '[' ); $noclose = false === strpos( $element, ']' ); if ( $noopen || $noclose ) { // This element does not contain shortcodes. if ( $noopen xor $noclose ) { // Need to encode stray '[' or ']' chars. $element = strtr( $element, $trans ); } continue; } if ( $ignore_html || '<!--' === substr( $element, 0, 4 ) || '<![CDATA[' === substr( $element, 0, 9 ) ) { // Encode all '[' and ']' chars. $element = strtr( $element, $trans ); continue; } $attributes = wp_kses_attr_parse( $element ); if ( false === $attributes ) { // Some plugins are doing things like [name] <[email]>. if ( 1 === preg_match( '%^<\s*\[\[?[^\[\]]+\]%', $element ) ) { $element = preg_replace_callback( "/$pattern/", 'do_shortcode_tag', $element ); } // Looks like we found some crazy unfiltered HTML. Skipping it for sanity. $element = strtr( $element, $trans ); continue; } // Get element name. $front = array_shift( $attributes ); $back = array_pop( $attributes ); $matches = array(); preg_match( '%[a-zA-Z0-9]+%', $front, $matches ); $elname = $matches[0]; // Look for shortcodes in each attribute separately. foreach ( $attributes as &$attr ) { $open = strpos( $attr, '[' ); $close = strpos( $attr, ']' ); if ( false === $open || false === $close ) { continue; // Go to next attribute. Square braces will be escaped at end of loop. } $double = strpos( $attr, '"' ); $single = strpos( $attr, "'" ); if ( ( false === $single || $open < $single ) && ( false === $double || $open < $double ) ) { /* * $attr like '[shortcode]' or 'name = [shortcode]' implies unfiltered_html. * In this specific situation we assume KSES did not run because the input * was written by an administrator, so we should avoid changing the output * and we do not need to run KSES here. */ $attr = preg_replace_callback( "/$pattern/", 'do_shortcode_tag', $attr ); } else { // $attr like 'name = "[shortcode]"' or "name = '[shortcode]'". // We do not know if $content was unfiltered. Assume KSES ran before shortcodes. $count = 0; $new_attr = preg_replace_callback( "/$pattern/", 'do_shortcode_tag', $attr, -1, $count ); if ( $count > 0 ) { // Sanitize the shortcode output using KSES. $new_attr = wp_kses_one_attr( $new_attr, $elname ); if ( '' !== trim( $new_attr ) ) { // The shortcode is safe to use now. $attr = $new_attr; } } } } $element = $front . implode( '', $attributes ) . $back; // Now encode any remaining '[' or ']' chars. $element = strtr( $element, $trans ); } $content = implode( '', $textarr ); return $content; } /** * Remove placeholders added by do_shortcodes_in_html_tags(). * * @since 4.2.3 * * @param string $content Content to search for placeholders. * @return string Content with placeholders removed. */ function unescape_invalid_shortcodes( $content ) { // Clean up entire string, avoids re-parsing HTML. $trans = array( '[' => '[', ']' => ']', ); $content = strtr( $content, $trans ); return $content; } /** * Retrieve the shortcode attributes regex. * * @since 4.4.0 * * @return string The shortcode attribute regular expression */ function get_shortcode_atts_regex() { return '/([\w-]+)\s*=\s*"([^"]*)"(?:\s|$)|([\w-]+)\s*=\s*\'([^\']*)\'(?:\s|$)|([\w-]+)\s*=\s*([^\s\'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|\'([^\']*)\'(?:\s|$)|(\S+)(?:\s|$)/'; } /** * Retrieve all attributes from the shortcodes tag. * * The attributes list has the attribute name as the key and the value of the * attribute as the value in the key/value pair. This allows for easier * retrieval of the attributes, since all attributes have to be known. * * @since 2.5.0 * * @param string $text * @return array|string List of attribute values. * Returns empty array if '""' === trim( $text ). * Returns empty string if '' === trim( $text ). * All other matches are checked for not empty(). */ function shortcode_parse_atts( $text ) { $atts = array(); $pattern = get_shortcode_atts_regex(); $text = preg_replace( "/[\x{00a0}\x{200b}]+/u", ' ', $text ); if ( preg_match_all( $pattern, $text, $match, PREG_SET_ORDER ) ) { foreach ( $match as $m ) { if ( ! empty( $m[1] ) ) { $atts[ strtolower( $m[1] ) ] = stripcslashes( $m[2] ); } elseif ( ! empty( $m[3] ) ) { $atts[ strtolower( $m[3] ) ] = stripcslashes( $m[4] ); } elseif ( ! empty( $m[5] ) ) { $atts[ strtolower( $m[5] ) ] = stripcslashes( $m[6] ); } elseif ( isset( $m[7] ) && strlen( $m[7] ) ) { $atts[] = stripcslashes( $m[7] ); } elseif ( isset( $m[8] ) && strlen( $m[8] ) ) { $atts[] = stripcslashes( $m[8] ); } elseif ( isset( $m[9] ) ) { $atts[] = stripcslashes( $m[9] ); } } // Reject any unclosed HTML elements. foreach ( $atts as &$value ) { if ( false !== strpos( $value, '<' ) ) { if ( 1 !== preg_match( '/^[^<]*+(?:<[^>]*+>[^<]*+)*+$/', $value ) ) { $value = ''; } } } } else { $atts = ltrim( $text ); } return $atts; } /** * Combine user attributes with known attributes and fill in defaults when needed. * * The pairs should be considered to be all of the attributes which are * supported by the caller and given as a list. The returned attributes will * only contain the attributes in the $pairs list. * * If the $atts list has unsupported attributes, then they will be ignored and * removed from the final returned list. * * @since 2.5.0 * * @param array $pairs Entire list of supported attributes and their defaults. * @param array $atts User defined attributes in shortcode tag. * @param string $shortcode Optional. The name of the shortcode, provided for context to enable filtering * @return array Combined and filtered attribute list. */ function shortcode_atts( $pairs, $atts, $shortcode = '' ) { $atts = (array) $atts; $out = array(); foreach ( $pairs as $name => $default ) { if ( array_key_exists( $name, $atts ) ) { $out[ $name ] = $atts[ $name ]; } else { $out[ $name ] = $default; } } if ( $shortcode ) { /** * Filters shortcode 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. * * @since 3.6.0 * @since 4.4.0 Added the `$shortcode` parameter. * * @param array $out The output array of shortcode attributes. * @param array $pairs The supported attributes and their defaults. * @param array $atts The user defined shortcode attributes. * @param string $shortcode The shortcode name. */ $out = apply_filters( "shortcode_atts_{$shortcode}", $out, $pairs, $atts, $shortcode ); } return $out; } /** * Remove all shortcode tags from the given content. * * @since 2.5.0 * * @global array $shortcode_tags * * @param string $content Content to remove shortcode tags. * @return string Content without shortcode tags. */ function strip_shortcodes( $content ) { global $shortcode_tags; if ( false === strpos( $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 ); $tags_to_remove = array_keys( $shortcode_tags ); /** * Filters the list of shortcode tags to remove from the content. * * @since 4.7.0 * * @param array $tags_to_remove 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; } $content = do_shortcodes_in_html_tags( $content, true, $tagnames ); $pattern = get_shortcode_regex( $tagnames ); $content = preg_replace_callback( "/$pattern/", 'strip_shortcode_tag', $content ); // Always restore square braces so we don't break things like <!--[if IE ]>. $content = unescape_invalid_shortcodes( $content ); return $content; } /** * Strips a shortcode tag based on RegEx matches against post content. * * @since 3.3.0 * * @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. if ( '[' === $m[1] && ']' === $m[6] ) { return substr( $m[0], 1, -1 ); } return $m[1] . $m[6]; }