Удаление записей в WordPress с помощью функции wp_delete_post()

WP_DELETE_POST() │ WP 1.0.0

Функция wp_delete_post() используется для удаления указанных записей из базы данных. Запись может принадлежать любому типу: пост, вложение, страница и т.д.

При постоянном удалении записи также удаляются все связанные с ней данные:

  • Пользовательские поля (метаданные поста)
  • Комментарии
  • Все связи с таксономиями (терминами, связанными с постом)

Функция wp_delete_post() передает управление функции wp_trash_post() в следующих случаях:

  • Параметр $force_delete равен false
  • Тип поста — это пост или страница
  • Пост ещё не перемещён в корзину
  • Корзина не отключена (см. константу EMPTY_TRASH_DAYS)

Важные замечания

  • Перед удалением поста срабатывает хук delete_post. Это не применяется к типу поста "вложение".
  • После удаления поста срабатывает хук deleted_post. Это также не применяется к типу поста "вложение".
  • Если тип поста — вложение, управление передается функции wp_delete_attachment().
  • При удалении не удаляются вложения (изображения), связанные с постом, который вы хотите удалить.
  • Дочерние или родительские посты, связанные с удаляемым постом, также не удаляются.

Шаблон использования функции

Возврат значения

Функция возвращает данные поста в случае успеха, или false/null в случае ошибки.

Пример использования

wp_delete_post( $post_id, $force_delete );
  • $post_id (int) — ID поста.
  • $force_delete (true|false) — нужно ли обойти корзину и сразу удалить запись. По умолчанию значение false.

Пример

Удалим стандартный пост "Привет, мир", который имеет ID = 1:

$deleted = wp_delete_post(1);

print_r( $deleted );

/*
stdClass Object
(
    [ID]                    => 1
    [post_author]           => 0
    [post_date]             => 2016-08-08 17:07:49
    [post_date_gmt]         => 2016-08-08 12:07:49
    [post_content]          => 
    [post_title]            => Hello World
    [post_excerpt]          => 
    [post_status]           => publish
    [comment_status]        => closed
    [ping_status]           => closed
    [post_password]         => 
    [post_name]             => hello-world
    [to_ping]               => 
    [pinged]                => 
    [post_modified]         => 2016-08-08 17:07:49
    [post_modified_gmt]     => 2016-08-08 12:07:49
    [post_content_filtered] => 
    [post_parent]           => 0
    [guid]                  => http://wp-example.com/hello-world
    [menu_order]            => 0
    [post_type]             => post
    [post_mime_type]        => 
    [comment_count]         => 0
    [filter]                => raw
)
*/

Заметки

  • Глобальный объект базы данных WordPress: $wpdb.
  • Смотрите также: wp_delete_attachment(), wp_trash_post().

Изменения

Функция была представлена в версии 1.0.0.

Полный код функции

Функция wp_delete_post() описана в файле wp-includes/post.php и представляет собой следующее:

function wp_delete_post( $post_id = 0, $force_delete = false ) {
    global $wpdb;

    $post = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d", $post_id ) );

    if ( ! $post ) {
        return $post;
    }

    $post = get_post( $post );

    if ( ! $force_delete
        && ( 'post' === $post->post_type || 'page' === $post->post_type )
        && 'trash' !== get_post_status( $post_id ) && EMPTY_TRASH_DAYS
    ) {
        return wp_trash_post( $post_id );
    }

    if ( 'attachment' === $post->post_type ) {
        return wp_delete_attachment( $post_id, $force_delete );
    }

    // Фильтрация перед удалением записи
    $check = apply_filters( 'pre_delete_post', null, $post, $force_delete );
    if ( null !== $check ) {
        return $check;
    }

    // Хук перед удалением
    do_action( 'before_delete_post', $post_id, $post );

    delete_post_meta( $post_id, '_wp_trash_meta_status' );
    delete_post_meta( $post_id, '_wp_trash_meta_time' );

    wp_delete_object_term_relationships( $post_id, get_object_taxonomies( $post->post_type ) );

    $parent_data  = array( 'post_parent' => $post->post_parent );
    $parent_where = array( 'post_parent' => $post_id );

    if ( is_post_type_hierarchical( $post->post_type ) ) {
        // Перенаправляем детей на родителя
        $children_query = $wpdb->prepare(
            "SELECT * FROM $wpdb->posts WHERE post_parent = %d AND post_type = %s",
            $post_id,
            $post->post_type
        );

        $children = $wpdb->get_results( $children_query );

        if ( $children ) {
            $wpdb->update( $wpdb->posts, $parent_data, $parent_where + array( 'post_type' => $post->post_type ) );
        }
    }

    // Получаем идентификаторы ревизий и удаляем их
    $revision_ids = $wpdb->get_col(
        $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'revision'", $post_id )
    );

    foreach ( $revision_ids as $revision_id ) {
        wp_delete_post_revision( $revision_id );
    }

    // Перенаправляем все вложения на родителя
    $wpdb->update( $wpdb->posts, $parent_data, $parent_where + array( 'post_type' => 'attachment' ) );

    wp_defer_comment_counting( true );

    $comment_ids = $wpdb->get_col(
        $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d ORDER BY comment_ID DESC", $post_id )
    );

    foreach ( $comment_ids as $comment_id ) {
        wp_delete_comment( $comment_id, true );
    }

    wp_defer_comment_counting( false );

    $post_meta_ids = $wpdb->get_col(
        $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d ", $post_id )
    );

    foreach ( $post_meta_ids as $mid ) {
        delete_metadata_by_mid( 'post', $mid );
    }

    // Хук перед удалением из базы данных
    do_action( "delete_post_{$post->post_type}", $post_id, $post );

    // Хук после удаления поста
    do_action( 'delete_post', $post_id, $post );

    $result = $wpdb->delete( $wpdb->posts, array( 'ID' => $post_id ) );
    if ( ! $result ) {
        return false;
    }

    // Хук после удаления поста
    do_action( "deleted_post_{$post->post_type}", $post_id, $post );
    do_action( 'deleted_post', $post_id, $post );

    clean_post_cache( $post );

    if ( is_post_type_hierarchical( $post->post_type ) && $children ) {
        foreach ( $children as $child ) {
            clean_post_cache( $child );
        }
    }

    wp_clear_scheduled_hook( 'publish_future_post', array( $post_id ) );

    // Хук после завершения удаления поста
    do_action( 'after_delete_post', $post_id, $post );

    return $post;
}

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

  • get_default_post_to_edit()
  • wp_insert_post()
  • wp_publish_post()
  • wp_trash_post()
  • wp_update_post()

Эта функция позволяет удобно управлять записями в WordPress. Надеюс��, данный материал будет полезен как начинающим, так и опытным пользователям!

Leave a Reply

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