Múltiples Parámetros para un Shortcode

4 feb 2013, 16:22:18
Vistas: 34.3K
Votos: 3

Estoy trabajando en crear algunos shortcodes para mi blog. Puedo establecer un único parámetro para mi shortcode, pero no estoy seguro de cómo establecer diferentes parámetros.

Por ejemplo, puedo usar [myshortcode myvalue] para mostrar un bloque html dentro del contenido del post.

Esto es lo que estoy usando actualmente:

function test_shortcodes( $atts ) {
    extract( shortcode_atts( array(
        'myvalue' => '<div class="shortcodecontent"></div>'

    ), $atts ) );

    return $myvalue;
}
add_shortcode( 'myshortcode', 'test_shortcodes' );

Ahora, ¿cómo puedo usar [myshortcode myothervalue] para mostrar un bloque diferente de html?

Ten en cuenta que el shortcode es el mismo, solo cambia el parámetro.

6
Comentarios

Los ejemplos de código de tu shortcode podrían ser útiles. Al menos las partes importantes.

Steve Steve
4 feb 2013 16:28:41

¿Te refieres a myvalue="something", verdad?

s_ha_dum s_ha_dum
4 feb 2013 16:35:43

@Stephen Añadí mi fragmento de código. s_ha_dum no, a eso no me refiero.

Abhik Abhik
4 feb 2013 18:22:38

¿Puedes darme un ejemplo de cómo estás escribiendo tu shortcode en la página/entrada? El código no tiene mucho sentido.

Steve Steve
4 feb 2013 18:35:51

@Stephen aquí está

El primer párrafo de la entrada [myshortcode myvalue]

Segundo párrafo [myshortcode myothervalue]

Abhik Abhik
4 feb 2013 18:39:35

Necesitas revisar el codex para entender los shortcodes. Mira esta documentación: http://codex.wordpress.org/Shortcode_API

Steve Steve
4 feb 2013 18:42:19
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 5
0
10

Veamos el shortcode:

[SH_TEST var1="somevalue" var2="someothervalue"]THE SHORTCODE CONTENT[/SH_TEST]

La función manejadora del shortcode acepta 3 parámetros:

  1. $atts - un array de atributos pasados por el shortcode, en nuestro caso:

    • $atts['var1'] tiene el valor 'somevalue'
    • $atts['var2'] tiene el valor 'someothervalue'
  2. $content - es una cadena con el valor contenido dentro de las etiquetas del shortcode, en nuestro caso: - $content tiene el valor THE SHORTCODE CONTENT

  3. $tag - es una cadena con el nombre del shortcode, en nuestro caso: - $tag tiene el valor SH_TEST

Cuando creo un shortcode, normalmente defino valores por defecto y los combino con los valores enviados por la etiqueta del shortcode, por ejemplo:

add_shortcode('SH_TEST','SH_TEST_handler');
function SH_TEST_handler($atts = array(), $content = null, $tag){
    shortcode_atts(array(
        'var1' => 'default var1',
        'var2' => false
    ), $atts);

    if ($atts['var2'])
          return 'myothervalue';
    else
          return 'myvalue'; 
}
4 feb 2013 17:22:04
1

Si usas el shortcode de esa manera, atts[0] contendrá el valor:

add_shortcode( 'test', 'test_callback' );

function test_callback( $atts )
{
    return $atts[0];
}

Otra forma es llamar al valor con un nombre:

[myshortcode val="myvalue"]

function test_callback( $atts )
{
    return $atts["val"];
}
4 feb 2013 16:29:48
Comentarios

¿Podrías elaborar el primer proceso, por favor?

Abhik Abhik
4 feb 2013 18:25:04
0

Es mejor hacerlo de esta manera:

function test_shortcodes( $atts ) {
    extract( shortcode_atts( array(
        'type' => 'myvalue'

    ), $atts ) );

    switch( $type ){
        case 'myvalue': 
            $output = '<div class="shortcodecontent"></div>';
            break;

        case 'myothervalue': 
            $output = '<div class="othershortcodecontent"></div>';
            break;

        default:
            $output = '<div class="defaultshortcodecontent"></div>';
            break;
    }

    return $output;
}
add_shortcode( 'myshortcode', 'test_shortcodes' );

Úsalo así:

[myshortcode type="myvalue"] para mostrar <div class="shortcodecontent"></div>

y

[myshortcode type="myothervalue"] para mostrar <div class="othershortcodecontent"></div>

