Afișarea articolelor după etichetă pe pagină
Încerc să creez o pagină WordPress avansată care să afișeze conținutul obișnuit, plus o a doua secțiune pe aceeași pagină care să arate cele mai recente articole dintr-o etichetă X. De exemplu, se creează o pagină despre "pisici", are poze, conținut etc. După aceea, aș dori să afișez ultimele X articole etichetate cu "pisici". Este posibil acest lucru fără a folosi plugin-uri și fără a crea un șablon de pagină personalizat pentru fiecare pagină?
Probabil se poate realiza cu ajutorul funcției de câmpuri personalizate și bucle multiple. De exemplu, să obții X număr de articole dintr-un câmp personalizat cu valoarea "pisici". M-am luptat cu această problemă de ceva vreme și nu pot găsi o soluție care să nu implice crearea unui șablon pentru fiecare pagină în parte.
Mulțumesc!
Acest lucru ar trebui să funcționeze. Va verifica postările care au fost etichetate cu titlul paginii curente. Nu este nevoie să folosiți if (have_posts()):
într-un șablon de pagină: dacă șablonul este apelat, acest lucru se va întâmpla doar dacă există o postare :)
<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>
<!-- Obține cea mai recentă postare care a fost etichetată cu titlul paginii -->
<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>Ne pare rău, nu există postări cu această etichetă!</p>
<?php endif; wp_reset_query(); ?>
</div>
Dacă preferați să folosiți meta personalizate pentru a adăuga 'eticheta' la pagină (în loc să folosiți doar titlul), puteți adăuga o casetă meta personalizată la pagină astfel. Adăugați următorul cod în fișierul functions.php (notă: acest lucru va adăuga caseta meta la toate paginile)
/** înregistrează caseta meta */
function my_theme_add_meta_boxes() {
global $post;
add_meta_box(
'my-theme-meta',
'Alege o etichetă',
'my_theme_print_page_meta',
'page',
'normal',
'high'
);
}
add_action('add_meta_boxes', 'my_theme_add_meta_boxes');
/** Adaugă meta suplimentare la pagină */
function my_theme_print_page_meta() {
global $post;
$page_tags = get_post_meta($post->ID, '_page-tags', true);
?>
<label for="page-tags">Adaugă o 'etichetă'</label>
<input type="text" class="page-tags" name="page-tags" value="<?php echo esc_attr($page_tags); ?>" />
<?php
}
/** Salvează meta personalizată */
function my_theme_save_custom_meta() {
global $post;
// Oprește WP să șteargă meta postării la salvarea automată
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');
Atunci codul din page.php ar putea arăta astfel:
<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): ?>
<!-- Obține cea mai recentă postare care a fost etichetată cu titlul paginii -->
<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>Ne pare rău, nu există postări cu această etichetă!</p>
<?php endif; wp_reset_query(); ?>
</div>
<?php endif; // Există 'etichete de pagină' ?>

Realizează un WP_Query în a doua parte a paginii tale:
<!-- Prima parte a paginii tale!-->
<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>
<!-- Și acum apelezi WP_Query() !-->
<div class="secondcontent">
<!-- obține interogarea principală !-->
<?php $wp_query = new WP_Query(array(
'post_type' => 'post'
));?>
<!-- și poți să o folosești ca mai sus !-->
<?php if ( have_posts() ) : while ( have_posts() ) : the_post();?>
<p><?php the_title(); ?><p>
<p><?php the_content(); ?><p>
<?php endwhile; endif;?>
</div>
În prezent lucrez cu o temă WordPress și folosesc acest cod, așa că funcționează!

Există deja răspunsuri mai sus despre cum să folosești bucle, așa că nu voi adăuga mai multe detalii despre wp get recent posts sau Parametrii Taxonomiei.
Dar ai putea dori să înfășori codul tău într-un Widget, ceea ce ar face adăugarea în șabloanele existente puțin mai ușoară.
