web-dev-qa-db-ja.com

特定の投稿で「コメントをページに分割する」および「古い投稿のコメントを閉じる」を無効にし、他の投稿を無効にする方法はありますか?

[設定]> [ディスカッション]には、コメントをページに分割してコメントにページ付けを追加し、それらを別々のページに分割するオプションがあります。

私のウェブサイト全体でこれを無効にしたいのですが…特定の1つの投稿で、その投稿(およびその投稿のみ)にコメントが付けられているように、これを有効にします。

これはできますか?

半関連のフォローアップ:「同じ投稿より古い投稿のコメントを自動的に閉じる」オプションでも同じことができますか。この場合、ポスト149、150、151を除くすべての投稿に対するコメントはX日後にクローズされます。

ご協力ありがとうございます。

2
ioutshine

option_{$option_name}フィルタはその場でオプションの値を変更するために使うことができます。 {$option_name}を変更するオプションの名前に置き換えます。

コメントページ付けオプションの上書き

コメントをページ分割するためのオプション名はpage_commentsなので、option_page_commentsという名前のフィルタを作成します。以下の例では、ページ付けを強制するためにIDの配列内の投稿の1つを調べているかどうかをチェックし、そうであれば、コメントのページ付けを強制します。それ以外の場合は、ダッシュボード>設定>ディスカッション画面の値が使用されます。

// Forces comment pagination for certain posts regardless
// of settings within the Settings > Discussion page.
add_filter( 'option_page_comments', 'wpse_modify_page_comments' );
function wpse_modify_page_comments( $page_comments ) {
    if ( is_admin() ) {
        return $page_comments;
    }

    // Array of post IDs where comment pagination is forced on.
    $force_comment_pagination = [ 
        149,
        150,
        151,
    ];

    if ( in_array( get_the_ID(), $force_comment_pagination ) ) {
        $page_comments = true;
    }

    return $page_comments;
}

古い投稿のクローズコメントを上書きするオプション

フォローアップの質問に答えるには - はい、[ディスカッション]画面の設定で古い投稿のコメントを閉じるように設定されている場合でも、古い投稿に対してコメントを有効にすることができます。

// Forces comments for old posts to be *allowed* regardless
// of settings within the Settings > Discussion page.
add_filter( 'option_close_comments_for_old_posts', 'wpse_modify_close_comments_for_old_posts' );
function wpse_modify_close_comments_for_old_posts( $close_comments_for_old_posts ) {
    // Don't do anything for the admin area. Return the originally set value of the option.
    if ( is_admin() ) {
        return $close_comments_for_old_posts;
    }

    // This array contains the posts IDs where we want to 
    // override the settings for closing comments for old posts.
    // (Comments will be forced open for these posts.)
    $close_comments_for_old_posts_overrides = [ 
        149,
        150,
        151,
    ];

    // Handle case when a comment is being made.
    if ( isset( $_POST['comment'] ) && isset( $_POST['comment_post_ID'] ) ) {
        if ( in_array( $_POST['comment_post_ID'], $close_comments_for_old_posts_overrides ) ) {
            // Comments should be open for this post.
            return false;
        }               
    }

    // Handle case when post is displayed.
    global $wp_query;
    if ( ! is_array( $wp_query->posts ) ) {
        // There are no posts to display. Don't change the option.
        return $close_comments_for_old_posts;
    }
    foreach ( $wp_query->posts as $post ) {
        if ( in_array( $post->ID, $close_comments_for_old_posts_overrides ) ) {
            // Comments should be open for this post.
            return false;
        }
    }

    // If we get here, return the original value of the option without altering it.
    return $close_comments_for_old_posts;
}
4
Dave Romsey