当前位置: 首页>>网站问题>>正文


将参数传递给过滤器和动作功能

webfans 网站问题 , , , , 去评论

问题描述

是一种将我自己的参数传递给add_filteradd_action中的函数的方法。例如,看看下面的代码:

function my_content($content, $my_param)
{
do something...
using $my_param here ...
return $content;
}
add_filter('the_content', 'my_content', 10, 1);

我可以传递自己的参数吗?就像是:

add_filter('the_content', 'my_content($my_param)', 10, 1)

要么

add_filter('the_content', 'my_content', 10, 1, $my_param)

最佳解决方法

默认情况下,这是不可能的。如果您以OOP方式执行此操作,则有一些解决方法。您可以创建一个类来存储以后要使用的值。

例:

/**
 * Stores a value and calls any existing function with this value.
 */
class WPSE_Filter_Storage
{
    /**
     * Filled by __construct(). Used by __call().
     *
     * @type mixed Any type you need.
     */
    private $values;

    /**
     * Stores the values for later use.
     *
     * @param  mixed $values
     */
    public function __construct( $values )
    {
        $this->values = $values;
    }

    /**
     * Catches all function calls except __construct().
     *
     * Be aware: Even if the function is called with just one string as an
     * argument it will be sent as an array.
     *
     * @param  string $callback Function name
     * @param  array  $arguments
     * @return mixed
     * @throws InvalidArgumentException
     */
    public function __call( $callback, $arguments )
    {
        if ( is_callable( $callback ) )
            return call_user_func( $callback, $arguments, $this->values );

        // Wrong function called.
        throw new InvalidArgumentException(
            sprintf( 'File: %1$s<br>Line %2$d<br>Not callable: %3$s',
                __FILE__, __LINE__, print_r( $callback, TRUE )
            )
        );
    }
}

现在,您可以使用您想要的任何函数调用该类 – 如果函数存在于某处,则将使用您存储的参数调用它。

让我们创建一个演示函数……

/**
 * Filter function.
 * @param  array $content
 * @param  array $numbers
 * @return string
 */
function wpse_45901_add_numbers( $args, $numbers )
{
    $content = $args[0];
    return $content . '<p>' . implode( ', ', $numbers ) . '</p>';
}

……并使用一次……

add_filter(
    'the_content',
    array (
        new WPSE_Filter_Storage( array ( 1, 3, 5 ) ),
        'wpse_45901_add_numbers'
    )
);

… 然后再次 …

add_filter(
    'the_content',
    array (
        new WPSE_Filter_Storage( array ( 2, 4, 6 ) ),
        'wpse_45901_add_numbers'
    )
);

输出:

enter image description here

关键是可重用性:您可以重用该类(在我们的示例中也可以重用该函数)。

PHP 5.3+

如果您可以使用PHP版本5.3或更新版本的closures将更容易:

$param1 = '<p>This works!</p>';
$param2 = 'This works too!';

add_action( 'wp_footer', function() use ( $param1 ) {
        echo $param1;
    }, 11 
);
add_filter( 'the_content', function( $content ) use ( $param2 ) {
        return t5_param_test( $content, $param2 );
    }, 12
);

/**
 * Add a string to post content
 *
 * @param  string $content
 * @param  string $string This is $param2 in our example.
 * @return string
 */
function t5_param_test( $content, $string )
{
    return "$content <p><b>$string</b></p>";
}

缺点是您无法为闭包编写单元测试。

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/3026.html,转载请务必附带本地址声明。