web-dev-qa-db-fra.com

Comment empêcher la suppression de commentaires lors de la suppression d'un article

Comme le titre le dit: Comment puis-je empêcher Wordpress de supprimer des commentaires de publication lorsque je supprime une publication?

Ce que j'essaie d'accomplir, c'est que je veuille fusionner tous les commentaires de différents articles en articles relatifs les uns aux autres par posttitle ou par une clé méta prédéfinie dans l'article. Parfois, je supprime un message qui est absolete et je veux toujours que ces commentaires apparaissent pour les messages non supprimés.

J'ai déjà une partie du codage d'agrégats de commentaires pour mon functions.php. (Il reste à ajuster un peu la partie requête pour obtenir des résultats basés sur la méta de commentaire au lieu de l'identifiant de commentaire).

function multiple_comment_post_id_query_filter( $query )
{
    //todo:
    //get postid's from comments where a certain meta value is set. Database table wp_commentmeta
    //the meta value is extracted from the post meta value with the same id
    //when someone adds a comment, the comment meta will be included
    //put the captured post id's into an array with variable $post_ids 
    $post_ids = array ( 1, 2, 3, 4 );
    if ( FALSE === strpos( $query, 'comment_post_ID = ' ) )
    {
        return $query; // not the query we want to filter
    }

    remove_filter( 'query', 'multiple_comment_post_id_query_filter' );

    $replacement = 'comment_post_ID IN(' . implode( ',', $post_ids ) . ')';
    return preg_replace( '~comment_post_ID = \d+~', $replacement, $query );
}
add_filter( 'query', 'multiple_comment_post_id_query_filter' );

Je préfère ne pas modifier les fichiers de base au cas où je devrais effectuer une mise à niveau (s'il n'y a pas d'autre moyen possible de le faire ...)

3
jochem

Pour empêcher la suppression de commentaires, raccordez-le dans before_delete_post et filtrez la query pour les commentaires associés afin que la routine de suppression ne puisse pas les rechercher et les supprimer.

PHP 5.3 requis:

add_action( 'before_delete_post', function( $post_id ) {
    add_filter( 'query', function( $query ) use ( $post_id ) {
        $find = 'WHERE comment_parent = ';
        FALSE !== strpos( $query, $find . $post_id )
            and $query = str_replace( $find . $post_id, $find . '-1', $query );

        return $query;
    });
});

Voici une version bruyante de la vieille école:

add_action(
    'before_delete_post',
    array ( 'T5_Prevent_Comment_Deletion', 'start' )
);

class T5_Prevent_Comment_Deletion
{
    protected static $post_id = 0;

    public static function start( $post_id )
    {
        self::$post_id = $post_id;
        add_filter( 'query', array ( __CLASS__, 'hide_comments' ) );
    }

    public function hide_comments( $query )
    {
        $find = 'WHERE comment_parent = ' . self::$post_id;

        if ( FALSE !== strpos( $query, $find ) )
        {
            $query = str_replace( $find, 'WHERE comment_parent = -1', $query );
            remove_filter( 'query', array ( __CLASS__, 'hide_comments' ) );
        }

        return $query;
    }
}
3
fuxia