Afișează ultima postare dintr-o categorie într-o pagină

9 mar. 2015, 10:28:58
Vizualizări: 36K
Voturi: 6

Vreau să afișez într-o pagină conținutul ultimei postări dintr-o categorie.

De exemplu, categoria foo are următoarele postări:

    1. Hello World
    1. Hello Mars
    1. Foo bar

Considerând că Foo Bar este cel mai recent articol din categoria foo, conținutul său ar trebui să fie afișat într-o pagină:

<title>
<content>

Unde <title> este Foo bar și <content> este conținutul postării.

Cum pot face acest lucru?


Am dificultăți în implementarea răspunsului lui @Pieter. Am adăugat aceste linii în functions.php:

function latest_post() {  
    $args = array(
       'posts_per_page' => 1, // avem nevoie doar de ultima postare, deci obținem doar acea postare
       'cat' => '4' // Folosește ID-ul categoriei, poate fi înlocuit și cu category_name care folosește slug-ul categoriei
    );

    $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');

În pagină folosesc:

[latest_post]

Cu toate acestea, nu apare nicio eroare, dar nici conținutul postării nu este afișat.

0
Toate răspunsurile la întrebare 2
4

Puteți utiliza WP_Query pentru a obține ultimul post dintr-o categorie și a-l afișa. Consultați parametrii pentru categorii. În mod implicit, WP_Query folosește post ca tip de post și sortează postările după dată, așa că putem exclude aceste detalii din interogare. Dacă aveți nevoie de altceva, puteți defini argumentele dorite.

Puteți încerca ceva de genul:

$args = array(
    'posts_per_page' => 1, // avem nevoie doar de ultimul post
    'cat' => 'ID-UL CATEGORIEI', // Folosiți ID-ul categoriei, sau puteți înlocui cu category_name care folosește slug-ul categoriei
    //'category_name' => 'SLUG-UL CATEGORIEI FOO',
);
$q = new WP_Query( $args);

if ( $q->have_posts() ) {
    while ( $q->have_posts() ) {
    $q->the_post();        
        //Tag-urile și markup-ul template-ului, de exemplu:
        the_title();
    }
    wp_reset_postdata();
}

Aceasta este o bază pe care o puteți modifica și personaliza după nevoile dumneavoastră. Dacă nu sunteți sigur de parametri sau utilizare, consultați pagina Codex pentru WP_Query pentru ajutor.

EDITARE

Nu sunt sigur de ce ați decis să reinventați roata și să folosiți get_posts când v-am arătat un exemplu funcțional de utilizare a WP_Query. Folosirea get_posts împreună cu proprietățile WP_Post este complet greșită.

  • Proprietățile WP_Post sunt nefiltrate, așa că rezultatul va fi complet nefiltrat și nu va arăta la fel ca output-ul din tag-urile de template precum the_title() sau the_content(). Trebuie să folosiți filtrele corespunzătoare pentru aceste proprietăți.

  • title și content sunt proprietăți invalide ale WP_POST. Celălalt răspuns este complet greșit. Proprietățile corecte sunt post_title și post_content.

  • Puteți folosi tag-urile de template în mod normal folosind setup_postdata( $post ); și apoi wp_reset_postdata() după aceea.

Puteți încerca următoarele:

function latest_post() {  
    $args = array(
       'posts_per_page' => 1, // avem nevoie doar de ultimul post
       'cat' => '4' // Folosiți ID-ul categoriei, sau puteți înlocui cu category_name care folosește slug-ul categoriei
    );

    $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
Comentarii

Unde ar trebui să adaug acest cod? Încă nu este clar pentru mine...

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

Trebuie să-l adaugi în template-ul tău acolo unde ai nevoie să afișezi acest articol. Nu vreau să fiu nepoliticos, dar ne așteptăm să cunoști măcar elementele de bază. :-)

Pieter Goosen Pieter Goosen
9 mar. 2015 10:59:45

Vezi ediția mea. Din câte văd, dimensiunea array-ului este 1, ceea ce e de așteptat, dar nu înțeleg de ce funcția nu returnează rezultatul așteptat. Poți verifica codul (și poate adăuga o versiune funcțională în răspunsul tău)? Mulțumesc!

Ionică Bizău Ionică Bizău
11 mar. 2015 21:56:07

Te rog să vezi actualizarea mea

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

Puteți face ceva de genul acesta:::

 $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
Comentarii

Unde ar trebui să adaug asta? În conținutul paginii (editând în modul text)?

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

în template, partea de template sau fișierul functions.php dacă folosești scurtături

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

Poți să editezi postarea ta cu pașii compleți pentru integrarea asta? Nu sunt cel mai bun în PHP, dar urmând pașii ar trebui să funcționeze.

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