4 feb 2013 18:36:50
0

Esta forma funciona para mí en todos los casos usando [myshortcode type="myvalue"]

function test_shortcodes( $atts = array() ) {
extract( shortcode_atts( array(
    'type' => 'myvalue' // Valor por defecto

), $atts ) );

switch( $atts['type'] ){
    case 'myvalue': 
        $output = '<div class="shortcodecontent"></div>';
        break;

    case 'myothervalue': 
        $output = '<div class="othershortcodecontent"></div>';
        break;

    default:
        $output = '<div class="defaultshortcodecontent"></div>';
        break;
}

return $output;
}
add_shortcode( 'myshortcode', 'test_shortcodes' );

Y si quieres añadir otro parámetro, solo necesitas hacer esto [myshortcode type="myvalue" other="somevalue"]

function test_shortcodes( $atts = array() ) {
extract( shortcode_atts( array(
    'type' => 'myvalue', // Puede ser valor por defecto
    'other' => 'somevalue' // Puede ser valor por defecto

), $atts ) );

switch( $atts['other'] ){
    case 'somevalue': 
        $output = '<div class="shortcodecontent">somevalue</div>';
        break;

    case 'myothervalue': 
        $output = '<div class="othershortcodecontent"></div>';
        break;

    default:
        $output = '<div class="defaultshortcodecontent"></div>';
        break;
}

return $output;
}
add_shortcode( 'myshortcode', 'test_shortcodes' );

Espero que esto ayude

11 nov 2016 19:08:59
7
-2

Primero, deberás definir el elemento $atts en tu función porque $atts es un array.

Aquí está el código completo para pasar la variable en el shortcode -

Supongamos que necesitas mostrar todos los productos de una categoría mediante un shortcode, necesitas hacer el siguiente código en tu archivo de funciones -

 function creative_writing_func($atts) {
 $args = array(
'post_type'      => 'product',
'posts_per_page' => 10,
'product_cat'    => $atts['categoryname']
);

$loop = new WP_Query( $args );

while ( $loop->have_posts() ) : $loop->the_post();
global $product;
echo '<br /><a href="'.get_permalink().'">' . 
woocommerce_get_product_thumbnail().' '.get_the_title().'</a>';
endwhile;

wp_reset_query();
}

add_shortcode('creative_writing_func_short', 'creative_writing_func');

Ahora puedes simplemente pegar el código del shortcode en tu archivo de plantilla o en el editor predeterminado de Wordpress -

  [creative_writing_func_short categoryname="creative-writing-english-literature"]

Donde estamos pasando el nombre de la categoría (creative-writing-english-literature) en el shortcode.

Lo he probado y está funcionando.

22 jun 2018 13:31:49
Comentarios

No puedes usar echo en un shortcode, el callback debe retornar una cadena.

fuxia fuxia
22 jun 2018 16:01:47

¡Por favor no publiques código sin probar. Especialmente si dices que está probado y funciona!

Andy Macaulay-Brook Andy Macaulay-Brook
22 jun 2018 18:42:41

@fuxia Puedes usar echo así como etiquetas HTML, depende de tus requerimientos. He usado este shortcode para usarlo en el visual composer y mostrar el nombre del producto con su miniatura y enlace. Y funciona perfectamente.

Amritosh pandey Amritosh pandey
23 jun 2018 22:17:25

@AndyMacaulay-Brook Actualmente estoy usando este código en mi portal de comercio electrónico con Wordpress. Como mencioné, esto ya está probado.

Amritosh pandey Amritosh pandey
23 jun 2018 22:19:06

Consulta https://wordpress.stackexchange.com/a/73083/73 para una explicación. Si usas echo, el contenido podría mostrarse en lugares inesperados.

fuxia fuxia
23 jun 2018 22:20:59

@fuxia El contenido se imprimirá donde agregues tu shortcode. Como expliqué, estoy usando el mismo shortcode (con algunas etiquetas HTML actualizadas) para usarlo en el visual composer, y funciona correctamente. Gracias por tus sugerencias.

Amritosh pandey Amritosh pandey
23 jun 2018 22:25:37

Cualquier sitio web que analice the_content, tal vez en un plugin de SEO, antes de que se procese la plantilla, comenzará a mostrar errores de "headers already sent", solo como un ejemplo de lo que podría salir mal si un shortcode utiliza echo.

Andy Macaulay-Brook Andy Macaulay-Brook
23 jun 2018 22:35:08
Mostrar los 2 comentarios restantes