web-dev-qa-db-ja.com

WP 4.4.1 add_action 'pre_comment_on_post'を介して空のコメントを許可する

worpdress v.4.4.1で空のコメントを許可することについて質問をしました

これを達成するために、私はアクション 'pre_comment_on_post'を使います。 WP 4.3.1で私は簡単にこれを行うことができます:

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

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

ダミーコンテンツは、あとでもう1つのadd_filter呼び出しを使って除外されます。wp-comments-post.phpのwp 4.3.1では、次のコード行になっています。

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

だから私のadd_actionは完璧に動作します;)

wp 4.4.1では、コア開発者がコードを変更し、2627行目の/wp-includes/comment.phpに4.4.0の新しい機能を導入しました。

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

}

そしてスーパーグローバル$ _POSTはwp-comments-post.phpの関数に渡されます。

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

そのため、wp 4.4.1では、$ _POST ['comment']に値を代入しても、新しい関数のように$ _POST ['comment']を$ comment_contentにマップするような効果はありません。

だから私は単に私のadd_action関数で$ comment_contentをグローバルにすることを考えていました:

    function action_pre_comment_on_post($comment_post_ID) {

    global $comment_content;


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

                    $comment_content = "dummy comment";

                return;

            }

}   

しかし、これは残念ながら動作しません:( $ comment_contentがグローバルスコープで宣言されていないため。((

私がコアコードを修正し、グローバルスコープで$ comment_contentを定義するならば:

function wp_handle_comment_submission( $comment_data ) {

global $comment_content;

私のadd_action関数は現在$ comment_contentに値を渡すことができ、すべてうまく動いています。しかし、実際にはコアコードを修正しないでください。私はfunctions.phpまたはadd_action 'init'を介して$ comment_contentグローバルを宣言する必要がありますか?または???

だから...どのようにこのケースを解決するのが最善ですか?

任意の助けをいただければ幸いです。

おかげで&すべての最高のベッキー

2
Becki Beckmann

最初の@swisspidyとinitフックの$ _POSTを修正する提案に感謝します。

しかし、もう少し考えてコードを見た後、私は別のアプローチを取りました。

あとで修正するのではなく、フォームの送信後に、フォームの送信中にjQueryを介して修正し、そこでコメント入力フィールドについて必要なチェックを行うことにしました。

私はすでにjqueryの検証プラグインを介してフォームの検証を行うように:

http://jqueryvalidation.org/

そしてそれはカスタム送信ハンドラを提供します

http://jqueryvalidation.org/documentation/

他のチェックボックス#addTimeSheetがチェックされていて#commentフィールドが入力されていない場合、私はカスタムsubmitHandlerのものを修正し、#commentに値を割り当てることにしました。

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

こうすれば、あとで修正する必要はなく、もっと洗練された解決策だと思います。)

とにかく、もう一度あなたの助けをありがとう&あなたにすべての最高を祈ります

あいさつ文

1
Becki Beckmann