Comment obtenir les valeurs d'entrée de shortcode dans un filtre?

10

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 l'utilisation de $GLOBALS['value'] ne fonctionne pas.

J'ai même essayé d'utiliser $value = $atts['id'] dans 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.

    
posée Jack Johansson 15.05.2017 - 03:39

4 réponses

7

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;
}

Remarque secondaire, la la déclaration d'une fonction dans une autre fonction n'est pas bonne pratique .

    
réponse donnée Dave Romsey 15.05.2017 - 05:48
7

Voici quelques solutions de contournement:

Approche n ° 1

Vous pouvez envelopper la définition du shortcode et le rappel du filtre posts_where dans une classe pour pouvoir faire circuler une valeur donnée entre les méthodes de classe, par exemple. sous forme de 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 shortcode:

$query = new WP_Query ( [ 'wpse_value' => 5, ... ] );

puis 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 le exemple de @the_dramatist pour pouvoir supprimer le rappel ultérieurement en assignant 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 documentation PHP sur la manière d'attribuer 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!

    
réponse donnée birgire 15.05.2017 - 11:24
4

Vous pouvez utiliser le mot clé use de PHP . 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 sera -

/**
 * 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');

L’espoir que cela aide.

    
réponse donnée CodeMascot 15.05.2017 - 05:33
0

Pourquoi ne pas passer la valeur $ en tant que paramètre?

 function filter_value($value){
        echo $value;
    }

documentation

    
réponse donnée madalinivascu 15.05.2017 - 07:49

Lire d'autres questions sur les étiquettes