¿Cómo obtener los valores de entrada de shortcode dentro de un filtro?

10

Estoy intentando obtener el valor de entrada de un shortcode dentro de una función que usa un filtro, pero parece que no hay éxito. Esto es lo que hice:

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

Ahora sé que usar $value dentro de filter_value() no funcionará debido a los ámbitos variables, pero incluso usar $GLOBALS['value'] no funciona.

Incluso intenté usar $value = $atts['id'] dentro de filter_value(); pero tampoco tuve éxito.

¿Cómo puedo usar mi código abreviado como [my-shortcode id='123'] y pasar el valor 123 al filtro?

Gracias.

    
pregunta Jack Johansson 15.05.2017 - 03:39

4 respuestas

7

El uso de una variable global funcionará. Aquí hay una demostración:

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

Nota al margen, declarar una función dentro de otra función no es bueno práctica .

    
respondido por el Dave Romsey 15.05.2017 - 05:48
7

Aquí hay algunas soluciones:

Enfoque # 1

Puede ajustar la definición del código abreviado y la devolución de llamada del filtro posts_where en una clase para poder pasar un valor determinado entre los métodos de la clase, por ejemplo. como una variable privada .

Enfoque # 2

Otro enfoque sería pasar el valor como una entrada a WP_Query dentro de la devolución de llamada de tu shortcode:

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

y luego dentro de tu filtro de posts_where puedes acceder a él:

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

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

    return $where;

}, 10, 2 );

Enfoque # 3

... o también puede ajustar el ejemplo por @the_dramatist para poder eliminar la devolución de llamada posteriormente asignando la función anónima a una 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' );   

Compruebe, por ejemplo, los documentos PHP sobre cómo asignar una función anónima, con la palabra clave use, a una variable.

ps: Creo que aprendí por primera vez sobre esta variable asignando truco por @gmazzap, para que sea más fácil eliminar la devolución de llamada de un filtro anónimo.

Espero que ayude!

    
respondido por el birgire 15.05.2017 - 11:24
4

Puede usar la palabra clave use de PHP . Así que con la ayuda de esta palabra clave use puede traer una variable dentro de una función. Y también puedes escribir una función anónima para reducir el código. Así que todo será ...

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

Espero que ayude.

    
respondido por el CodeMascot 15.05.2017 - 05:33
0

¿Por qué no pasar el valor $ como parámetro?

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

documentación

    
respondido por el madalinivascu 15.05.2017 - 07:49

Lea otras preguntas en las etiquetas