web-dev-qa-db-fra.com

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

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.

9
Jack Johansson

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 .

7
Dave Romsey

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!

7
birgire

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.

4
CodeMascot

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

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

Documentation

0
madalinivascu