डिफ़ॉल्ट रूप से यह संभव नहीं है। यदि आप इसे 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'
)
);
आउटपुट:
कुंजी पुन : प्रयोज्य है : आप कक्षा का पुन: उपयोग कर सकते हैं (और हमारे उदाहरणों में भी फ़ंक्शन)।
PHP 5.3+
यदि आप एक PHP संस्करण 5.3 या नए क्लोजर का उपयोग कर सकते हैं तो इससे बहुत आसानी होगी:
$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>";
}
नकारात्मक पक्ष यह है कि आप क्लोजर के लिए यूनिट टेस्ट नहीं लिख सकते हैं।