Mostrar la última entrada de una categoría en una página

9 mar 2015, 10:28:58
Vistas: 36K
Votos: 6

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:

    1. Hola Mundo
    1. Hola Marte
    1. 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.

0
Todas las respuestas a la pregunta 2
4

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 como the_title() o the_content(). Debes usar los filtros apropiados en esas propiedades.

  • title y content son propiedades inválidas de WP_POST. La otra respuesta está completamente equivocada. Las propiedades correctas son post_title y post_content.

  • Puedes usar las etiquetas de plantilla como siempre, simplemente usando setup_postdata( $post ); y luego wp_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');
9 mar 2015 10:52:53
Comentarios

¿Dónde debería agregar este código? Esto todavía no me queda claro...

Ionică Bizău Ionică Bizău
9 mar 2015 10:54:17

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 Pieter Goosen
9 mar 2015 10:59:45

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 Ionică Bizău
11 mar 2015 21:56:07

Por favor, revisa mi actualización

Pieter Goosen Pieter Goosen
12 mar 2015 10:09:12
3
-1

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;
9 mar 2015 10:39:17
Comentarios

¿Dónde debo agregar esto? ¿En el contenido de la página (editando en modo texto)?

Ionică Bizău Ionică Bizău
9 mar 2015 10:44:47

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

Jorge Y. C. Rodriguez Jorge Y. C. Rodriguez
9 mar 2015 10:49:04

¿Puedes editar tu publicación con los pasos completos para integrar esto? No soy el mejor en PHP, pero seguir los pasos debería funcionar.

Ionică Bizău Ionică Bizău
9 mar 2015 10:53:06