Question

I have enabled future (scheduled) posts to display as single post so on that page comments are enabled but there is a problem when i try to post comment. I get a blank screen without any warning or error displayed?

I suppose that there is a problem when commenting on posts that are not yet published. Is there a way to enable commenting on future posts?

Was it helpful?

Solution

You can not enable comments in future posts. Those posts are not public and are not private, so they verify the conditional in line 61 of wp-comments-post.php file; that conditional is (WP 4.1.1):

} elseif ( ! $status_obj->public && ! $status_obj->private ) {
    /**
     * Fires when a comment is attempted on a post in draft mode.
     *
     * @since 1.5.1
     *
     * @param int $comment_post_ID Post ID.
     */
    do_action( 'comment_on_draft', $comment_post_ID );
    exit;
}

To allow comments in scheduled posts you could hook in comment_on_draft action and copy the insert comment code from wp-comments-post.php inside the callback function.

add_action( 'comment_on_draft', function( $comment_post_ID ) {

    do_action( 'pre_comment_on_post', $comment_post_ID );

    $comment_author       = ( isset($_POST['author']) )  ? trim(strip_tags($_POST['author'])) : null;
    $comment_author_email = ( isset($_POST['email']) )   ? trim($_POST['email']) : null;
    $comment_author_url   = ( isset($_POST['url']) )     ? trim($_POST['url']) : null;
    $comment_content      = ( isset($_POST['comment']) ) ? trim($_POST['comment']) : null;

    // If the user is logged in
    $user = wp_get_current_user();
    if ( $user->exists() ) {
        if ( empty( $user->display_name ) )
            $user->display_name=$user->user_login;
        $comment_author       = wp_slash( $user->display_name );
        $comment_author_email = wp_slash( $user->user_email );
        $comment_author_url   = wp_slash( $user->user_url );
        if ( current_user_can( 'unfiltered_html' ) ) {
            if ( ! isset( $_POST['_wp_unfiltered_html_comment'] )
        || ! wp_verify_nonce( $_POST['_wp_unfiltered_html_comment'], 'unfiltered-html-comment_' . $comment_post_ID )
            ) {
                kses_remove_filters(); // start with a clean slate
                kses_init_filters(); // set up the filters
            }
        }
    } else {
        if ( get_option( 'comment_registration' ) || 'private' == $status ) {
            wp_die( __( 'Sorry, you must be logged in to post a comment.' ), 403 );
        }
    }

    $comment_type = '';

    if ( get_option('require_name_email') && !$user->exists() ) {
        if ( 6 > strlen( $comment_author_email ) || '' == $comment_author ) {
            wp_die( __( '<strong>ERROR</strong>: please fill the required fields (name, email).' ), 200 );
        } else if ( ! is_email( $comment_author_email ) ) {
            wp_die( __( '<strong>ERROR</strong>: please enter a valid email address.' ), 200 );
        }
    }

    if ( '' == $comment_content ) {
        wp_die( __( '<strong>ERROR</strong>: please type a comment.' ), 200 );
    }

    $comment_parent = isset($_POST['comment_parent']) ? absint($_POST['comment_parent']) : 0;

    $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID');

    $comment_id = wp_new_comment( $commentdata );
    if ( ! $comment_id ) {
        wp_die( __( "<strong>ERROR</strong>: The comment could not be saved. Please try again later." ) );
    }

    $comment = get_comment( $comment_id );

    /**
    * Perform other actions when comment cookies are set.
    *
    * @since 3.4.0
    *
    * @param object $comment Comment object.
    * @param WP_User $user   User object. The user may not exist.
    */
    do_action( 'set_comment_cookies', $comment, $user );

    $location = empty($_POST['redirect_to']) ? get_comment_link($comment_id) : $_POST['redirect_to'] . '#comment-' . $comment_id;

    /**
    * Filter the location URI to send the commenter after posting.
    *
    * @since 2.0.5
    *
    * @param string $location The 'redirect_to' URI sent via $_POST.
    * @param object $comment  Comment object.
    */
    $location = apply_filters( 'comment_post_redirect', $location, $comment );

    wp_safe_redirect( $location );
    exit;

});

Additionally, we could check for "future" status to exclude "draft" posts, but in this case we can end up with conflicts with other plugins that use comment_on_draft action hook:

add_action( 'comment_on_draft', function( $comment_post_ID ) {

    if( get_post_status( $comment_post_ID ) != 'future' ) {
        exit;
    }

    //Rest of the code

});
Licensed under: CC-BY-SA with attribution
Not affiliated with wordpress.stackexchange
scroll top