WP_ALLOW_COMMENT() Функция: разрешение или запрет комментариев

WP_ALLOW_COMMENT() │ WP 2.0.0

Функция WP_ALLOW_COMMENT() проверяет, разрешено ли оставление комментария.

Используемые функции

  • check_comment()
  • wp_blacklist_check()

Крюки (Hooks) из функции

  • duplicate_comment_id
  • comment_duplicate_trigger
  • comment_duplicate_message
  • check_comment_flood
  • wp_is_comment_flood
  • comment_flood_message

Возврат

Функция возвращает:

  • int | string | WP_Error. Для разрешенных комментариев возвращается статус одобрения (0, 1, 'spam', 'trash'). Если $wp_error равно true, то для запрещенных комментариев функция вернет объект WP_Error.

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

wp_allow_comment( $commentdata, $wp_error );
  • $commentdata (обязательный) — массив, который содержит информацию о комментарии.
  • $wp_error (по умолчанию false) — если установлен в true, то для запрещенного комментария функция вернет объект WP_Error, а не выполнит wp_die().

Примеры

Пример 1

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

$done = wp_insert_comment( $commentdata );

if( $done ){
    // Комментарий добавлен в базу данных
}

Этот пример показывает, как функция wp_new_comment() использует wp_allow_comment(). После того как комментарий одобрен (или не одобрен), функция wp_insert_comment() добавляет его в базу данных.

Комментарий будет записан в базу данных, даже если он не одобрен. Статус, возвращаемый wp_allow_comment(), поможет определить, нужно ли обновлять количество комментариев к посту.

Добавьте свой пример

Заметки

  • Глобальная переменная $wpdb — это объект абстракции базы данных WordPress.

Изменения

  • С версии 2.0.0 — функция была введена.
  • С версии 4.7.0 — параметр $avoid_die добавлен, позволяющий функции возвращать объект WP_Error вместо завершения работы с ошибкой.
  • С версии 5.5.0 — параметр $avoid_die переименован в $wp_error.

Код WP_ALLOW_COMMENT

Функция wp_allow_comment находится в файле wp-includes/comment.php.

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

    // Простая проверка на дубликаты.
    $dupe = $wpdb->prepare(
        "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = %s AND comment_approved != 'trash' AND ( comment_author = %s ",
        wp_unslash( $commentdata['comment_post_ID'] ),
        wp_unslash( $commentdata['comment_parent'] ),
        wp_unslash( $commentdata['comment_author'] )
    );

    if ( $commentdata['comment_author_email'] ) {
        $dupe .= $wpdb->prepare(
            'AND comment_author_email = %s ',
            wp_unslash( $commentdata['comment_author_email'] )
        );
    }

    $dupe .= $wpdb->prepare(
        ') AND comment_content = %s LIMIT 1',
        wp_unslash( $commentdata['comment_content'] )
    );

    $dupe_id = $wpdb->get_var( $dupe );

    // Фильтрует ID дублирующего комментария, если он найден.
    $dupe_id = apply_filters( 'duplicate_comment_id', $dupe_id, $commentdata );

    if ( $dupe_id ) {
        // Вызов после обнаружения дубликата.
        do_action( 'comment_duplicate_trigger', $commentdata );

        // Сообщение об ошибке для дубликата комментария.
        $comment_duplicate_message = apply_filters( 'comment_duplicate_message', __( 'Обнаружен дубликат комментария; похоже, вы уже это говорили!' ) );

        if ( $wp_error ) {
            return new WP_Error( 'comment_duplicate', $comment_duplicate_message, 409 );
        } else {
            if ( wp_doing_ajax() ) {
                die( $comment_duplicate_message );
            }

            wp_die( $comment_duplicate_message, 409 );
        }
    }

    // Проверка на "наводнение" комментариями.
    do_action(
        'check_comment_flood',
        $commentdata['comment_author_IP'],
        $commentdata['comment_author_email'],
        $commentdata['comment_date_gmt'],
        $wp_error
    );

    $is_flood = apply_filters(
        'wp_is_comment_flood',
        false,
        $commentdata['comment_author_IP'],
        $commentdata['comment_author_email'],
        $commentdata['comment_date_gmt'],
        $wp_error
    );

    if ( $is_flood ) {
        $comment_flood_message = apply_filters( 'comment_flood_message', __( 'Вы слишком быстро оставляете комментарии. Пожалуйста, замедлитесь.' ) );

        return new WP_Error( 'comment_flood', $comment_flood_message, 429 );
    }

    return wp_check_comment_data( $commentdata );
}

Связанные функции

  • add_comment_meta()
  • clean_comment_cache()
  • comment_link()
  • comment_form()
  • wp_insert_comment()
  • wp_delete_comment()

Эти функции могут быть полезны для работы с комментариями в WordPress.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *