Mostrare i post per tag sulla pagina
Sto cercando di creare una pagina WordPress avanzata che mostri il contenuto normale, più una seconda sezione sulla stessa pagina che visualizzi gli ultimi post di un determinato tag. Ad esempio, viene creata una pagina sui "gatti", con immagini, contenuti, ecc. Successivamente, vorrei mostrare gli ultimi X post taggati con "gatti". È possibile farlo senza utilizzare plugin e senza creare un template di pagina personalizzato per ogni pagina?
Forse è fattibile con la funzionalità dei campi personalizzati e loop multipli. Ad esempio, ottenere X numero di post da un campo personalizzato con il valore "gatti". Ci sto lavorando da un po' e non riesco a trovare una soluzione che non implichi la creazione di un template per ogni singola pagina.
Grazie!
Questo dovrebbe fare al caso tuo. Controllerà i post che sono stati taggati con il titolo della pagina corrente. Non c'è bisogno di usare if (have_posts()):
in un template di pagina: se il template viene chiamato sarà perché c'è un post :)
<div class="page-loop">
<?php
while (have_posts()) : the_post();
$page_title = strtolower(get_the_title());
the_title('<h1>','</h1>');
?>
<p><?php the_content(); ?><p>
<?php endwhile;?>
</div>
<!-- Ottieni il post più recente che è stato taggato con il titolo della pagina -->
<div class="related-posts">
<?php
$args = array(
'tag' => $page_title,
'posts_per_page' => 1,
);
$query = new WP_Query($args);
if ($query->have_posts()) :
while ($query->have_posts()) : $query->the_post();
the_title('<h1>','</h1>');
?>
<p><?php the_content(); ?><p>
<?php endwhile; else: ?>
<p>Spiacenti, nessun post con questo tag!</p>
<?php endif; wp_reset_query(); ?>
</div>
Se preferisci usare dei meta personalizzati per aggiungere il 'tag' alla pagina (invece di usare semplicemente il titolo) potresti aggiungere un meta box personalizzato alla pagina in questo modo. Aggiungi il seguente codice al tuo functions.php (nota: questo aggiungerà il meta box a tutte le pagine)
/** registra il meta box */
function my_theme_add_meta_boxes() {
global $post;
add_meta_box(
'my-theme-meta',
'Scegli un tag',
'my_theme_print_page_meta',
'page',
'normal',
'high'
);
}
add_action('add_meta_boxes', 'my_theme_add_meta_boxes');
/** Aggiungi meta extra alla pagina */
function my_theme_print_page_meta() {
global $post;
$page_tags = get_post_meta($post->ID, '_page-tags', true);
?>
<label for="page-tags">Aggiungi un 'tag'</label>
<input type="text" class="page-tags" name="page-tags" value="<?php echo esc_attr($page_tags); ?>" />
<?php
}
/** Salva i meta del post */
function my_theme_save_custom_meta() {
global $post;
// Impedisce a WP di cancellare i meta del post durante l'autosalvataggio
if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
return $post->ID;
}
if (isset($_POST['page-tags'])) {
$clean = sanitize_text_field($_POST['page-tags']);
update_post_meta($post->ID, '_page-tags', $clean);
}
}
add_action('save_post', 'my_theme_save_custom_meta');
Allora il tuo codice page.php potrebbe essere così:
<div class="page-loop">
<?php
while (have_posts()) : the_post();
$page_tags = get_post_meta($post->ID, '_page-tags', true);
the_title('<h1>','</h1>');
?>
<p><?php the_content(); ?><p>
<?php endwhile;?>
</div>
<?php if ($page_tags): ?>
<!-- Ottieni il post più recente che è stato taggato con il titolo della pagina -->
<div class="related-posts">
<?php
$args = array(
'tag' => $page_tags,
'posts_per_page' => 1,
);
$query = new WP_Query($args);
if ($query->have_posts()) :
while ($query->have_posts()) : $query->the_post();
the_title('<h1>','</h1>');
?>
<p><?php the_content(); ?><p>
<?php endwhile; else: ?>
<p>Spiacenti, nessun post con questo tag!</p>
<?php endif; wp_reset_query(); ?>
</div>
<?php endif; // Ci sono 'tag di pagina' ?>

Esegui una WP_Query nella seconda parte della tua pagina:
<!-- Prima parte della tua pagina!-->
<div class="firstcontent">
<?php if ( have_posts() ) : while ( have_posts() ) : the_post();?>
<p><?php the_title(); ?><p>
<p><?php the_content(); ?><p>
<?php endwhile; endif;?>
</div>
<!-- E ora chiami la WP_Query() !-->
<div class="secondcontent">
<!-- ottieni la query principale !-->
<?php $wp_query = new WP_Query(array(
'post_type' => 'post'
));?>
<!-- e puoi usarla come sopra !-->
<?php if ( have_posts() ) : while ( have_posts() ) : the_post();?>
<p><?php the_title(); ?><p>
<p><?php the_content(); ?><p>
<?php endwhile; endif;?>
</div>
Sto attualmente lavorando con un tema su WordPress, e sto facendo proprio questa cosa, quindi funziona!

Ci sono già risposte sopra su come utilizzare i loop, quindi non aggiungerò altro riguardo a wp get recent posts o Parametri della Tassonomia.
Ma potresti voler considerare di racchiudere il tuo codice in un Widget, il che renderebbe più semplice l'aggiunta ai tuoi template esistenti.
