Aqui estão algumas soluções alternativas:
Abordagem # 1
Você pode agrupar a definição do código de acesso e o posts_where
retorno de chamada do filtro em uma classe para poder transmitir um determinado valor entre os métodos da classe, por exemplo, como uma variável privada .
Abordagem # 2
Outra abordagem seria passar o valor como uma entrada para WP_Query
o retorno de chamada do seu código curto:
$query = new WP_Query ( [ 'wpse_value' => 5, ... ] );
e, no filtro posts_where, você pode acessá-lo:
add_filter( 'posts_where', function( $where, \WP_Query $query )
{
if( $value = $query->get( 'wpse_value' ) )
{
// can use $value here
}
return $where;
}, 10, 2 );
Abordagem # 3
... ou você também pode ajustar o exemplo por @the_dramatist para poder remover o retorno de chamada posteriormente, atribuindo a função anônima a uma variável:
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' );
Verifique, por exemplo, a documentação do PHP sobre como atribuir uma função anônima, com a palavra-chave use, a uma variável.
ps: Acho que aprendi sobre esse truque de atribuição de variáveis pelo @gmazzap, para facilitar a remoção de retorno de chamada de um filtro anônimo.
Espero que ajude!
$GLOBALS['value'] = some value
e depois chamá-$GLOBALS['value']
lo, ele funciona, mas se eu definir o valor diretamente como$value = some value
e depois chamá-lo usando,$GLOBALS['value']
ele não funcionará, embora deva funcionar de acordo com o manual do PHP.