wp_handle_comment_submission() WP 4.4.0

Опрацьовує публікацію коментаря. Викликається у файлі wp-comments-post.php при публікації коментаря через форму коментування.

Функція обробляє передані дані та додає коментар до бази даних або повертає WP_Error. За замовчуванням передаються wp_unslash( $_POST )дані.

Функцію зручно використовувати замість wp_new_comment() , щоб не писати вкотре перевірки на кшталт:

  • чи існує запис для якого публікується коментар;
  • чи має право користувач читати запис;
  • чи відкрито коментування;
  • чи не в кошику чи коментований запис;
  • чи не захищено паролем коментований запис;
  • та інші перевірки, які проходить коментар при стандартному коментуванні WordPress.

Функція чекає на дані без екранованих слешів ( wp_unslash($_POST) ), на відміну від wp_new_comment() , яка навпаки чекає на дані зі слешами.

Працює на основі:
wp_new_comment()

Повертає

WP_Comment|WP_Error. Об’єкт коментаря, якщо вдалося записати коментар або об’єкт помилки.

Використання

wp_handle_comment_submission( $comment_data );
$comment_data
(масив) (обов’язковий)

Дані коментаря як масиву. Можна передати лише такі дані:

  • comment_post_ID– (Рядок | число) ID запису, до якої відноситься коментар.
  • author– (Рядок) Ім’я автора коментаря.
  • email– (Рядок) email коментатора.
  • url– (Рядок) URL коментатора.
  • comment– (Рядок) Текст коментаря.
  • comment_parent– (Рядок | число) ID батьківського коментаря. Типово: 0.
  • _wp_unfiltered_html_comment— (Рядок) Значення nonce, щоб дозволити не фільтрувати HTML у тексті.

Якщо потрібно передати додаткові дані, використовуйте функцію wp_new_comment() окремо.

Приклади

0

#1 Додамо коментар через AJAX

Допустимо ми публікуємо коментар, який містить стандартні поля та ще метаполя і робимо ми це не через файл wp-comments-post.php , а через AJAX.

У цьому випадку, щоб не писати зайві перевірки, зручніше скористатися цією функцією. Для цього у функції обробника AJAX запиту використовуємо такий код:

add_action( 'wp_ajax_myaddcomment', 'myaddcomment_handler');

function myaddcomment_handler() {
	//print_r($_POST);

	// пробуємо записати комент у БД
	$comment = wp_handle_comment_submission( wp_unslash( $_POST ) );

	// помилка при додаванні коментаря
	if( is_wp_error( $comment ) ){
		wp_send_json_error( $comment->get_error_message() );
	}

	// коментар додано - все ОК!
	// обробляємо додаткові поля
	$foo = (int) $_POST['foo'];
	$bar = (int) $_POST['bar'];
	if( $foo ){
		update_comment_meta( $comment->comment_ID, 'foo', $foo );
	}
	if( $bar ){
		update_comment_meta( $comment->comment_ID, 'bar', $bar );
	}

	// Повернімо результат
	wp_send_json_success( $comment );
}

список змін

З версії 4.4.0Введено.

Код wp_handle_comment_submission() WP 6.0.2

function wp_handle_comment_submission( $comment_data ) {

	$comment_post_ID = 0;
	$ comment_parent = 0;
	$user_ID = 0;
	$comment_author = null;
	$comment_author_email = null;
	$comment_author_url = null;
	$comment_content = 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']);
	}

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

		if ( current_user_can( 'read_post', $comment_post_ID ) ) {
			return new WP_Error( 'comment_on_draft', __( 'Sorry, comments not allowed for this item.' ), 403 );
		} else {
			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.
				remove_filter( 'pre_comment_content', 'wp_filter_post_kses' );
				add_filter( 'pre_comment_content', 'wp_filter_kses');
			}
		}
	} else {
		if ( get_option( 'comment_registration' ) ) {
			return new WP_Error( 'not_logged_in', __( 'Sorry, you must be logged in to comment.' ), 403 );
		}
	}

	$comment_type = 'comment';

	if ( get_option( 'require_name_email' ) && ! $user->exists() ) {
		if ( '' == $comment_author_email || '' == $comment_author ) {
			return new WP_Error( 'require_name_email', __( '<strong>Error</strong>: Please fill the required fields.' ), 200 );
		} elseif ( ! is_email( $comment_author_email ) ) {
			return new WP_Error( 'require_valid_email', __( '<strong>Error</strong>: Please enter a valid email address.' ), 200 );
		}
	}

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

	/**
	 * Filters whether empty comment should be allowed.
	 *
	 * @ Since 5.1.0
	 *
	 * @param bool $allow_empty_comment Whether to allow empty comments. Default false.
	 * @param array $commentdata Array of comment data to be sent to wp_insert_comment().
	 */
	$allow_empty_comment = apply_filters( 'allow_empty_comment', false, $commentdata );
	if ( '' === $comment_content && ! $allow_empty_comment ) {
		return new WP_Error( 'require_valid_comment', __( '<strong>Error</strong>: Please type your comment text.' ), 200 );
	}

	$check_max_lengths = wp_check_comment_data_max_lengths( $commentdata );
	if ( is_wp_error( $check_max_lengths ) ) {
		return $check_max_lengths;
	}

	$ comment_id = wp_new_comment (wp_slash ($ commentdata), true);
	if ( is_wp_error( $comment_id ) ) {
		return $comment_id;
	}

	if ( ! $comment_id ) {
		return new WP_Error( 'comment_save_error', __( '<strong>Error</strong>: коментар не може бути впевнений. Please try again later.' ), 500 );
	}

	return get_comment( $comment_id );
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *