web-dev-qa-db-ja.com

特定のショートコード出力をフィルタしますか?

WordPressに特定のショートコードの出力をフィルタリングするために使用できるフックはありますか?このようなもの:

add_filter('shortcode_output', 'my_filter_function', 2);

function my_filter_function ( $output, $shortcode ) {
    ....
}

$shortcode[my_schortcode]のようなものであるか、さらに良いことに、shortcodeとその属性は配列に分けられます。

7
ragulka

フィルタはありません 私が知っていることは、あなたが望むような個々のショートコードをターゲットにすることを意味しています。

shortcode_atts_{$shortcode} で属性をフィルタリングできます。

あなた自身のコールバックを作成し、それをオリジナルのショートコードスラッグに登録することで、他のショートコードをハイジャックすることができます。私はそれがあなたがおそらくする必要があるだろうことであると思います。

コンセプトの証明:

function my_gallery_shortcode($atts) {
  return 'howdy';
}
add_shortcode('gallery','my_gallery_shortcode');

それではギャラリーを使ってみましょう:)

5
s_ha_dum

WordPress 4.7では、これを正確に行うために新しいフィルタ do_shortcode_tag が導入されました。

10
Shawn H

フックはありませんが、あなたの最終目標を可能にする小さな回避策があります。インスタンスごとに、出力をフィルタリングしたい他のショートコードを常にラップアラウンドする新しいショートコードを作成できます。

記事の使い方など

Here is some post text. Blah blah...
[filter][target_annoying_shortcode size="small" limit="20"][/filter] 
Here is some more text in my post. More blah blah...

Functions.phpで:

function my_shortcode_output_filter( $attr, $content ) {

    // Express the shortcode into its output
    $content_translated = do_shortcode(trim($content));
    if($shortcode_to_modify == $content || !$content_translated) {
        // Error handling
        return 'There was an error in filtering shortcode: '.$content;  
    }

    // Now modify the output as you like, here...

    $content_translated_and_filtered = $content_translated;

    return $content_translated_and_filtered;
 }
 add_shortcode('filter', 'my_shortcode_output_filter');
1
Adam Friedman

フィルタリングできる唯一のものは、ショートコードの属性です。

apply_filters( "shortcode_atts_{$shortcode}", $out, $pairs, $atts );

要は、ショートコードを登録するときは$shortcode third 引数になるということです。この引数はまったく新しいもので、ショートコードではほとんど使われていません。したがって、デフォルトのフォールバック(デフォルトは''string)に戻ります。

これは面白い結果につながります。

add_filter( 'shortcode_atts_', 'wpse112294_shortcode_atts_cb' );
function wpse112294_shortcode_atts_cb( $out, $pairs, $atts )
{
    // here we need to find a way to uniquely identify a shortcode
    // for which we ain't got a name

    // something that makes the shortcode unique:
    $found = isset( $pairs['foo_attribute_key'] );
    if ( $found )
    {
        // Instantly remove this filter to save processing time:
        remove_filter( current_filter(), __FUNCTION__ );

        // do something stunning in here!
    }

    return $out;
}

したがって、 yes 、90%の確率で、すべての(!)ショートコードの出力をフィルタリングし、何らかのデフォルト引数($pairs)または入力引数で何らかの方法でショートコードを識別する必要があります(不可能)。その後、 最後に 出力を処理することができます。文字列自体を処理できますか?いいえ。これは@s_ha_dumが上に示した方法で実行する必要があります。

0
kaiser

@s_ha_dumが適切な答えを出している間、あなたは既存のショートコードをフィルタリングする目的で新しいショートコードを作成することができます。例えば、

function filter_function($atts, $content) {
    extract(shortcode_atts(array(
            'att1' => 'val1',
            'att2' => 'val2'
    ), $atts));

    //save shortcode output in $return
    $return = do_shortcode("[existing_shortcode att1='$att1' att2='$att2'".$content."/existing_shortcode]");

    //insert code to modify $return

    echo $return;
}
add_shortcode('new_shortcode','filter_function');

[embed]ショートコードのために、あなたが使用しなければならないことに注意してください

global $wp_embed;
$return = $wp_embed->run_shortcode("[embed ...

do_shortcodeの代わりに

0
yitwail