Mostrar entradas por etiqueta en una página
Estoy tratando de crear una página avanzada en WordPress que muestre el contenido regular, más una segunda sección en la misma página que muestre las últimas entradas de una etiqueta X. Por ejemplo, se crea una página sobre "gatos", tiene imágenes, contenido, etc. Después, me gustaría mostrar las últimas X entradas etiquetadas con "gatos". ¿Es posible hacer esto sin usar plugins y sin crear una plantilla de página personalizada para cada página?
Quizás sea posible hacerlo con la función de campos personalizados y múltiples bucles. Por ejemplo, obtener X cantidad de entradas desde un campo personalizado con el valor "gatos". He estado luchando con esto durante un tiempo y no puedo encontrar una solución que no implique crear una plantilla para cada página individual.
¡Gracias!

Esto debería funcionar. Comprobará si hay publicaciones que hayan sido etiquetadas con el título de la página actual. No es necesario usar if (have_posts()):
en una plantilla de página: si se llama a la plantilla será porque hay una publicación :)
<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>
<!-- Obtener la publicación más reciente que ha sido etiquetada con el título de la página -->
<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>¡Lo sentimos, no hay publicaciones con esta etiqueta!</p>
<?php endif; wp_reset_query(); ?>
</div>
Si prefieres usar metadatos personalizados para agregar la 'etiqueta' a la página (en lugar de solo usar el título) podrías agregar un metabox personalizado a la página así. Agrega el siguiente código a tu functions.php (nota: esto agregará el metabox a todas las páginas)
/** registrar el metabox */
function my_theme_add_meta_boxes() {
global $post;
add_meta_box(
'my-theme-meta',
'Elige una etiqueta',
'my_theme_print_page_meta',
'page',
'normal',
'high'
);
}
add_action('add_meta_boxes', 'my_theme_add_meta_boxes');
/** Agregar metadatos adicionales a la página */
function my_theme_print_page_meta() {
global $post;
$page_tags = get_post_meta($post->ID, '_page-tags', true);
?>
<label for="page-tags">Agregar una 'etiqueta'</label>
<input type="text" class="page-tags" name="page-tags" value="<?php echo esc_attr($page_tags); ?>" />
<?php
}
/** Guardar metadatos personalizados */
function my_theme_save_custom_meta() {
global $post;
// Evita que WP borre los metadatos al autoguardar
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');
Entonces tu código en page.php podría verse así:
<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): ?>
<!-- Obtener la publicación más reciente etiquetada con el título de la página -->
<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>¡Lo sentimos, no hay publicaciones con esta etiqueta!</p>
<?php endif; wp_reset_query(); ?>
</div>
<?php endif; // Hay 'etiquetas de página' ?>

Realiza una WP_Query en la segunda parte de tu página:
<!-- Primera parte de tu página -->
<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>
<!-- Y ahora llamas a WP_Query() -->
<div class="secondcontent">
<!-- Obtener la consulta principal -->
<?php $wp_query = new WP_Query(array(
'post_type' => 'post'
));?>
<!-- Y puedes usarla como arriba -->
<?php if ( have_posts() ) : while ( have_posts() ) : the_post();?>
<p><?php the_title(); ?><p>
<p><?php the_content(); ?><p>
<?php endwhile; endif;?>
</div>
Actualmente estoy trabajando con un tema en WordPress, y estoy haciendo esto exactamente, ¡así que funciona!

Ya hay respuestas anteriores sobre cómo usar bucles, así que no añadiré más acerca de wp get recent posts o Parámetros de Taxonomía.
Pero quizá quieras considerar envolver tu código en un Widget, lo que haría más fácil añadirlo a tus plantillas existentes.
