Parametri Multipli per uno Shortcode
Sto lavorando alla creazione di alcuni shortcode per il mio blog. Riesco a impostare un singolo parametro per il mio shortcode, ma non sono sicuro di come impostare parametri diversi.
Per esempio, posso usare [myshortcode myvalue]
per generare un blocco html all'interno del contenuto del post.
Ecco quello che sto utilizzando attualmente:
function test_shortcodes( $atts ) {
extract( shortcode_atts( array(
'myvalue' => '<div class="shortcodecontent"></div>'
), $atts ) );
return $myvalue;
}
add_shortcode( 'myshortcode', 'test_shortcodes' );
Ora, come posso utilizzare [myshortcode myothervalue]
per generare un blocco HTML diverso?
Si noti che lo shortcode è lo stesso, solo il parametro viene cambiato.

Esaminiamo lo shortcode
[SH_TEST var1="somevalue" var2="someothervalue"]IL CONTENUTO DELLO SHORTCODE[/SH_TEST]
La funzione di gestione dello shortcode accetta 3 parametri
$atts
- un array di attributi passati dallo shortcode, nel nostro caso:$atts['var1']
è impostato a'somevalue'
$atts['var2']
è impostato a'someothervalue'
$content
- è una stringa del valore racchiuso tra i tag dello shortcode, nel nostro caso: -$content
è impostato aIL CONTENUTO DELLO SHORTCODE
$tag
- è una stringa del tag dello shortcode, nel nostro caso: -$tag
è impostato aSH_TEST
Quando creo uno shortcode, di solito definisco i valori predefiniti e li unisco con i valori inviati dal tag dello shortcode, ad esempio:
add_shortcode('SH_TEST','SH_TEST_handler');
function SH_TEST_handler($atts = array(), $content = null, $tag){
shortcode_atts(array(
'var1' => 'valore predefinito var1',
'var2' => false
), $atts);
if ($atts['var2'])
return 'mioaltrovalore';
else
return 'miovalore';
}

Se usi lo shortcode in questo modo atts[0]
conterrà il valore:
add_shortcode( 'test', 'test_callback' );
function test_callback( $atts )
{
return $atts[0];
}
Un altro modo è richiamare il valore con un nome:
[myshortcode val="mio_valore"]
function test_callback( $atts )
{
return $atts["val"];
}

È meglio procedere in questo modo:
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' );
Utilizzalo in questo modo:
[myshortcode type="myvalue"]
per ottenere <div class="shortcodecontent"></div>
e
[myshortcode type="myothervalue"]
per ottenere <div class="othershortcodecontent"></div>

Questo metodo funziona per me in tutti i casi utilizzando [myshortcode type="myvalue"]
function test_shortcodes( $atts = array() ) {
extract( shortcode_atts( array(
'type' => 'myvalue' // Valore predefinito
), $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' );
E se vuoi aggiungere un altro parametro, tutto ciò che devi fare è questo [myshortcode type="myvalue" other="somevalue"]
test_shortcodes( $atts = array() ) {
extract( shortcode_atts( array(
'type' => 'myvalue', // Può essere predefinito
'other' => 'somevalue' // Può essere predefinito
), $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' );
Spero che questo sia utile

Per prima cosa, dovrai definire l'elemento $atts nella tua funzione perché $atts è un array.
Ecco il codice completo per passare la variabile nello shortcode -
Supponiamo che tu debba mostrare tutti i prodotti di una categoria tramite shortcode, devi inserire il seguente codice nel tuo file delle funzioni -
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');
Ora puoi semplicemente incollare il codice dello shortcode nel tuo file template o nell'editor predefinito di Wordpress -
[creative_writing_func_short categoryname="creative-writing-english-literature"]
Dove stiamo passando il nome della Categoria (creative-writing-english-literature) nello shortcode.
L'ho testato e funziona correttamente.

Non puoi usare echo
in uno shortcode, la callback deve restituire una stringa.

Per favore non postare codice non testato. Specialmente se dici che è testato e funzionante!

@fuxia Puoi usare echo così come i tag HTML, dipende dalle tue esigenze, ho usato questo shortcode per visual composer per mostrare il nome del prodotto con la miniatura e il link. E funziona perfettamente.

@AndyMacaulay-Brook Attualmente sto utilizzando questo codice nel mio portale e-commerce Wordpress. Questo è testato come ho detto.

Vedi https://wordpress.stackexchange.com/a/73083/73 per una spiegazione. Se usi echo
, il contenuto potrebbe essere stampato dove non te lo aspetti.

@fuxia Il contenuto verrà stampato dove aggiungi il tuo shortcode. Come ho spiegato - sto usando lo stesso shortcode (con alcuni tag HTML aggiornati) da utilizzare nel visual composer, e funziona bene. Grazie per i tuoi suggerimenti.
