私は、フィルタによって使用される関数の内部でショートコードの入力値を取得しようとしていますが、成功していないようです。これが私がしたことです:
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値を渡すことができますか?
ありがとう。
グローバル変数を使用するとうまくいきます。これがデモンストレーションです。
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;
}
いくつかの回避策は次のとおりです。
アプローチ#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によるこの変数割り当てのトリックについて最初に学んだと思います。
それが役に立てば幸い!
_ 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');
それが役立つことを願っています。