TransWikia.com

Set post comments open function

WordPress Development Asked on February 17, 2021

I’ve been searching high and low for a php function to set a comments of a given postID open

only found function to check what the comment status is

<?php comments_open( $post_id ); ?>

I need one to set comment would expect it to be

<?php set_comments_open( $post_id ); ?>

But it isnt anybody got any idea what the function is or if there isnt one how to do it?

3 Answers

Have you tried go to Posts and checked the box next to the title and in the dropdown "Bulk Actions" choose Edit and then apply, Comments and in the dropdown "Allow".

And also have added the screen in the post edit area on the tab in the header called "Screen Options" and checked the field called: Discussion?

And in Settings->Discussion have you enabled "Allow people to post comments on new articles"?

Add comments open to all posts

A filter hook called by the wp_insert_post function prior to inserting into or updating the database and update the post comment_status to open = true

function comments_on( $data ) {
    if( $data['post_type'] == 'post' ) {
        $data['comment_status'] = 1;
    }

    return $data;
}
add_filter( 'wp_insert_post_data', 'comments_on' );

Correct answer by Pontus Abrahamsson on February 17, 2021

If you need to allow comments on a post that have already had them disabled, you will need to change the column for comment_status of that post to open.

As JBoss has shown, you can do this through a wpdb statement, however you can also just make use of the native WordPress post updating function: wp_insert_post

function reopen_comments_of_post($post_id) {
    if(comments_open($post_id)) {return;} //return if comments are already open
    
    //arguments
    $post = array(
        'ID'            => $post_id,
        'comment_status'=> 'open',
        'post_title'    => get_the_title($post_id), //content must be added as per specs
        'post_content'  => get_the_content($post_id), //title must be added as per specs
    );

    //update post
    wp_insert_post($post);
}

If you need to loop through all of your posts to do this you can make use of a normal WP_Query to do it like this:

add_action('wp', 'loop_through_all_posts_and_open_comments');
function loop_through_all_posts_and_open_comments() {
    //arguments for posts
    $args = array(
        'post_type'     => 'my_custom_post_type', //can be post / product / etc
        'posts_per_page'=> -1, //all posts
    );

    //create loop
    $query = new WP_Query($args);
    if($query->have_posts()) { //check query has returned posts
        while($query->have_posts()) { //loop through posts
            $query->the_post(); //load post
            reopen_comments_of_post($query->post->ID); //fix comment status
        }
    }
    wp_reset_postdata(); //clear post object data
}

Answered by Frits on February 17, 2021

Came upon this one today. I don't think the accepted answer here actually gets at what the OP is asking. He's not having trouble with setting up a post to accept comments in the admin panel. He's asking for a PHP function that can set a post's 'comment_status' column.

I had a similar reason for looking: I'm updating content based on an import, so the answer here doesn't help. The answer in the comments gives a way to do this when INSERTING a post, but not a good way to update. And I don't see a WP function that exists to do this - had to write one:

function set_post_comment_status( $post_id, $status = 'open' ){
    global $wpdb;
    $wpdb->update( $wpdb->prefix . 'posts', [ 'comment_status' => $status ], [ 'ID' => $post_id ] );
}

Seems like something that should exist. Hopefully that helps someone.

Answered by JBoss on February 17, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP