2009-03-30 10 views
4

Ich möchte Wordpress Posts nach dem letzten Kommentar bestellen. Soweit ich weiß, ist dies mit dem WP_Query-Objekt nicht möglich und würde eine benutzerdefinierte $ wpdb-Abfrage erfordern, die ich einfach schreiben kann. Ich weiß dann jedoch nicht, wie ich die Schleife einrichten soll, um von diesem Objekt abzurennen.Wordpress Posts nach dem letzten Kommentar bestellen

Kann jemand helfen?

Antwort

3

OK Jungs,

Viele gute Antworten hier, aber offensichtlich hat sich niemand die Zeit genommen, sie zu testen.

Hao Lian bekommt den Kredit für die erste beste ursprüngliche Antwort, aber leider zeigt sein Code keine Beiträge ohne Kommentare.

Captain Keytar ist auf dem richtigen Weg, aber sein Code wird jeden einzelnen Post und Anhang als separates Ergebnis anzeigen. Hier

ist eine modifizierte Version von Kapitän Keytar aber es begrenzt die Ergebnisse auf den Typ ‚post‘ .., die veröffentlicht wurde (zur Vermeidung von Zugluft bekommen !!)

select wp_posts.*, 
    coalesce(
     (
      select max(comment_date) 
      from $wpdb->comments wpc 
      where wpc.comment_post_id = wp_posts.id 
     ), 
     wp_posts.post_date 
    ) as mcomment_date 
    from $wpdb->posts wp_posts 
    where post_type = 'post' 
    and post_status = 'publish' 
    order by mcomment_date desc 
    limit 10 
+0

gab dies nur ein Schuss auf 3.9.1 und es funktioniert wie ein Charme. Vielen Dank! – CodeMoose

+0

Wie können Sie dies auf eine (oder mehrere) bestimmte Kategorien beschränken? – sanchy

7

Assign

select wp_posts.*, max(comment_date) as max_comment_date 
from $wpdb->posts wp_posts 
right join $wpdb->comments 
on id = comment_post_id 
group by ID 
order by max_comment_date desc 
limit 10 

bis zu einem gewissen Variable $ query. Sie können mit der 10 oder der Abfrage selbst herumspielen. (Ich bin keine SQL-Optimierung Ninja.) Dann wird Ihr Code wird so aussehen wie

<?php 
    $results = $wpdb->get_results($query) or die('!'); 
    foreach ($results as $result): 
?> 
[insert template here] 
<?php endforeach ?> 

Dieses Muster in mehr Tiefe by the Codex bedeckt ist.

2

Als Nachtrag zu Hao Lian Antwort, wenn Sie die folgende Abfrage verwenden:

select wp_posts.*, 
coalesce(
    (
     select max(comment_date) 
     from $wpdb->comments wpc 
     where wpc.comment_post_id = wp_posts.id 
    ), 
    wp_posts.post_date 
) as mcomment_date 
from $wpdb->posts wp_posts 
order by mcomment_date desc 
limit 10 

Mischt in Beiträgen, die Kommentare noch nicht haben, und sortiert sie nach post_date und max (comment_date).

0

Ich denke, dass das Hinzufügen der Max-Funktion Ihre Ergebnisse vermasseln wird. MySQL wird nicht das Maximum aus jedem ziehen. Es wird das Maximum aus dem ganzen Set ziehen. Dies ist die Abfrage, die Sie Ihre Ergebnisse werden erhalten:

select wp_posts.*, comment_date 
from $wpdb->posts wp_posts 
right join $wpdb->comments 
on id = comment_post_id 
group by ID 
order by comment_date desc 
limit 10 

Danach, wenn Sie WP Konvention folgen wollen, verwenden Sie diese, und dann können Sie die Funktionen nutzen, die die meisten Ihrer Vorlagen verwenden (basierend auf die Schleife):

$results = $wpdb->get_results($query) or die('!'); 
    foreach ($results as $post): 
    setup_postdata($post); 
1

-Code von Hao Lian vorgeschlagen arbeitet perfekt mit Ausnahme der Tatsache, dass wir die folgenden WHERE-Klausel mit comment_count = 0, diese Situation durch Spam-Kommentare POST ziehen zu vermeiden, sollten hinzufügen, verursacht wird.

Die WHERE-Klausel ist wie folgt hinzuzufügen:

WHERE comment_approved = '1' AND comment_type = '' AND post_password = '' 

kompletten Code nach der Where-Klausel hinzugefügt wie folgt aussehen shoud:

select wp_posts.*, max(comment_date) as comment_date 
from wp_posts 
right join wp_comments on id = comment_post_id 
WHERE comment_approved = '1' AND comment_type = '' AND post_password = '' 
group by ID  
order by comment_date desc 
limit 6 
3

