Обновление комментария в WordPress: wp_update_comment()

# WP_UPDATE_COMMENT() │ WP 2.0.0

Функция wp_update_comment() обновляет существующий комментарий в базе данных WordPress. Эта функция проверяет правильность полей и применяет фильтры перед обновлением комментария.

## Возврат Значений

Функция возвращает:
- **1**, если комментарий был успешно обновлён.
- **0**, если комментарий не был обновлён.
- **false** или объект **WP_Error** в случае ошибки.

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

Чтобы обновить комментарий, используйте следующий синтаксис:

```php
wp_update_comment( $commentarr, $wp_error );

Параметры

  • $commentarr (array) (обязательный) — Массив с информацией о комментарии.
  • $wp_error (bool) — Указывает, следует ли возвращать объект WP_Error в случае неудачи. По умолчанию: false.

Пример

Обновление текста комментария с ID 37:

// данные комментария
$commentarr = [
    'comment_ID'      => 37,
    'comment_content' => 'Вот новый текст комментария',
];

// обновление данных в базе данных
wp_update_comment( $commentarr );

Поля, которые можно обновить:

Вы можете обновить следующие поля:

  • [comment_post_ID] - ID поста
  • [comment_author] - Имя автора комментария
  • [comment_author_email] - Эл. почта автора
  • [comment_author_url] - URL автора
  • [comment_author_IP] - IP-адрес автора
  • [comment_date] - Дата комментария
  • [comment_date_gmt] - Дата комментария в GMT
  • [comment_content] - Содержимое комментария
  • [comment_karma] - Карма комментария
  • [comment_approved] - Статус комментария (одобрен/не одобрен)
  • [comment_agent] - Агент пользователя (браузер)
  • [comment_type] - Тип комментария
  • [comment_parent] - ID родительского комментария
  • [user_id] - ID пользователя

Примечания

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

Изменения

Функция была представлена в версии 2.0.0. В версии 4.9.0 добавлена возможность обновления метаданных комментариев. В версии 5.5.0 был добавлен параметр $wp_error, а также изменены значения, возвращаемые для невалидных ID комментариев или постов.

Код Функции

Вот как выглядит функция wp_update_comment() в файле wp-includes/comment.php:

function wp_update_comment( $commentarr, $wp_error = false ) {
    global $wpdb;

    // Получаем все оригинальные поля комментария.
    $comment = get_comment( $commentarr['comment_ID'], ARRAY_A );

    if ( empty( $comment ) ) {
        if ( $wp_error ) {
            return new WP_Error( 'invalid_comment_id', __( 'Некорректный ID комментария.' ) );
        } else {
            return false;
        }
    }

    // Проверяем, валиден ли указанный ID поста.
    if ( ! empty( $commentarr['comment_post_ID'] ) && ! get_post( $commentarr['comment_post_ID'] ) ) {
        if ( $wp_error ) {
            return new WP_Error( 'invalid_post_id', __( 'Некорректный ID поста.' ) );
        } else {
            return false;
        }
    }

    $filter_comment = false;
    if ( ! has_filter( 'pre_comment_content', 'wp_filter_kses' ) ) {
        $filter_comment = ! user_can( isset( $comment['user_id'] ) ? $comment['user_id'] : 0, 'unfiltered_html' );
    }

    if ( $filter_comment ) {
        add_filter( 'pre_comment_content', 'wp_filter_kses' );
    }

    // Экранируем данные, полученные из базы.
    $comment = wp_slash( $comment );

    $old_status = $comment['comment_approved'];

    // Объединяем старые и новые поля, при этом новые поля п��резаписывают старые.
    $commentarr = array_merge( $comment, $commentarr );

    $commentarr = wp_filter_comment( $commentarr );

    if ( $filter_comment ) {
        remove_filter( 'pre_comment_content', 'wp_filter_kses' );
    }

    // Извлекаем объединённый массив.
    $data = wp_unslash( $commentarr );

    $data['comment_content'] = apply_filters( 'comment_save_pre', $data['comment_content'] );
    $data['comment_date_gmt'] = get_gmt_from_date( $data['comment_date'] );

    if ( ! isset( $data['comment_approved'] ) ) {
        $data['comment_approved'] = 1;
    } elseif ( 'hold' === $data['comment_approved'] ) {
        $data['comment_approved'] = 0;
    } elseif ( 'approve' === $data['comment_approved'] ) {
        $data['comment_approved'] = 1;
    }

    $comment_id      = $data['comment_ID'];
    $comment_post_id = $data['comment_post_ID'];

    $data = apply_filters( 'wp_update_comment_data', $data, $comment, $commentarr );

    if ( is_wp_error( $data ) ) {
        if ( $wp_error ) {
            return $data;
        } else {
            return false;
        }
    }

    $keys = array(
        'comment_post_ID',
        'comment_author',
        'comment_author_email',
        'comment_author_url',
        'comment_author_IP',
        'comment_date',
        'comment_date_gmt',
        'comment_content',
        'comment_karma',
        'comment_approved',
        'comment_agent',
        'comment_type',
        'comment_parent',
        'user_id',
    );

    $data = wp_array_slice_assoc( $data, $keys );

    $result = $wpdb->update( $wpdb->comments, $data, array( 'comment_ID' => $comment_id ) );

    if ( false === $result ) {
        if ( $wp_error ) {
            return new WP_Error( 'db_update_error', __( 'Не удалось обновить комментарий в базе данных.' ), $wpdb->last_error );
        } else {
            return false;
        }
    }

    // Если предоставлены метаданные, сохраняем их.
    if ( isset( $commentarr['comment_meta'] ) && is_array( $commentarr['comment_meta'] ) ) {
        foreach ( $commentarr['comment_meta'] as $meta_key => $meta_value ) {
            update_comment_meta( $comment_id, $meta_key, $meta_value );
        }
    }

    clean_comment_cache( $comment_id );
    wp_update_comment_count( $comment_post_id );

    do_action( 'edit_comment', $comment_id, $data );

    $comment = get_comment( $comment_id );

    wp_transition_comment_status( $comment->comment_approved, $old_status, $comment );

    return $result;
}

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

Также существуют и другие функции, связанные с комментариями, такие как:

  • cancel_comment_reply_link()
  • get_comment()
  • wp_insert_comment()
  • wp_delete_comment()

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

Leave a Reply

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