Ecco alcune soluzioni alternative:
Approccio n. 1
È possibile racchiudere la definizione dello shortcode e il posts_where
callback del filtro in una classe per poter passare un determinato valore tra i metodi della classe, ad esempio come una variabile privata .
Approccio n. 2
Un altro approccio sarebbe passare il valore come input WP_Query
all'interno del callback del tuo shortcode:
$query = new WP_Query ( [ 'wpse_value' => 5, ... ] );
e poi nel tuo filtro posts_where puoi accedervi:
add_filter( 'posts_where', function( $where, \WP_Query $query )
{
if( $value = $query->get( 'wpse_value' ) )
{
// can use $value here
}
return $where;
}, 10, 2 );
Approccio n. 3
... oppure potresti anche regolare l' esempio di @the_dramatist per poter successivamente rimuovere il callback assegnando la funzione anonima a una variabile:
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' );
Controlla ad esempio i documenti PHP su come assegnare una funzione anonima, con la parola chiave use, a una variabile.
ps: Penso di aver appreso per la prima volta questo trucco di assegnazione di variabili da @gmazzap, per facilitare la rimozione del callback di un filtro anonimo.
Spero che sia d'aiuto!
$GLOBALS['value'] = some value
e poi lo chiamo$GLOBALS['value']
funziona, ma se imposto direttamente il valore come$value = some value
e poi lo chiamo usando$GLOBALS['value']
non funziona, mentre dovrebbe funzionare secondo il manuale di PHP.