WordPress как на ладони

wp_new_comment()WP 1.5.0

Добавляет новый комментарий в Базу Данных. Фильтрует данные.

Фильтрует все данные, чтобы убедится что все поля переданы правильно, некоторые поля создаются функцией и их указывать не нужно (IP адресс, User Agent).

Задача функции предварительно обработать данные комментария и передать их wp_insert_comment().

Смотрите также функцию wp_handle_comment_submission(), которая является оберткой для этой функции.

  • Использует хук-событие: comment_post, который передает ID комментария и срабатывает сразу после добавления комментария.
  • Использует фильтр: preprocess_comment благодаря которому можно изменить данные комментария перед тем как функция начнет их обрабатывать.
Работает на основе: wp_insert_comment()
Основа для: wp_handle_comment_submission()
Хуки из функции

Возвращает

int|false|WP_Error. ID комментария, который был добавлен. Или false в случае неудачи.

Использование

wp_new_comment( $commentdata, $wp_error );
$commentdata(массив) (обязательный)

Ассоциативный массив данных комментария. Ключи массива — поля таблицы в БД.

Поле comment_ID указывать не нужно — оно создается автоматически. Остальные поля смотрите в описании wp_insert_comment().

Аргумент comment_approved всегда равен значению функции wp_allow_comment(). Т.е. если мы укажем его вручную, то указанное значение будет проигнорировано.

Чтобы несмотря ни на что указать значение comment_approved, можно воспользоваться фильтром: pre_comment_approved:

add_filter( 'pre_comment_approved', fn()=> 1 );
// или
add_filter( 'pre_comment_approved', fn()=> 0 );
$wp_error(логический)
true = не выполнять wp_die(), а вернуть WP_Error в случае ошибки. C WP 4.7.
По умолчанию: false

Примеры

0

#1 Пример добавления нового комментария

Комментарий будет добавлен к посту 418 и будет ответом на комментарий 315:

// создаем массив данных нового комментария
$commentdata = [
	'comment_post_ID'      => 418,
	'comment_author'       => 'Проверка',
	'comment_author_email' => 'milo@mail.ru',
	'comment_author_url'   => 'http://example.com',
	'comment_content'      => 'Текст нового комментария',
	'comment_type'         => 'comment',
	'comment_parent'       => 315,
	'user_ID'              => 0,
];

// добавляем данные в Базу Данных
wp_new_comment( $commentdata );
0

#2 Пример добавления комментария с использованием функции wp_insert_comment()

В этом случая мы должны сами определить абсолютно все поля комментария:

$data = [
	'comment_post_ID'      => 1,
	'comment_author'       => 'admin',
	'comment_author_email' => 'admin@admin.com',
	'comment_author_url'   => 'http://',
	'comment_content'      => 'текст коммента',
	'comment_type'         => 'comment',
	'comment_parent'       => 0,
	'user_id'              => 1,
	'comment_author_IP'    => '127.0.0.1',
	'comment_agent'        => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)',
	'comment_date'         => current_time('mysql'),
	'comment_approved'     => 1,
];

wp_insert_comment( $data );

Заметки

  • Смотрите: wp_insert_comment()
  • Global. wpdb. $wpdb WordPress database abstraction object.

Список изменений

С версии 1.5.0 Введена.
С версии 4.3.0 Introduced the comment_agent and comment_author_IP arguments.
С версии 4.7.0 The $avoid_die parameter was added, allowing the function to return a WP_Error object instead of dying.
С версии 5.5.0 The $avoid_die parameter was renamed to $wp_error.
С версии 5.5.0 Introduced the comment_type argument.

Код wp_new_comment() WP 6.5.2

