Por padrão, isso não é possível. Existem soluções alternativas se você fizer da maneira OOP.
Você pode criar uma classe para armazenar os valores que deseja usar posteriormente.
Exemplo:
/**
* 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 )
)
);
}
}
Agora você pode chamar a classe com qualquer função que desejar - se a função existir em algum lugar, ela será chamada com seus parâmetros armazenados.
Vamos criar uma função de demonstração ...
/**
* 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>';
}
... e use uma vez ...
add_filter(
'the_content',
array (
new WPSE_Filter_Storage( array ( 1, 3, 5 ) ),
'wpse_45901_add_numbers'
)
);
… e de novo …
add_filter(
'the_content',
array (
new WPSE_Filter_Storage( array ( 2, 4, 6 ) ),
'wpse_45901_add_numbers'
)
);
Resultado:
A chave é a reutilização : você pode reutilizar a classe (e em nossos exemplos também a função).
PHP 5.3 ou superior
Se você pode usar um PHP versão 5.3 ou fechamentos mais recentes, será muito mais fácil:
$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>";
}
A desvantagem é que você não pode escrever testes de unidade para fechamentos.
$func = function() use ( $param1 ) { $param1; };
eadd_action( $func, 11);
), então você pode removê-lo viaremove_action( $func, 11 );
Crie uma função com os argumentos necessários que retornam uma função. Passe esta função (função anônima, também conhecida como fechamento) para o gancho wp.
Mostrado aqui para um aviso de administrador no back-end do wordpress.
fonte
Use funções php Anonymous :
fonte
Sei que o tempo passou, mas tive algum problema ao passar meu próprio parâmetro até descobrir que o quarto parâmetro no add_filter é o número de parâmetros passados, incluindo o conteúdo a ser alterado. Portanto, se você passar 1 parâmetro adicional, o número deve ser 2 e não 1 no seu caso
e usando
fonte
A maneira correta, realmente curta e mais eficiente de passar qualquer número de argumentos para os filtros e ações do WP é de @Wesam Alalem aqui , que usa o fechamento.
Gostaria apenas de acrescentar que você poderia torná-lo ainda mais claro e muito mais flexível, separando o método real do realizador do fechamento anônimo. Para isso, basta chamar o método a partir do fechamento da seguinte forma (exemplo modificado da resposta @Wesam Alalem).
Dessa forma, você pode escrever a lógica longa ou complicada que desejar lexicamente fora do fechamento que usa para chamar o agente real.
fonte
se você criar seu próprio gancho, aqui está um exemplo.
então implemente o gancho:
fonte
3
?Você sempre pode usar global, não é?
fonte
Apesar de chamar uma função diretamente, faça isso de uma maneira mais elegante: passe uma função anônima como retorno de chamada.
Por exemplo:
Eu tenho uma única função para traduzir o título, o conteúdo e o trecho das minhas postagens. Então, eu preciso passar para esta função principal alguns argumentos dizendo quem está chamando.
Portanto, a função principal
translate_text
recebe tantos parâmetros quanto eu quero, apenas porque eu passei uma função anônima como um retorno de chamada.fonte
Eu esperava fazer o mesmo, mas como não é possível, acho que uma solução alternativa simples é chamar uma função diferente, como
add_filter('the_content', 'my_content_filter', 10, 1);
então my_content_filter () pode chamar my_content () passando o argumento que quiser.
fonte