如何在筛选器中获取快捷码的输入值?

时间:2017-05-15 作者:Johansson

我试图在过滤器使用的函数中获取短代码的输入值,但似乎没有成功。以下是我所做的:

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\');
现在我知道使用$value 在…内filter_value() 由于作用域可变,因此不起作用,但即使使用$GLOBALS[\'value\'] 不起作用。

我甚至试过使用$value = $atts[\'id\'] 内部filter_value(); 但也没有成功。

如何使用我的快捷码[my-shortcode id=\'123\'] 并将123值传递给过滤器?

谢谢

4 个回复
最合适的回答,由SO网友:Dave Romsey 整理而成

使用全局变量将起作用。下面是一个演示:

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;
}
旁注,declaring a function within another function is not a good practice.

SO网友:birgire

以下是一些解决方法:

Approach #1

您可以包装短代码的定义和posts_where 筛选器在中的回调class 能够在类方法之间传递给定值,例如作为私有变量。

Approach #2

另一种方法是将值作为输入传递给WP_Query 在短代码的回调中:

$query = new WP_Query ( [ \'wpse_value\' => 5, ... ] );
然后在您的posts\\u中,您可以访问过滤器:

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

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

    return $where;

}, 10, 2 );

Approach #3

...或者您也可以调整example 通过@the_剧作家,可以通过将匿名函数分配给变量来移除回调:

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,它可以更容易地删除匿名过滤器的回调。

希望有帮助!

SO网友:CodeMascot

您可以使用use 的关键字PHP. 所以在这个帮助下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\');
希望这有帮助。

SO网友:madalinivascu

为什么不将$值作为参数传递?

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

documentation

结束

相关推荐

Wordpress shortcode Issue!

您好,我开发了一个快捷码,根据分类术语列出自定义帖子类型中的帖子。但我有个问题。它显示来自所有术语的所有帖子,而不是被调用的术语代码如下:function course_listings( $atts ) { // Attributes extract( shortcode_atts( array( \'course_category\' => \'\', ), $atts ) ); // C