function wp_new_comment( $commentdata, $wp_error = false ) {
	global $wpdb;

	/*
	 * Normalize `user_ID` to `user_id`, but pass the old key
	 * to the `preprocess_comment` filter for backward compatibility.
	 */
	if ( isset( $commentdata['user_ID'] ) ) {
		$commentdata['user_ID'] = (int) $commentdata['user_ID'];
		$commentdata['user_id'] = $commentdata['user_ID'];
	} elseif ( isset( $commentdata['user_id'] ) ) {
		$commentdata['user_id'] = (int) $commentdata['user_id'];
		$commentdata['user_ID'] = $commentdata['user_id'];
	}

	$prefiltered_user_id = ( isset( $commentdata['user_id'] ) ) ? (int) $commentdata['user_id'] : 0;

	if ( ! isset( $commentdata['comment_author_IP'] ) ) {
		$commentdata['comment_author_IP'] = $_SERVER['REMOTE_ADDR'];
	}

	if ( ! isset( $commentdata['comment_agent'] ) ) {
		$commentdata['comment_agent'] = isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : '';
	}

	/**
	 * Filters a comment's data before it is sanitized and inserted into the database.
	 *
	 * @since 1.5.0
	 * @since 5.6.0 Comment data includes the `comment_agent` and `comment_author_IP` values.
	 *
	 * @param array $commentdata Comment data.
	 */
	$commentdata = apply_filters( 'preprocess_comment', $commentdata );

	$commentdata['comment_post_ID'] = (int) $commentdata['comment_post_ID'];

	// Normalize `user_ID` to `user_id` again, after the filter.
	if ( isset( $commentdata['user_ID'] ) && $prefiltered_user_id !== (int) $commentdata['user_ID'] ) {
		$commentdata['user_ID'] = (int) $commentdata['user_ID'];
		$commentdata['user_id'] = $commentdata['user_ID'];
	} elseif ( isset( $commentdata['user_id'] ) ) {
		$commentdata['user_id'] = (int) $commentdata['user_id'];
		$commentdata['user_ID'] = $commentdata['user_id'];
	}

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

	$parent_status = ( $commentdata['comment_parent'] > 0 ) ? wp_get_comment_status( $commentdata['comment_parent'] ) : '';

	$commentdata['comment_parent'] = ( 'approved' === $parent_status || 'unapproved' === $parent_status ) ? $commentdata['comment_parent'] : 0;

	$commentdata['comment_author_IP'] = preg_replace( '/[^0-9a-fA-F:., ]/', '', $commentdata['comment_author_IP'] );

	$commentdata['comment_agent'] = substr( $commentdata['comment_agent'], 0, 254 );

	if ( empty( $commentdata['comment_date'] ) ) {
		$commentdata['comment_date'] = current_time( 'mysql' );
	}

	if ( empty( $commentdata['comment_date_gmt'] ) ) {
		$commentdata['comment_date_gmt'] = current_time( 'mysql', 1 );
	}

	if ( empty( $commentdata['comment_type'] ) ) {
		$commentdata['comment_type'] = 'comment';
	}

	$commentdata = wp_filter_comment( $commentdata );

	$commentdata['comment_approved'] = wp_allow_comment( $commentdata, $wp_error );

	if ( is_wp_error( $commentdata['comment_approved'] ) ) {
		return $commentdata['comment_approved'];
	}

	$comment_id = wp_insert_comment( $commentdata );

	if ( ! $comment_id ) {
		$fields = array( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content' );

		foreach ( $fields as $field ) {
			if ( isset( $commentdata[ $field ] ) ) {
				$commentdata[ $field ] = $wpdb->strip_invalid_text_for_column( $wpdb->comments, $field, $commentdata[ $field ] );
			}
		}

		$commentdata = wp_filter_comment( $commentdata );

		$commentdata['comment_approved'] = wp_allow_comment( $commentdata, $wp_error );
		if ( is_wp_error( $commentdata['comment_approved'] ) ) {
			return $commentdata['comment_approved'];
		}

		$comment_id = wp_insert_comment( $commentdata );
		if ( ! $comment_id ) {
			return false;
		}
	}

	/**
	 * Fires immediately after a comment is inserted into the database.
	 *
	 * @since 1.2.0
	 * @since 4.5.0 The `$commentdata` parameter was added.
	 *
	 * @param int        $comment_id       The comment ID.
	 * @param int|string $comment_approved 1 if the comment is approved, 0 if not, 'spam' if spam.
	 * @param array      $commentdata      Comment data.
	 */
	do_action( 'comment_post', $comment_id, $commentdata['comment_approved'], $commentdata );

	return $comment_id;
}
2 комментария
    Войти