Secara default ini tidak mungkin. Ada beberapa solusi jika Anda melakukannya dengan cara OOP.
Anda bisa membuat kelas untuk menyimpan nilai yang ingin Anda gunakan nanti.
Contoh:
/**
* 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 )
)
);
}
}
Sekarang Anda dapat memanggil kelas dengan fungsi apa pun yang Anda inginkan - jika fungsi itu ada di suatu tempat, ia akan dipanggil dengan parameter tersimpan Anda.
Mari kita buat fungsi demo ...
/**
* 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>';
}
... dan gunakan sekali ...
add_filter(
'the_content',
array (
new WPSE_Filter_Storage( array ( 1, 3, 5 ) ),
'wpse_45901_add_numbers'
)
);
… dan lagi …
add_filter(
'the_content',
array (
new WPSE_Filter_Storage( array ( 2, 4, 6 ) ),
'wpse_45901_add_numbers'
)
);
Keluaran:
Kuncinya adalah usabilitas : Anda dapat menggunakan kembali kelas (dan dalam contoh kami juga fungsinya).
PHP 5.3+
Jika Anda dapat menggunakan PHP versi 5.3 atau penutupan yang lebih baru akan membuat itu lebih mudah:
$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>";
}
Kelemahannya adalah Anda tidak bisa menulis unit test untuk penutupan.
$func = function() use ( $param1 ) { $param1; };
danadd_action( $func, 11);
) maka Anda dapat menghapusnya melaluiremove_action( $func, 11 );
Buat fungsi dengan argumen yang diperlukan yang mengembalikan fungsi. Lewati fungsi ini (fungsi anonim, juga dikenal sebagai penutupan) ke kait wp.
Ditampilkan di sini untuk pemberitahuan admin di wordpress backend.
sumber
Gunakan fungsi Anonim php :
sumber
Saya tahu waktu telah berlalu, tapi saya punya masalah dengan melewati parameter saya sendiri sampai saya menemukan bahwa parameter ke-4 di add_filter adalah jumlah parameter yang dilewati termasuk konten untuk diubah. Jadi, jika Anda melewati 1 parameter tambahan, angka harus 2 dan bukan 1 dalam kasus Anda
dan menggunakan
sumber
Cara yang benar, benar-benar singkat dan paling efisien untuk menyampaikan jumlah argumen apa pun ke filter dan tindakan WP dari @Wesam Alalem di sini , yang menggunakan penutupan.
Saya hanya akan menambahkan bahwa Anda bisa membuatnya lebih jelas dan lebih fleksibel dengan memisahkan metode pelaku sebenarnya dari penutupan anonim. Untuk ini, Anda cukup memanggil metode dari penutupan sebagai berikut (contoh dimodifikasi dari jawaban @Wesam Alalem).
Dengan cara ini Anda dapat menulis logika panjang atau rumit seperti yang Anda inginkan secara leksikal di luar penutupan yang Anda gunakan untuk memanggil pelaku sebenarnya.
sumber
jika Anda membuat kait Anda sendiri, berikut adalah contohnya.
lalu terapkan kait:
sumber
3
?Anda selalu dapat menggunakan global bukan?
sumber
Meskipun memanggil fungsi secara langsung, lakukan ini dengan cara yang lebih elegan: operasikan fungsi anonim sebagai panggilan balik.
Sebagai contoh:
Saya memiliki fungsi tunggal untuk menerjemahkan judul, konten, dan kutipan dari posting saya. Jadi, saya perlu beralih ke fungsi utama ini beberapa argumen yang mengatakan siapa yang memanggil.
Jadi, fungsi utama
translate_text
menerima parameter sebanyak yang saya inginkan, hanya karena saya telah melewati fungsi anonim sebagai panggilan balik.sumber
Saya berharap untuk melakukan hal yang sama tetapi karena itu tidak mungkin saya kira solusi sederhana adalah memanggil fungsi yang berbeda
add_filter('the_content', 'my_content_filter', 10, 1);
maka my_content_filter () dapat memanggil my_content () lewat argumen yang diinginkan.
sumber