habe ich einen einfacheren, Teil eines nativen WP in Funktion.hoffe es hilft und man kann sich weiter entwickeln. Hier ist eine vereinfachte Version, die den Titel & Auszug des Beitrags zusammen mit dem Kommentar Inhalt & Autor aus den neuesten kommentierten Beiträge mit get_comments zeigt.

$args = array(
     'status' => 'approve', 
     'number' => 6, 
     'order' => 'DESC' 
    ); 
    $comments = get_comments($args); 

    foreach($comments as $comment) : $count++; 

      $post_args = array(
       'post_type' => 'post', 
       'p' => $comment->comment_post_ID, 
       'posts_per_page' => 1 
       ); 

      $posts = get_posts($post_args); 

      foreach($posts as $post) : setup_postdata($post); 

       the_title(); 
       the_excerpt(); 

      endforeach; 

     echo $comment->comment_content;  
     echo $comment->comment_author; 

    endforeach; 
+1

Das mache ich auch. Funktioniert jedoch nur, wenn Sie die Beiträge wiederholen können. Nehmen wir an, 2 der Kommentare befinden sich im selben Post, der Post würde im Foreach wiederholt. – sanchy

2

Dies ist eine alte Frage, aber ich hatte das gleiche Problem und fand einen viel sauberen Weg, dies zu tun, so dass ich es hier bei Buchung es hilft niemanden.

Wenn Sie den Filter posts_clauses verwenden, können Sie nur die Hauptabfrage ändern und trotzdem die Schleife und alle normalen Schleifenfunktionen verwenden.

Beachten Sie, dass ich die sql leicht für meine eigenen Zwecke geändert habe, aber das allgemeine Konzept ist das gleiche.

+0

Wie würde man nach dem Hinzufügen von 'post_cluses' weiter mit 'loop functions' arbeiten? Danke für das Posten. – sanchy

+0

@sanchy, du musst nach posts_clauses nichts anderes machen. Alle Funktionen funktionieren genauso wie zuvor, z. get_the_ID(), etc. – manishie

+0

so wird dies Auswirkungen auf alle meine Abfragen? oder wie wähle ich, welche Abfragen betroffen sind und welche nicht? – sanchy

0

Erhalten Sie 3 neueste Kommentare für benutzerdefinierte Post-Typ 'Frage' unabhängig von approvement:

global $wpdb; 

$results = $wpdb->get_results(
    " 
    SELECT wp_posts.ID, MAX(comment_date) AS max_comment_date 
    FROM wp_posts 
    RIGHT JOIN wp_comments 
    ON id = comment_post_id 
    WHERE wp_posts.post_type = 'question' 
    AND wp_posts.post_status = 'publish' 
    GROUP BY ID 
    ORDER BY max_comment_date DESC 
    LIMIT 3 
    " 
); 

foreach ($results as $result) { 
    $posts_arr[] = $result->ID; 
} 

$args = array(
    'post_type' => 'question', 
    'post__in' => $posts_arr, 
    'orderby' => 'post__in', 
); 

$the_query = new WP_Query($args); 
0

Dies kann durch die Kombination von WP_Comment_Query mit WP_Query erfolgen, wie folgt aus:

// For performance, limit the number of queried comments, 
// but make it be something big enough to account for "duplicate" posts. 

$comments_query = new WP_Comment_Query; 
$comments = $comments_query->query(array( 'number' => '100' )); 

if ($comments) { 
    foreach ($comments as $comment) { 

// You'll want to convert the dates from string to integer so you can sort them out later 
$comment_utf = strtotime($comment->comment_date); 

// Build an array of post IDs with the date of the last published comment 
$latest_comments[$comment->comment_post_ID] = $comment_utf; 
    }} 

// Sort the array by date 
arsort($latest_comments); foreach ($latest_comments as $key => $value) { $posts_ordered[] = $key; } 

// The nice thing is that WP_Query will remove duplicates by default 
$args = array ('posts_per_page'   => '10', 'post__in' => $posts_ordered, 'orderby' => 'post__in'); 
$query = new WP_Query($args); 
if ($query->have_posts()) { 
    while ($query->have_posts()) { 
     $query->the_post(); 

// Do your stuff (add the template or whatever) 

// If you want to add the comment itself, use this: 
$comments = get_comments(array('number' => '1', 'post_id' => $post->ID)); 
foreach($comments as $comment) : 
    echo $comment->comment_content; 
endforeach; 

// That's about it 
    }} 
wp_reset_postdata(); 
Verwandte Themen