web-dev-qa-db-ja.com

投稿を削除するときにコメントが削除されないようにする方法

タイトルが言うように:私は私が私が記事を削除するとき、どのようにWordpressが記事のコメントを削除するのを防ぐことができますか?

私が達成しようとしているのは、私が異なる投稿からのすべてのコメントをposttitleまたは投稿の中の事前定義されたメタキーによってお互いに関連する投稿にマージしたいということです。時々私は時代遅れである記事を削除します、そして私はまだそれらのコメントが削除されていない投稿のために現れることを望みます。

私はすでに自分のfunctions.phpのためのコメント集約コーディングをいくつか持っています。 (コメント投稿IDではなくコメントメタに基づいて結果を取得するには、クエリ部分で少し調整する必要があります)。

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

私がアップグレードしなければならない場合に備えて、コアファイルを編集しないことを好みます(他に可能な方法がない場合は...)

3
jochem

コメントの削除がbefore_delete_postにフックしないようにし、関連するコメントのqueryをフィルタして削除ルーチンがそれらを見つけて削除できないようにします。

PHP 5.3が必要です。

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;
    });
});

これは騒々しい古い学校のバージョンです:

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