Múltiples Parámetros para un Shortcode
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.

Veamos el shortcode:
[SH_TEST var1="somevalue" var2="someothervalue"]THE SHORTCODE CONTENT[/SH_TEST]
La función manejadora del shortcode acepta 3 parámetros:
$atts
- un array de atributos pasados por el shortcode, en nuestro caso:$atts['var1']
tiene el valor'somevalue'
$atts['var2']
tiene el valor'someothervalue'
$content
- es una cadena con el valor contenido dentro de las etiquetas del shortcode, en nuestro caso: -$content
tiene el valorTHE SHORTCODE CONTENT
$tag
- es una cadena con el nombre del shortcode, en nuestro caso: -$tag
tiene el valorSH_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';
}

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

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>

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

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.

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

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

@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.

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

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

@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.
