¿Por qué alguien querría comentar en posts programados para su publicación futura? No lo sé, imagino que para tener algo de falsa interacción futura en el post, jeje. Los posts futuros o programados pueden tener activados los comentarios pero solo se puede comentar en ellos una vez que pasan a estado «publicado», es decir, a partir de la fecha de publicación programada. De hecho, en el backend ni siquiera aparece el campo para comentar en la pantalla de edición del post hasta esa fecha.
En el frontend el formulario para comentar si aparece pero si se intenta comentar llegamos a una pantalla completamente blanca y el comentario no es insertado ya que WordPress trata a estos posts como si estuvieran en estado de borrador en lo que ha comentarios se refiere. Esto se puede comprobar en el archivo wp-comments-posts.php
, script que se encarga de la inserción de comentarios en el frontend. En WP 4.1.1, a partir de la línea 61 de este script se puede ver este condicional:
} 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;
}
Cómo un post programado no es público ni es privado, se verificará este condicional, el mismo que verifican los posts en estado de borrador. Pero hay una posibilidad. Si te fijas, se define un evento (action) en ese condicional, así que podemos definir una función para este evento e insertar el comentario. Lo más rápido sería simplemente copiar el código de inserción de comentarios del propio archivo wp-comments-post.php
. Nos quedaría algo así:
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( __( 'ERROR: please fill the required fields (name, email).' ), 200 );
} else if ( ! is_email( $comment_author_email ) ) {
wp_die( __( 'ERROR: please enter a valid email address.' ), 200 );
}
}
if ( '' == $comment_content ) {
wp_die( __( 'ERROR: 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( __( "ERROR: 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;
});
Además, podríamos incluir la verificación específica del estado «futuro» (future
) del post ya que este action hook también se ejecutaría para el estado de borrador (draft
):
add_action( 'comment_on_draft', function( $comment_post_ID ) {
if( get_post_status( $comment_post_ID ) != 'future' ) {
exit;
}
//Rest of the code
});
Ahora, los usuarios que tengan acceso a la previsualización del post programado podrán comentar desde el frontend. Estos usuarios suelen ser los administradores, editores y el propio autor del post.
Así también lo he respondido en esta pregunta de WPSE: Comments on future posts.
Permitir comentarios en posts futuros (programados) WordPress
¿Por qué alguien querría comentar en posts programados para su publicación futura? No lo sé, imagino que para tener algo de falsa interacción futura en el post, jeje. Los posts futuros o programados pueden tener activados los comentarios pero solo se puede comentar en ellos una vez que pasan a estado «publicado», es decir, a partir de la fecha de publicación programada. De hecho, en el backend ni siquiera aparece el campo para comentar en la pantalla de edición del post hasta esa fecha.
En el frontend el formulario para comentar si aparece pero si se intenta comentar llegamos a una pantalla completamente blanca y el comentario no es insertado ya que WordPress trata a estos posts como si estuvieran en estado de borrador en lo que ha comentarios se refiere. Esto se puede comprobar en el archivo
wp-comments-posts.php
, script que se encarga de la inserción de comentarios en el frontend. En WP 4.1.1, a partir de la línea 61 de este script se puede ver este condicional:Cómo un post programado no es público ni es privado, se verificará este condicional, el mismo que verifican los posts en estado de borrador. Pero hay una posibilidad. Si te fijas, se define un evento (action) en ese condicional, así que podemos definir una función para este evento e insertar el comentario. Lo más rápido sería simplemente copiar el código de inserción de comentarios del propio archivo
wp-comments-post.php
. Nos quedaría algo así:Además, podríamos incluir la verificación específica del estado «futuro» (
future
) del post ya que este action hook también se ejecutaría para el estado de borrador (draft
):Ahora, los usuarios que tengan acceso a la previsualización del post programado podrán comentar desde el frontend. Estos usuarios suelen ser los administradores, editores y el propio autor del post.
Así también lo he respondido en esta pregunta de WPSE: Comments on future posts.