Cum creez un shortcode pentru a afișa o postare personalizată într-o pagină sau articol obișnuit?

18 feb. 2011, 14:40:35
Vizualizări: 37.7K
Voturi: 1

Aș dori să creez un shortcode care să extragă informații dintr-o postare personalizată și să le afișeze într-o Pagină sau Articol obișnuit.

Caz specific de utilizare: Am un tip de postare personalizată "Film" pentru un site web de festival de film. Filmele sunt afișate cu propriul lor șablon single-film.php, dar ocazional administratorii site-ului vor să scrie un articol sau o pagină care menționează un anumit film și ar dori să poată extrage fragmente din informațiile care au fost deja introduse (de exemplu, numele filmului, informații despre rezervare etc). Acestea ar urma să apară într-o "casetă" la sfârșitul articolului, și aș dori să le fac acest lucru ușor oferindu-le un fel de shortcode.

Cum aș putea realiza acest lucru? Ce resurse/tutoriale recomandate mă pot pune pe drumul cel bun? Ce capcane ar trebui să am în vedere (de exemplu, bucle multiple într-un articol)?

0
Toate răspunsurile la întrebare 2
8

Există multe tutoriale excelente despre shortcode-uri pe internet și câteva exemple bune aici.

Dar pentru a te ajuta să începi:

add_shortcode('film_q', 'film_shortcode_query');
function film_shortcode_query($atts, $content){
  extract(shortcode_atts(array( // câteva valori implicite
   'posts_per_page' => '1',
   'post_type' => 'film',
   'caller_get_posts' => 1)
   , $atts));

  global $post;

  $posts = new WP_Query($atts);
  $output = '';
    if ($posts->have_posts())
        while ($posts->have_posts()):
            $posts->the_post();
            $out = '<div class="film_box">
                <h4>Nume Film: <a href="'.get_permalink().'" title="' . get_the_title() . '">'.get_the_title() .'</a></h4>
                <p class="Film_desc">'.get_the_content().'</p>';
                // adaugă aici mai multe...
            $out .='</div>';
    /* aceste argumente vor fi disponibile din interiorul $content
        get_permalink()  
        get_the_content()
        get_the_category_list(', ')
        get_the_title()
        și câmpuri personalizate
        get_post_meta($post->ID, 'field_name', true);
    */
    endwhile;
  else
    return; // nu au fost găsite postări

  wp_reset_query();
  return html_entity_decode($out);
}

Pentru a-l folosi, introdu în orice post/pagină:

[film_q p=ID_POST_FILM]

doar înlocuiește ID_POST_FILM cu ID-ul real al postării Film.

Sper că acest lucru te ajută

18 feb. 2011 15:36:41
Comentarii

Salut... Din nu știu ce motiv, shortcode-ul nu extrage corect post_type=film? Dacă fac un var_dump pentru $posts, se pare că valorile implicite furnizate în extract nu sunt deloc utilizate? Ar trebui să returnez altceva decât $atts pentru a le folosi în new WP_Query()?

gillespieza gillespieza
19 feb. 2011 20:52:21

Presupun că var_dump pentru $post nu este în funcția shortcode-ului. Dacă am dreptate și tu apelezi var_dump în loop-ul temei, atunci de aceea nu vezi argumentele pe care le căutai.

Bainternet Bainternet
19 feb. 2011 20:59:46

Aha, am adăugat asta după extract: $film_query = 'posts_per_page='.$posts_per_page.'&post_type='.$post_type.'&p='.$id; și am folosit $film_query în loc de $atts în interogare. Mersi :)

gillespieza gillespieza
19 feb. 2011 21:13:43

unde vezi "$film_query = ...." ?

Bainternet Bainternet
19 feb. 2011 21:16:46

Ce se întâmplă dacă conținutul filmului meu $content conține shortcodes? Cum pot să-l analizez corect? Ar trebui să creez un filtru pentru conținul returnat?

gillespieza gillespieza
19 feb. 2011 21:45:05

Am construit $film_query pentru a-l folosi în $posts = new WP_Query($film_query); deoarece $atts îmi oferea doar p=FILM_POST_ID și nu restul valorilor implicite...

gillespieza gillespieza
19 feb. 2011 21:46:53

Da, ai dreptate, get_the_content ocolește filtrul the_content

Bainternet Bainternet
19 feb. 2011 21:49:23

Ok, deci dacă folosesc return (apply_filters ('the_content', $out) ); în loc de return html_entity_decode($out); se parsează frumos :)

gillespieza gillespieza
19 feb. 2011 22:05:38
Arată celelalte 3 comentarii
0

Încearcă să începi cu acest tutorial.

În funcția de callback, efectuează o interogare personalizată (sau folosește get_post) pentru articol și extrage doar valorile relevante pentru tine. (De exemplu: titlu, rezumat...)

exemplu de scurtcod

[film id=10]

Folosește ID-ul în funcția ta pentru a prelua conținutul filmului.

18 feb. 2011 15:35:06