Mostrar la última entrada de una categoría en una página
Quiero mostrar en una página el contenido de la última entrada de una categoría.
Por ejemplo, la categoría foo tiene las siguientes entradas:
- Hola Mundo
- Hola Marte
- Foo bar
Considerando que Foo Bar es el último artículo de la categoría foo, su contenido debería mostrarse en una página:
<title>
<content>
Donde <title> es Foo bar y <content> es el contenido de la entrada.
¿Cómo puedo hacer esto?
Estoy teniendo dificultades para implementar la respuesta de @Pieter. Agregué estas líneas en functions.php:
function latest_post() {
$args = array(
'posts_per_page' => 1, // necesitamos solo la última entrada, así que obtenemos solo esa entrada
'cat' => '4' // Usa el ID de la categoría, también se puede reemplazar con category_name que usa el slug de la categoría
);
$str = "";
$posts = get_posts($args);
foreach($posts as $post):
$str = $str."<h2>".$post->title."</h2>";
$str = $str."<p class='post-content-custom'>".$post->content."</p>";
endforeach;
return $str;
}
add_shortcode('latest_post', 'latest_post');
En la página hago:
[latest_post]
Sin embargo, no aparece ningún error, pero el contenido de la entrada no se muestra.
Puedes hacer uso de WP_Query para llamar la última publicación de la categoría y mostrarla. Echa un vistazo a los parámetros de categoría. Por defecto, WP_Query usa post como tipo de publicación y ordena las publicaciones por fecha, por lo que podemos excluirlo de la consulta. Si necesitas algo diferente, simplemente puedes definirlo en tus argumentos.
Básicamente puedes probar algo como esto:
$args = array(
'posts_per_page' => 1, // Solo necesitamos la última publicación, así que obtenemos solo esa
'cat' => 'ID DE LA CATEGORÍA', // Usa el ID de la categoría, también puedes usar category_name con el slug de la categoría
//'category_name' => 'SLUG DE LA CATEGORÍA FOO',
);
$q = new WP_Query( $args);
if ( $q->have_posts() ) {
while ( $q->have_posts() ) {
$q->the_post();
// Tus etiquetas de plantilla y marcado como:
the_title();
}
wp_reset_postdata();
}
Esto debería darte una base, puedes modificarlo, personalizarlo y usarlo como prefieras. Si no estás seguro de los parámetros y su uso, revisa la página del codex de WP_Query para obtener ayuda.
EDITAR
Realmente no entiendo por qué decidiste reinventar la rueda y usar get_posts cuando ya te mostré un ejemplo funcional de cómo usar WP_Query. Tu uso de get_posts en conjunto con las propiedades de WP_Post es completamente incorrecto.
Las propiedades de
WP_Postno están filtradas, por lo que la salida de esto no está filtrada y no se verá igual que la salida de las etiquetas de plantilla comothe_title()othe_content(). Debes usar los filtros apropiados en esas propiedades.titleycontentson propiedades inválidas deWP_POST. La otra respuesta está completamente equivocada. Las propiedades correctas sonpost_titleypost_content.Puedes usar las etiquetas de plantilla como siempre, simplemente usando
setup_postdata( $post );y luegowp_reset_postdata()después.
Puedes probar lo siguiente:
function latest_post() {
$args = array(
'posts_per_page' => 1, // Solo necesitamos la última publicación, así que obtenemos solo esa
'cat' => '4' // Usa el ID de la categoría, también puedes usar category_name con el slug de la categoría
);
$str = "";
$posts = get_posts($args);
foreach($posts as $post):
$str = $str."<h2>". apply_filters( 'the_title', $post->post_title) ."</h2>";
$str = $str."<p class='post-content-custom'>". apply_filters( 'the_content', $post->post_content ) ."</p>";
endforeach;
return $str;
}
add_shortcode('latest_post', 'latest_post');
¿Dónde debería agregar este código? Esto todavía no me queda claro...
Ionică Bizău
Necesitas agregarlo en tu plantilla donde necesites mostrar esta publicación. No quiero ser grosero, pero esperamos que al menos conozcas lo básico. :-)
Pieter Goosen
Mira mi edición. Por lo que veo, el tamaño del arreglo es 1 lo cual es lo esperado, sin embargo no entiendo por qué la función no devuelve el resultado esperado. ¿Puedes revisar el código (y tal vez agregar una versión funcional en tu respuesta)? ¡Gracias!
Ionică Bizău
Puedes hacer algo como esto:::
$args = array(
'post_type' => '__post_type__',
'posts_per_page' => 1,
'orderby' => 'date',
'order' => 'ASC'
);
$posts = get_posts($args);
foreach($posts as $post):
echo $post->ID;
echo $post->title;
echo $post->content;
endforeach;
¿Dónde debo agregar esto? ¿En el contenido de la página (editando en modo texto)?
Ionică Bizău
en la plantilla, parte de plantilla o archivo de funciones si estás usando accesos directos
Jorge Y. C. Rodriguez