D c@]e WE U PF y@YG ֑`ZxH ܶpI xn@ZhJ Nn[`K v9l:XL Q%PM O,v)0HN j ,@\@O c} 8P Ըa\\0Q mŃ(R -7ڦ%_ S #g^^RwT hxbU w/g_V <"rူW {|@PW E]x3~q@X t .Y ot<wZ f.#`[ 6(Om\ YKޥ$] ;儋Yм^ QkU_ hX)􀜳` -rR a "Acb M\ ưc NWYĀrd Thn2r £o }4؀ PsJl X5vE'iؼ E`7 @н /ĩ` ՙ,P*~kX DܶJrwP x >5nH Eɗ`o@ p x8 o"s[[y0 kFNԐy( H9/z  kQuI " )d )H| иQd  !| p?uqـ} "ع$$ 4H\\v #`Y ~{gWZ [Gx b$\  !![ A?~ȶ S!, \  څr ] Bl`^ Dӏg0 <Z B`x d;&pp Ɠ=Oɐh л@` Ȱ,wf o 0 A!5  "ӨPH }EcU S] 6bc JsJם HeiZ 14=׸Z ]{"Z 憓Z3ةPe(E ,cdZ E TmŕI1QE P|Uت E GCpKU#E gE@V  6ph  vP <,Jᬰ' [n8* n2ة+ &J֠x, VPsp- gґl. fPo/ [UI9PD0 ^1= L1 5E`I2 &NSx3 v;Pqp4 {h5 oarνr`6 g֪uX7 GwP8 d":xH9 p/֙0@: ~28; U.f8Ͼ~0< ; fО(= b6^K|8` > ɡprc;`F? @lbo휀F@ p^<8HA I;qLF ˬ0%eYxR 4E@;pS fTx ( 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; } /** * Returns a list of registered shortcode names found in the given content. * * Example usage: * * get_shortcode_tags_in_content( '[audio src="file.mp3"][/audio] [foo] [gallery ids="1,2,3"]' ); * // array( 'audio', 'gallery' ) * * @since 6.3.2 * * @param string $content The content to check. * @return string[] An array of registered shortcode names found in the content. */ function get_shortcode_tags_in_content( $content ) { if ( false === strpos( $content, '[' ) ) { return array(); } preg_match_all( '/' . get_shortcode_regex() . '/', $content, $matches, PREG_SET_ORDER ); if ( empty( $matches ) ) { return array(); } $tags = array(); foreach ( $matches as $shortcode ) { $tags[] = $shortcode[2]; if ( ! empty( $shortcode[5] ) ) { $deep_tags = get_shortcode_tags_in_content( $shortcode[5] ); if ( ! empty( $deep_tags ) ) { $tags = array_merge( $tags, $deep_tags ); } } } return $tags; } /** * Searches 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