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_Post
no 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.title
ycontent
son propiedades inválidas deWP_POST
. La otra respuesta está completamente equivocada. Las propiedades correctas sonpost_title
ypost_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...

Necesitas agregarlo en tu plantilla donde necesites mostrar esta publicación. No quiero ser grosero, pero esperamos que al menos conozcas lo básico. :-)

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!

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

en la plantilla, parte de plantilla o archivo de funciones si estás usando accesos directos
