Wie lösche ich alle Kommentare aus einem bestimmten alten Blog-Beitrag?

7

Ich räume einen alten, kontroversen Blogeintrag auf und muss alle Kommentare aus dem Beitrag entfernen.

Überraschenderweise kann ich in der vorhandenen WordPress (3.0.4) -UI keine Möglichkeit finden, dies zu tun.

Ich kann sicher durchgehen und bei allen über 200 Kommentaren auf "Papierkorb" klicken, aber das scheint ... übertrieben. Gibt es eine andere Möglichkeit, die mir fehlt?

Jeff Atwood
quelle

Antworten:

6

Alternative für Leute, die dies mit Angst vor SQL lesen ............... (oder dies über Google nach Januar 2011 finden):

Warten Sie auf diese Aktion, bis 3.1 veröffentlicht wird, gehen Sie dann zu einem Beitrag, überprüfen Sie alle Kommentare und "Verschieben in den Papierkorb" :) (sie sollte jeden Tag veröffentlicht werden) ( http://wordpress.org/about/roadmap/ )

(oder laden Sie 3.1 RC3 von http://wordpress.org/download/release-archive/ herunter )

Beispiel:

http://edward.de.leau.net/files/bulkremove.png

Edelwasser
quelle
5

Hallo @ Jeff Atwood:

Ich gehe davon aus, dass Sie Zugriff auf MySQL-Abfragen haben. Dies gibt Ihnen alle Kommentare für Ihren Blog-Beitrag, dessen URL-Slug ist 'your-blog-post' (der Slug ist das letzte Segment in der URL Ihres Posts, wenn Sie hübsche Permalinks verwenden, dh für http://example.com/2011/01/foo-bar- baz / deine Schnecke wäre 'foo-bar-baz'):

SELECT * from wp_comments WHERE comment_post_ID IN (
  SELECT ID FROM wp_posts WHERE post_name='your-post-slug'
)

Und dies gibt Ihnen alle Kommentar-Metadaten:

SELECT * from wp_commentmeta WHERE comment_id IN (
  SELECT comment_ID from wp_comments WHERE comment_post_ID IN (
    SELECT ID FROM wp_posts WHERE post_name='your-post-slug'
  )
) 

Führen Sie also diese beiden Befehle aus (aber stellen Sie sicher, dass Sie den Wert post_name so ersetzen, dass er Ihrem entspricht):

DELETE from wp_commentmeta WHERE comment_id IN (
  SELECT comment_ID from wp_comments WHERE comment_post_ID IN (
    SELECT ID FROM wp_posts WHERE post_name='your-post-slug'
  )
);

DELETE from wp_comments WHERE comment_post_ID IN (
  SELECT ID FROM wp_posts WHERE post_name='your-post-slug'
);

PS Dadurch werden sie natürlich vollständig gelöscht. Wenn Sie sie jedoch nicht im Papierkorb behalten möchten, ist dies einfacher, als sie in den Papierkorb zu verschieben.

MikeSchinkel
quelle
5

WordPress unterstützt nicht die Massenverwaltung von Kommentaren auf Post-by-Post-Basis. Obwohl es einen Kommentarverwaltungsabschnitt direkt auf der Bearbeitungsseite des Beitrags gibt. Wie Sie sagten, müssten Sie bei jedem einzelnen Kommentar auf "Papierkorb" klicken:

Alt-Text

Alternativ können Sie eine Sicherungskopie der Tabellen wp_comments und wp_commentmeta erstellen und die folgenden Abfragen ausführen:

  1. Post-ID finden. Nehmen wir an, die relevante ID ist X.

    SELECT ID from wp_posts WHERE post_type='post' AND post_title='Hello world!' INTO @x; 
  2. Fügen Sie relevante Kommentar-Metadaten hinzu, um die Integrität zu gewährleisten:

    INSERT INTO wp_commentmeta (comment_id, meta_key, meta_value) SELECT comment_ID, "wp_trash_meta_time", UNIX_TIMESTAMP() FROM wp_comments WHERE comment_post_ID=@x;
    
    INSERT INTO wp_commentmeta (comment_id, meta_key, meta_value) SELECT comment_ID, "wp_trash_meta_status",comment_approved FROM wp_comments WHERE comment_post_ID=@x;
  3. Alle Kommentare in den Papierkorb werfen:

    UPDATE wp_comments SET comment_approved='trash' WHERE comment_post_ID=@x;
rsman
quelle
ausgezeichnete Antwort - aus Neugier, wie traumatisch ist es, wenn die Kommentar-Metadaten nicht eingefügt werden? Was bricht, wenn überhaupt?
Jeff Atwood
Ich konnte keinen großen Unterschied feststellen, außer dass die verworfenen Kommentare nach den Tagen von EMPTY_TRASH_DAYS nicht gelöscht werden. (wp-includes / default-constants.php). Wenn Sie sie entsorgen, wird ihr Genehmigungsstatus standardmäßig auf "nicht genehmigt" gesetzt.
Rsman
1
Ich gehe davon aus, dass Sie Schritt 3 vor Schritt 2 ausführen sollten, wenn Sie den alten Genehmigungsstatus wirklich beibehalten möchten. Jetzt würden sie trashin Schritt 2 gesetzt, und dann kopieren wir diesen trashStatus in Schritt 3, nicht den vorherigen Status.
Jan Fabry
@ Jan Danke für den Hinweis, entsprechend bearbeitet.
Rsman
0

Heutzutage ist die beste Lösung, wenn Sie WP-CLI auf dem Server installieren können, die Verwendung auf folgende Weise:

$ wp comment delete $(wp comment list --post_id={ID})
ClemC
quelle
-1

Dies reicht nicht aus, Sie müssen auch die Spaltenanzahl aktualisieren, da sie sonst nicht korrekt angezeigt wird. Hier ist ein Beispielcode für eine Installation an mehreren Standorten.

try 
{   
    $rowsUpdated = $wpdb->query(
    "
    UPDATE " . $wpdb->prefix . "COMMENTS SET COMMENT_APPROVED='trash' 
    WHERE comment_post_id = " . $post_id
    );
    if ( $rowsUpdated != 0 ) {
        $wpdb->query( 
            "
            UPDATE " . $wpdb->prefix . "POSTS SET COMMENT_COUNT = COMMENT_COUNT - " .  $rowsUpdated . "
            WHERE ID = " . $post_id
        );
    }
}       
catch (Exception $e) 
{ 
    echo( 'Unexpected error while trying to connect to WP database: ' . $e->getMessage() );
}
Eric Malalel
quelle