web-dev-qa-db-ja.com

ショートコードの入力値をフィルタ内で取得する方法

私は、フィルタによって使用される関数の内部でショートコードの入力値を取得しようとしていますが、成功していないようです。これが私がしたことです:

function my_shortcode_function($atts){
    $value = $atts['id'];
    function filter_value(){
        echo $value;
    }
    add_filter('posts_where','filter_value');
}
add_shortcode('my-shortcode','my_shortcode_function');

変数スコープのため、filter_value()内で$valueを使用しても機能しませんが、$GLOBALS['value']を使用しても機能しません。

私はfilter_value();の中で$value = $atts['id']を使用しようとさえしました、しかしまた成功しませんでした。

どのように私は[my-shortcode id='123']のような私のショートコードを使用して、フィルタに123値を渡すことができますか?

ありがとう。

9
Jack Johansson

グローバル変数を使用するとうまくいきます。これがデモンストレーションです。

function wpse_shortcode_function( $atts ){
    // User provided values are stored in $atts.
    // Default values are passed to shortcode_atts() below.
    // Merged values are stored in the $a array.
    $a = shortcode_atts( [
                'id'   => false,
    ], $atts );

    // Set global variable $value using value of shortcode's id attribute.
    $GLOBALS['value'] = $a['id'];

    // Add our filter and do a query.
    add_filter( 'posts_where', 'wpse_filter_value' );

    $my_query = new WP_Query( [
        'p' => $GLOBALS['value'],
    ] );

    if ( $my_query->have_posts() ) {
        while ( $my_query->have_posts() ) {
            $my_query->the_post();
            the_title( '<h1>', '</h1>');
        }
        wp_reset_postdata();
    }

    // Disable the filter.
    remove_filter( 'posts_where', 'wpse_filter_value' );
}
add_shortcode( 'my-shortcode', 'wpse_shortcode_function' );

function wpse_filter_value( $where ){
    // $GLOBALS['value'] is accessible here.

    // exit ( print_r( $GLOBALS['value'] ) );

    return $where;
}

注意: ある関数を別の関数の中で宣言することはお勧めできません

7
Dave Romsey

いくつかの回避策は次のとおりです。

アプローチ#1

ショートメソッドの定義とposts_whereフィルタのコールバックを class で囲むことで、クラスメソッド間で特定の値を渡すことができます。 private変数として。

アプローチ#2

もう1つの方法は、ショートコードのコールバック内で、値をWP_Queryへの入力として渡すことです。

$query = new WP_Query ( [ 'wpse_value' => 5, ... ] );

そして、あなたのposts_whereフィルタ内でそれにアクセスすることができます:

add_filter( 'posts_where', function( $where, \WP_Query $query )
{

    if( $value = $query->get( 'wpse_value' ) )
    {
        // can use $value here
    }

    return $where;

}, 10, 2 );

アプローチ#3

...または@the_dramatistによる example を調整して、後で無名関数を変数に代入してコールバックを削除できるようにすることもできます。

function my_shortcode_function( $atts, $content )
{
    // shortcode_atts stuff here

    $value = 5; // just an example  

    // Add a filter's callback
    add_filter( 'posts_where',  $callback = function( $where ) use ( $value ) {
        // $value accessible here
        return $where;
    } );

    // WP_Query stuff here and setup $out

    // Remove the filter's callback
    remove_filter( 'posts_where', $callback );

    return $out;
}

add_shortcode( 'my-shortcode', 'my_shortcode_function' );   

確認してください。 PHP docs useキーワードを使って、無名関数を変数に割り当てる方法について。

ps:匿名フィルタのコールバックを簡単に削除できるように、@ gmazzapによるこの変数割り当てのトリックについて最初に学んだと思います。

それが役に立てば幸い!

7
birgire

_ php _ useキーワードを使用できます。それで、このuseキーワードの助けを借りて、あなたは関数の中に変数を持って来ることができます。また、コードを減らすために無名関数を書くこともできます。それで、全部が

/**
 * How to get shorcode's input values inside a filter?
 *
 * @param $atts
 */
function my_shortcode_function($atts){
    $value = $atts['id'];
    add_filter('posts_where',function() use ( $value ){
        echo $value;
    });

}
add_shortcode('my-shortcode','my_shortcode_function');

それが役立つことを願っています。

4
CodeMascot

なぜ$値をパラメータとして渡さないのですか?

 function filter_value($value){
        echo $value;
    }

ドキュメンテーション

0
madalinivascu