Parametri Multipli pentru un Shortcode

4 feb. 2013, 16:22:18
Vizualizări: 34.3K
Voturi: 3

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.

6
Comentarii

exemple de cod ale shortcode-ului tău ar putea fi utile. Măcar părțile importante.

Steve Steve
4 feb. 2013 16:28:41

Te referi la myvalue="something", corect?

s_ha_dum s_ha_dum
4 feb. 2013 16:35:43

@Stephen Am adăugat bucata mea de cod. s_ha_dum nu, nu la asta mă refer.

Abhik Abhik
4 feb. 2013 18:22:38

Poți să dai un exemplu despre cum scrii shortcode-ul în pagină/postare? Codul nu are prea mult sens.

Steve Steve
4 feb. 2013 18:35:51

@Stephen iată-l

Primul paragraf al postării [myshortcode myvalue]

Al doilea paragraf [myshortcode myothervalue]

Abhik Abhik
4 feb. 2013 18:39:35

Trebuie să consulți codex-ul pentru a înțelege shortcode-urile. Vezi această documentație: http://codex.wordpress.org/Shortcode_API

Steve Steve
4 feb. 2013 18:42:19
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 5
0
10

Să analizăm shortcode-ul:

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

Funcția handler pentru shortcode acceptă 3 parametri:

  1. $atts - un array de atribute transmise prin shortcode, în cazul nostru:

    • $atts['var1'] este setat la 'somevalue'
    • $atts['var2'] este setat la 'someothervalue'
  2. $content - este un șir de caractere reprezentând conținutul închis între tagurile shortcode-ului, în cazul nostru: - $content este setat la THE SHORTCODE CONTENT

  3. $tag - este un șir de caractere reprezentând tagul shortcode-ului, în cazul nostru: - $tag este setat la SH_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'; 
}
4 feb. 2013 17:22:04
1

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"];
}
4 feb. 2013 16:29:48
Comentarii

Poți să elaborezi, te rog, primul proces?

Abhik Abhik
4 feb. 2013 18:25:04
0

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>

4 feb. 2013 18:36:50
0

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ă

11 nov. 2016 19:08:59
7
-2

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

22 iun. 2018 13:31:49
Comentarii

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

fuxia fuxia
22 iun. 2018 16:01:47

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

Andy Macaulay-Brook Andy Macaulay-Brook
22 iun. 2018 18:42:41

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

Amritosh pandey Amritosh pandey
23 iun. 2018 22:17:25

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

Amritosh pandey Amritosh pandey
23 iun. 2018 22:19:06

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 fuxia
23 iun. 2018 22:20:59

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

Amritosh pandey Amritosh pandey
23 iun. 2018 22:25:37

Orice site care parsează the_content, poate într-un plugin SEO, înainte ca șablonul să fie procesat, va începe să arunce erori de tip "headers already sent", doar ca un exemplu despre ce ar putea merge prost dacă un shortcode folosește echo.

Andy Macaulay-Brook Andy Macaulay-Brook
23 iun. 2018 22:35:08
Arată celelalte 2 comentarii