Parametri Multipli pentru un Shortcode
Lucrez la crearea unor shortcode-uri pentru blogul meu. Pot seta un singur parametru pentru shortcode, dar nu sunt sigur cum să setez parametri diferiți.
De exemplu, pot folosi [myshortcode myvalue]
pentru a afișa un bloc html în conținutul articolului.
Iată ce folosesc în prezent:
function test_shortcodes( $atts ) {
extract( shortcode_atts( array(
'myvalue' => '<div class="shortcodecontent"></div>'
), $atts ) );
return $myvalue;
}
add_shortcode( 'myshortcode', 'test_shortcodes' );
Acum, cum pot folosi [myshortcode myothervalue]
pentru a afișa un bloc diferit de html?
Vă rog să rețineți că shortcode-ul este același, doar parametrul este modificat.

Să analizăm shortcode-ul:
[SH_TEST var1="somevalue" var2="someothervalue"]THE SHORTCODE CONTENT[/SH_TEST]
Funcția handler pentru shortcode acceptă 3 parametri:
$atts
- un array de atribute transmise prin shortcode, în cazul nostru:$atts['var1']
este setat la'somevalue'
$atts['var2']
este setat la'someothervalue'
$content
- este un șir de caractere reprezentând conținutul închis între tagurile shortcode-ului, în cazul nostru: -$content
este setat laTHE SHORTCODE CONTENT
$tag
- este un șir de caractere reprezentând tagul shortcode-ului, în cazul nostru: -$tag
este setat laSH_TEST
Când creez un shortcode, de obicei definesc valorile implicite și le combin cu valorile trimise prin tag-ul shortcode-ului, de exemplu:
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';
}

Dacă folosești shortcode-ul în acest fel, atts[0]
va conține valoarea:
add_shortcode( 'test', 'test_callback' );
function test_callback( $atts )
{
return $atts[0];
}
O altă metodă este să apelezi valoarea cu un nume:
[myshortcode val="myvalue"]
function test_callback( $atts )
{
return $atts["val"];
}

Este mai bine să faci astfel:
function test_shortcodes( $atts ) {
extract( shortcode_atts( array(
'type' => 'myvalue' // Valoare implicită
), $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' ); // Înregistrează shortcode-ul
Folosește astfel:
[myshortcode type="myvalue"]
pentru a afișa <div class="shortcodecontent"></div>
și
[myshortcode type="myothervalue"]
pentru a afișa <div class="othershortcodecontent"></div>

Această metodă funcționează pentru mine în toate cazurile folosind [myshortcode type="myvalue"]
function test_shortcodes( $atts = array() ) {
extract( shortcode_atts( array(
'type' => 'myvalue' // Valoare implicită
), $atts ) );
switch( $atts['type'] ){ // Verificăm tipul de shortcode
case 'myvalue':
$output = '<div class="shortcodecontent"></div>'; // Conținut pentru myvalue
break;
case 'myothervalue':
$output = '<div class="othershortcodecontent"></div>'; // Conținut pentru myothervalue
break;
default:
$output = '<div class="defaultshortcodecontent"></div>'; // Conținut implicit
break;
}
return $output; // Returnăm rezultatul
}
add_shortcode( 'myshortcode', 'test_shortcodes' ); // Adăugăm shortcode-ul
Și dacă doriți să adăugați un alt parametru, tot ce trebuie să faceți este acest lucru [myshortcode type="myvalue" other="somevalue"]
test_shortcodes( $atts = array() ) {
extract( shortcode_atts( array(
'type' => 'myvalue', // Poate fi implicit
'other' => 'somevalue' // Poate fi implicit
), $atts ) );
switch( $atts['other'] ){ // Verificăm parametrul 'other'
case 'somevalue':
$output = '<div class="shortcodecontent">somevalue</div>'; // Conținut pentru somevalue
break;
case 'myothervalue':
$output = '<div class="othershortcodecontent"></div>'; // Conținut pentru myothervalue
break;
default:
$output = '<div class="defaultshortcodecontent"></div>'; // Conținut implicit
break;
}
return $output; // Returnăm rezultatul
}
add_shortcode( 'myshortcode', 'test_shortcodes' ); // Adăugăm shortcode-ul
Sper că acest lucru vă ajută

Mai întâi, va trebui să definiți elementul $atts în funcția dvs. deoarece $atts este un array.
Iată codul complet pentru a transmite variabila în shortcode -
Să presupunem că trebuie să afișați toate produsele dintr-o categorie prin shortcode, trebuie să implementați următorul cod în fișierul funcțiilor -
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');
Acum puteți pur și simplu insera codul shortcode-ului în fișierul template sau în editorul implicit Wordpress -
[creative_writing_func_short categoryname="creative-writing-english-literature"]
Unde transmitem numele categoriei (creative-writing-english-literature) în shortcode.
Am testat și funcționează.

Nu poți folosi echo
într-un shortcode, callback-ul trebuie să returneze un șir de caractere.

Te rog să nu postezi cod netestat. Mai ales dacă spui că este testat și funcționează!

@fuxia Poți folosi echo la fel de bine precum și tag-uri HTML, depinde de cerințele tale. Am folosit acest shortcode în Visual Composer pentru a afișa numele produsului cu thumbnail și link. Și funcționează perfect.

@AndyMacaulay-Brook În prezent folosesc acest cod în portalul meu de e-commerce Wordpress. Este testat, așa cum am menționat.

Vezi https://wordpress.stackexchange.com/a/73083/73 pentru o explicație. Dacă folosești echo
, conținutul ar putea fi afișat în locuri neașteptate.

@fuxia Conținutul va fi afișat acolo unde adaugi shortcode-ul. Așa cum am explicat - folosesc același shortcode (cu unele actualizări ale tag-urilor HTML) în Visual Composer, și funcționează perfect. Mulțumesc pentru sugestii.
