web-dev-qa-db-fra.com

Existe-t-il un moyen de remplacer "insérer des commentaires dans des pages" et "fermer des commentaires pour d'anciennes publications" dans certaines publications, mais pas dans d'autres?

Dans Paramètres> Discussion, une option permet de "diviser les commentaires en pages", ce qui ajoute une pagination aux commentaires et les divise en plusieurs pages.

Je souhaite désactiver cette option sur l'ensemble de mon site Web ... MAIS, sur un message spécifique, je souhaite l'activer afin que ce message (et uniquement ce message) ait des commentaires paginés.

Cela peut-il être fait?

Suivi semi-lié: Ce même type de chose pourrait-il être fait avec l'option "fermer automatiquement les commentaires sur les posts plus anciens que"? Dans ce cas, les commentaires sur tous les articles sont fermés au bout de X jours, à l'exception des articles 149, 150 et 151?

Merci d'avance pour votre aide.

2
ioutshine

Le filtre option_{$option_name} peut être utilisé pour modifier la valeur d'une option à la volée. Remplacez {$option_name} par le nom de l'option à modifier.

Ignorer l'option de pagination de commentaire

Le nom de l'option pour la pagination des commentaires est page_comments, nous allons donc créer un filtre appelé option_page_comments. Dans l'exemple ci-dessous, nous vérifions si nous examinons l'un des messages de notre tableau d'ID pour forcer la pagination, et si c'est le cas, nous appliquons la pagination des commentaires. Sinon, la valeur de l'écran Tableau de bord> Paramètres> Discussion est utilisée.

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

Ignorer les commentaires de fermeture pour les anciens messages

Pour répondre à votre question de suivi - Oui, nous pouvons forcer l’activation des commentaires pour certaines publications plus anciennes, même si les paramètres de l’écran de discussion sont configurés pour fermer les commentaires des anciennes.

// 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