it-swarm.com.de

Wie erhält man die Eingabewerte des Shortcodes in einem Filter?

Ich versuche, den Eingabewert eines Shortcodes innerhalb einer Funktion zu ermitteln, die von einem Filter verwendet wird, aber es scheint keinen Erfolg zu geben. Folgendes habe ich getan:

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

Jetzt weiß ich, dass die Verwendung von $value in filter_value() aufgrund variabler Bereiche nicht funktioniert, aber selbst die Verwendung von $GLOBALS['value'] funktioniert nicht.

Ich habe sogar versucht, $value = $atts['id'] innerhalb der filter_value(); zu verwenden, aber auch keinen Erfolg.

Wie kann ich meinen Shortcode wie [my-shortcode id='123'] verwenden und den 123-Wert an den Filter übergeben?

Vielen Dank.

9
Jack Johansson

Die Verwendung einer globalen Variablen funktioniert. Hier ist eine Demonstration:

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

Randnotiz, Deklarieren einer Funktion innerhalb einer anderen Funktion ist keine gute Praxis .

7
Dave Romsey

Hier sind einige Problemumgehungen:

Ansatz 1

Sie können die Definition des Shortcodes und den Rückruf des posts_where-Filters in ein class einschließen, um einen bestimmten Wert zwischen den Klassenmethoden, z. als privat Variable.

Ansatz 2

Ein anderer Ansatz wäre, den Wert als Eingabe an WP_Query innerhalb des Rückrufs Ihres Shortcodes zu übergeben:

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

und dann können Sie in Ihrem posts_where-Filter darauf zugreifen:

add_filter( 'posts_where', function( $where, \WP_Query $query )
{

    if( $value = $query->get( 'wpse_value' ) )
    {
        // can use $value here
    }

    return $where;

}, 10, 2 );

Ansatz 3

... oder Sie können auch das Beispiel von @the_dramatist anpassen, um den Rückruf anschließend zu entfernen, indem Sie die anonyme Funktion einer Variablen zuweisen:

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

Überprüfen Sie z. In den PHP Dokumenten erfahren Sie, wie Sie einer Variablen eine anonyme Funktion mit dem Schlüsselwort use zuweisen.

ps: Ich glaube, ich habe zum ersten Mal von @gmazzap von diesem Variablenzuweisungstrick erfahren, um den Rückruf eines anonymen Filters einfacher entfernen zu können.

Ich hoffe es hilft!

7
birgire

Sie können das Schlüsselwort use vonPHPverwenden. Mit Hilfe dieses use-Schlüsselworts können Sie also eine Variable in eine Funktion einfügen. Und Sie können auch anonyme Funktionen schreiben, um den Code zu reduzieren. Das Ganze wird also

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

Hoffentlich hilft das.

4
CodeMascot

Warum nicht den Wert $ als Parameter übergeben?

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

Dokumentation

0
madalinivascu