web-dev-qa-db-fra.com

WP 4.4.1 autoriser les commentaires vides via add_action 'pre_comment_on_post'

vous avez une question sur l'autorisation de commentaires vides avec worpdress v.4.4.1

pour ce faire, j'utilise l'action 'pre_comment_on_post'. dans WP 4.3.1, je pourrais le faire facilement:

if (isset($_POST['comment']) && $_POST['comment'] == "") {

                    $_POST['comment'] = "dummy content";
}

le contenu factice sera filtré ultérieurement via un autre appel add_filter ... dans wp 4.3.1 dans wp-comments-post.php est la ligne de code suivante:

$comment_content      = ( isset($_POST['comment']) ) ? trim($_POST['comment']) : null;

donc mon add_action fonctionne parfaitement;)

maintenant avec wp 4.4.1, les développeurs principaux ont changé le code et introduit une nouvelle fonction avec 4.4.0 dans /wp-includes/comment.php à la ligne 2627

function wp_handle_comment_submission( $comment_data ) {


$comment_post_ID = $comment_parent = 0;
$comment_author = $comment_author_email = $comment_author_url = $comment_content = $_wp_unfiltered_html_comment = null;

if ( isset( $comment_data['comment_post_ID'] ) ) {
    $comment_post_ID = (int) $comment_data['comment_post_ID'];
}
if ( isset( $comment_data['author'] ) && is_string( $comment_data['author'] ) ) {
    $comment_author = trim( strip_tags( $comment_data['author'] ) );
}
if ( isset( $comment_data['email'] ) && is_string( $comment_data['email'] ) ) {
    $comment_author_email = trim( $comment_data['email'] );
}
if ( isset( $comment_data['url'] ) && is_string( $comment_data['url'] ) ) {
    $comment_author_url = trim( $comment_data['url'] );
}
if ( isset( $comment_data['comment'] ) && is_string( $comment_data['comment'] ) ) {
    $comment_content = trim( $comment_data['comment'] );

}
if ( isset( $comment_data['comment_parent'] ) ) {
    $comment_parent = absint( $comment_data['comment_parent'] );
}
if ( isset( $comment_data['_wp_unfiltered_html_comment'] ) && is_string( $comment_data['_wp_unfiltered_html_comment'] ) ) {
    $_wp_unfiltered_html_comment = trim( $comment_data['_wp_unfiltered_html_comment'] );
}

$post = get_post( $comment_post_ID );

if ( empty( $post->comment_status ) ) {

    /**
     * Fires when a comment is attempted on a post that does not exist.
     *
     * @since 1.5.0
     *
     * @param int $comment_post_ID Post ID.
     */
    do_action( 'comment_id_not_found', $comment_post_ID );

    return new WP_Error( 'comment_id_not_found' );

}

// get_post_status() will get the parent status for attachments.
$status = get_post_status( $post );

if ( ( 'private' == $status ) && ! current_user_can( 'read_post', $comment_post_ID ) ) {
    return new WP_Error( 'comment_id_not_found' );
}

$status_obj = get_post_status_object( $status );

if ( ! comments_open( $comment_post_ID ) ) {

    /**
     * Fires when a comment is attempted on a post that has comments closed.
     *
     * @since 1.5.0
     *
     * @param int $comment_post_ID Post ID.
     */
    do_action( 'comment_closed', $comment_post_ID );

    return new WP_Error( 'comment_closed', __( 'Sorry, comments are closed for this item.' ), 403 );

} elseif ( 'trash' == $status ) {

    /**
     * Fires when a comment is attempted on a trashed post.
     *
     * @since 2.9.0
     *
     * @param int $comment_post_ID Post ID.
     */
    do_action( 'comment_on_trash', $comment_post_ID );

    return new WP_Error( 'comment_on_trash' );

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

    return new WP_Error( 'comment_on_draft' );

} elseif ( post_password_required( $comment_post_ID ) ) {

    /**
     * Fires when a comment is attempted on a password-protected post.
     *
     * @since 2.9.0
     *
     * @param int $comment_post_ID Post ID.
     */
    do_action( 'comment_on_password_protected', $comment_post_ID );

    return new WP_Error( 'comment_on_password_protected' );

} else {

    /**
     * Fires before a comment is posted.
     *
     * @since 2.8.0
     *
     * @param int $comment_post_ID Post ID.
     */
    do_action( 'pre_comment_on_post', $comment_post_ID );

}



// 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       = $user->display_name;
    $comment_author_email = $user->user_email;
    $comment_author_url   = $user->user_url;
    $user_ID              = $user->ID;
    if ( current_user_can( 'unfiltered_html' ) ) {
        if ( ! isset( $comment_data['_wp_unfiltered_html_comment'] )
            || ! wp_verify_nonce( $comment_data['_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' ) ) {
        return new WP_Error( 'not_logged_in', __( '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 ) {
        return new WP_Error( 'require_name_email', __( '<strong>ERROR</strong>: please fill the required fields (name, email).' ), 200 );
    } elseif ( ! is_email( $comment_author_email ) ) {
        return new WP_Error( 'require_valid_email', __( '<strong>ERROR</strong>: please enter a valid email address.' ), 200 );
    }
}

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

$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( wp_slash( $commentdata ) );
if ( ! $comment_id ) {
    return new WP_Error( 'comment_save_error', __( '<strong>ERROR</strong>: The comment could not be saved. Please try again later.' ), 500 );
}

return get_comment( $comment_id );

}

et le superglobal $ _POST est passé à la fonction dans wp-comments-post.php

$comment = wp_handle_comment_submission( wp_unslash( $_POST ) );

dans wp 4.4.1, assigner une valeur à $ _POST ['comment'] n'a donc aucun effet, car dans la nouvelle fonction, ils mappent $ _POST ['comment'] à $ comment_content

donc je pensais simplement à rendre $ comment_content global dans ma fonction add_action:

    function action_pre_comment_on_post($comment_post_ID) {

    global $comment_content;


                if (isset($_POST['comment']) && $_POST['comment'] == "") {

                    $comment_content = "dummy comment";

                return;

            }

}   

mais cela ne fonctionne malheureusement pas :( comme $ comment_content n'est pas déclaré dans une portée globale; (

si je modifie le code principal et définit le $ commentaire_content dans une portée globale:

function wp_handle_comment_submission( $comment_data ) {

global $comment_content;

ma fonction add_action peut maintenant passer une valeur au $ comment_content et tout fonctionne correctement. mais vous ne devriez jamais modifier le code principal! dois-je déclarer le $ comment_content global dans functions.php ou via un add_action 'init'? ou???

alors ... comment réglerais-tu le mieux cette affaire?

toute aide est appréciée;)

merci et tous les meilleurs becki

2
Becki Beckmann

)

tout d’abord, merci beaucoup à @swisspidy et à la suggestion de modifier $ _POST sur le hook init.

mais après avoir réfléchi un peu plus et examiné le code, j'ai adopté une approche différente.

au lieu de corriger les choses après, après la soumission du formulaire, j'ai décidé de réparer les choses via jQuery lors de la soumission du formulaire et de faire les vérifications nécessaires sur le champ de saisie de commentaire.

comme je le fais déjà la validation de formulaire via le plugin de validation jquery:

http://jqueryvalidation.org/

et il fournit un gestionnaire de soumission personnalisé

http://jqueryvalidation.org/documentation/

j'ai décidé de corriger les choses dans le submitHandler personnalisé et d'attribuer une valeur à #comment si l'autre case #addTimeSheet est cochée et que le champ #comment n'est pas renseigné:

jQuery(document).ready(function() {jQuery("#commentform").validate({

   submitHandler: function(form) {
    // do other things for a valid form

        if(jQuery("#addTimeSheet").is(":checked") == true) {

            if(jQuery("#comment").val() == "") {


                jQuery("#comment").val("%comment-dummy%");

            }

        }          

    form.submit();
  }

,

de cette façon, je n'ai pas besoin de réparer les choses après et je pense que c'est une solution plus élégante;)

de toute façon, merci encore pour votre aide et je vous souhaite tout le meilleur

salutations becki

1
Becki Beckmann