web-dev-qa-db-ja.com

テキストウィジェットで処理するための特定のショートコードのみをホワイトリストに登録するにはどうすればよいですか。

私は、テキストウィジェットでショートコードの処理を可能にするために以下のフィルタを使用できることを知っています:

add_filter( 'widget_text', 'shortcode_unautop');
add_filter( 'widget_text', 'do_shortcode');

いくつかの特定のショートコードのみを処理用にホワイトリストに登録し、すべてのショートコードを処理するだけではどうしたらよいですか

3
MadtownLems
add_filter( 'widget_text', 'wpse_137725_shortcode_whitelist' );

/**
 * Apply only whitelisted shortcode to content.
 * 
 * @link http://wordpress.stackexchange.com/q/137725/1685
 * 
 * @param   string  $text
 * @return  string
 */ 
function wpse_137725_shortcode_whitelist( $text ) {
    static $whitelist = array(
        'gallery',
        'form',
    );

    global $shortcode_tags;

    // Store original copy of registered tags.
    $_shortcode_tags = $shortcode_tags;

    // Remove any tags not in whitelist.
    foreach ( $shortcode_tags as $tag => $function ) {
        if ( ! in_array( $tag, $whitelist ) )
            unset( $shortcode_tags[ $tag ] );
    }

    // Apply shortcode.
    $text = shortcode_unautop( $text );
    $text = do_shortcode( $text );

    // Restore tags.
    $shortcode_tags = $_shortcode_tags;

    return $text;
}
3
TheDeadMedic

または少し簡単です。

function do_shortcode_only_for($content, $tagnames) {
  $pattern = get_shortcode_regex($tagnames);
  $content = preg_replace_callback("/$pattern/", 'do_shortcode_tag', $content);
  return $content;
}

元の do_shortcode関数 から引用しました。

1
pravdomil