J'essaie d'obtenir la valeur d'entrée d'un shortcode dans une fonction utilisée par un filtre, mais il semble n'y avoir aucun succès. Voici ce que j'ai fait:
function my_shortcode_function($atts){
$value = $atts['id'];
function filter_value(){
echo $value;
}
add_filter('posts_where','filter_value');
}
add_shortcode('my-shortcode','my_shortcode_function');
Maintenant, je sais que l'utilisation de $value
dans filter_value()
ne fonctionnera pas à cause des portées variables, mais même si $GLOBALS['value']
ne fonctionne pas.
J'ai même essayé d'utiliser $value = $atts['id']
dans la filter_value();
mais sans succès non plus.
Comment puis-je utiliser mon shortcode comme [my-shortcode id='123']
et transmettre la valeur 123 au filtre?
Merci.
L'utilisation d'une variable globale fonctionnera. Voici une démonstration:
function wpse_shortcode_function( $atts ){
// User provided values are stored in $atts.
// Default values are passed to shortcode_atts() below.
// Merged values are stored in the $a array.
$a = shortcode_atts( [
'id' => false,
], $atts );
// Set global variable $value using value of shortcode's id attribute.
$GLOBALS['value'] = $a['id'];
// Add our filter and do a query.
add_filter( 'posts_where', 'wpse_filter_value' );
$my_query = new WP_Query( [
'p' => $GLOBALS['value'],
] );
if ( $my_query->have_posts() ) {
while ( $my_query->have_posts() ) {
$my_query->the_post();
the_title( '<h1>', '</h1>');
}
wp_reset_postdata();
}
// Disable the filter.
remove_filter( 'posts_where', 'wpse_filter_value' );
}
add_shortcode( 'my-shortcode', 'wpse_shortcode_function' );
function wpse_filter_value( $where ){
// $GLOBALS['value'] is accessible here.
// exit ( print_r( $GLOBALS['value'] ) );
return $where;
}
Note secondaire, déclarer une fonction dans une autre fonction n'est pas une bonne pratique .
Voici quelques solutions de contournement:
Approche n ° 1
Vous pouvez envelopper la définition du shortcode et le rappel du filtre posts_where
dans un class pour pouvoir faire circuler une valeur donnée entre les méthodes de classe, par exemple. comme une variable privée.
Approche n ° 2
Une autre approche consiste à transmettre la valeur en tant qu’entrée à WP_Query
dans le rappel de votre code court:
$query = new WP_Query ( [ 'wpse_value' => 5, ... ] );
et ensuite dans votre filtre posts_where, vous pouvez y accéder:
add_filter( 'posts_where', function( $where, \WP_Query $query )
{
if( $value = $query->get( 'wpse_value' ) )
{
// can use $value here
}
return $where;
}, 10, 2 );
Approche n ° 3
... ou vous pouvez également ajuster l'exemple exemple de @the_dramatist pour pouvoir supprimer le rappel ultérieurement en affectant la fonction anonyme à une variable:
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' );
Vérifiez par exemple le PHP docs sur la manière d’affecter une fonction anonyme, avec le mot-clé use, à une variable.
ps: Je pense que j'ai d'abord appris l'existence de cette astuce d'assignation de variable par @gmazzap, afin de faciliter la suppression du rappel d'un filtre anonyme.
J'espère que ça aide!
Vous pouvez utiliser le mot clé use
dePHP. Donc, avec l'aide de ce mot clé use
, vous pouvez importer une variable dans une fonction. Et aussi, vous pouvez écrire une fonction anonyme pour réduire le code. Donc tout ça va-
/**
* How to get shorcode's input values inside a filter?
*
* @param $atts
*/
function my_shortcode_function($atts){
$value = $atts['id'];
add_filter('posts_where',function() use ( $value ){
echo $value;
});
}
add_shortcode('my-shortcode','my_shortcode_function');
J'espère que cela pourra aider.
Pourquoi ne pas passer la valeur $ en tant que param?
function filter_value($value){
echo $value;
}