Удалить все сообщения пользовательского типа сообщения - эффективно

8

Я ищу безопасный и быстрый способ удаления всех сообщений одного типа сообщений. Использование get_posts()и wp_delete_post()для каждого возвращенного поста не работает; это недостаточно быстро из-за большого количества запросов к базе данных (ошибка тайм-аута).

Предпочтительно, я ищу один запрос к базе данных, чтобы удалить все сообщения, которые имеют пользовательский тип сообщения. Какие-нибудь мысли?

Маркус Маклин
источник
Это разовое событие? Если это так, быстрый SQL-запрос через phpMyAdmin кажется самым простым. Если этот этап ведения домашнего хозяйства необходимо выполнять программно / многократно, это вам не поможет.
JDM2112
Это нужно делать регулярно, без ручного доступа к базе данных, к сожалению.
Маркус Маклин
Заметано. Я бы порекомендовал посмотреть на wpdbкласс тогда. Предпочтительный метод и «путь WP» для работы напрямую с БД. Дайте нам знать, если вам нужна помощь с этим запросом. Я могу опубликовать полный ответ позже, если необходимо codex.wordpress.org/Class_Reference/wpdb
jdm2112
2
Использование 'fields' => 'ids',в get_postsполучить только идентификатор поста. Это все, что вам нужно, и это значительно ускорит ваш запрос
Питер Гусен
1
@MarcusMcLean: очевидно, вы упустили мою точку зрения;) Один пост содержит данные в таблице постов, в таблице постметы, в таблицах таксономии и, возможно, в таблице опций. Любой чистый SQL-запрос, который вы пишете для удаления этих сообщений, будет довольно сложным. У вас есть все шансы оставить вещи за этими различными столами. Я бы попытался удалить, скажем, 50 за раз с 5-минутными интервалами, используя основные функции иwp_cron()
s_ha_dum

Ответы:

17

Вы можете удалить все сообщения через $wpdb

DELETE FROM wp_posts WHERE post_type='post_type';
DELETE FROM wp_postmeta WHERE post_id NOT IN (SELECT id FROM wp_posts);
DELETE FROM wp_term_relationships WHERE object_id NOT IN (SELECT id FROM wp_posts)

или используйте этот запрос, замените его {{ваш CPT}} на ваш пользовательский тип сообщения

DELETE a,b,c
    FROM wp_posts a
    LEFT JOIN wp_term_relationships b
        ON (a.ID = b.object_id)
    LEFT JOIN wp_postmeta c
        ON (a.ID = c.post_id)
    WHERE a.post_type = '{{your CPT}}';
Парт Сутария
источник
1
это, вероятно, будет работать нормально, но не забывайте о количестве терминов в одной из таблиц терминов. В WordPress должна быть функция для обновления.
Джоэл М
У пользователей также есть счетчик сообщений на экране пользователя, который не уверен, что эти данные предварительно сохранены или рассчитаны при загрузке страницы.
Джоэл М
1
@JoelM Столбец count существует в таблице базы данных wp_term_taxonomy. Похоже, что функция, которую вы ищете для обновления счетчика, определена wp_update_term_count($terms, $taxonomy, false)или wp_update_term_count_now($terms, $taxonomy)определена в wp-includes/taxonomy.php.
Кен
2

Вы можете удалить все сообщения пользовательского типа сообщения различными способами, но здесь я покажу вам, как это сделать без использования SQL-запроса. Вот, например, наш тип сообщения является продуктом

$allposts= get_posts( array('post_type'=>'product','numberposts'=>-1) );
foreach ($allposts as $eachpost) {
wp_delete_post( $eachpost->ID, true );
}

Смотрите полный учебник Ссылка здесь

Сарук Ахамед Моллик
источник
Прочтите ОП еще раз: «Использование get_posts()и wp_delete_post()для каждого возвращенного сообщения не работает; оно недостаточно быстрое из-за большого количества запросов к базе данных (ошибка тайм-аута)». Вы используете две функции, которые он не хочет использовать.
Майк