Cum creez un shortcode pentru a afișa o postare personalizată într-o pagină sau articol obișnuit?
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)?

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ă

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()
?

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.

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 :)

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?

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

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