2010-01-28 2 views
0

Я запускаю блог, в котором сообщество может публиковать сообщения, чувствительные к времени, (спортивные результаты и т. Д.).
По прошествии определенного времени эти сообщения больше не полезны, поэтому я хочу удалить их в пакетном режиме с помощью MySQL-запроса, но я не знаю, как это сделать. Я полагаю, что избавление от этих сообщений целиком больше, чем просто удаление из таблицы the wp_posts, правильно? Там других таблиц на работу за сообщение нет?Нужно MySQL Запросы на удаление сообщений WordPress и Post Meta больше, чем X Days Old

Я пробовал пару плагинов auto- или batch-delete, но они не работают в половине случаев.

Возможно, вы могли бы предоставить запрос MySQL для удаления сообщений и их частей старше X дней из всех соответствующих таблиц?

+1

Возможный дубликат [Wordpress: автоматически удалять сообщения, возраст которых составляет x дней?] (Http://stackoverflow.com/questions/5317599/wordpress-automatically-delete-posts-that-are-x-days-old) –

ответ

0

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

Конечно, в конечном итоге ваша база данных будет очень большой, но это будет казаться более простым и безопасным подходом ко мне. В качестве бонуса никакая информация не будет потеряна.

Редактировать.

Другой Подход может быть перемещение сообщения в отдельную категорию, но если вы хотите сделать, как подрывник, это тоже хорошо :-)

1) Find all eligible posts and their attachments 

SELECT wp_posts.ID, att.ID 
FROM wp_posts 
LEFT JOIN wp_posts att ON att.post_parent = wp_posts.ID 
WHERE wp.posts.post_date < EXPIRATION_DATE; 

2) Find all related comments 

SELECT wp_comments.comment_ID 
FROM wp_comments 
WHERE comment_post_ID IN (<post ID:s selected in 1)>) 

3) Delete all meta related to posts and comments, then comments, then posts 

DELETE FROM wp_commentmeta WHERE comment_id IN (<comment ID:s selected in 2)>) 
DELETE FROM wp_postmeta WHERE post_id IN (<post ID:s selected in 1)>) 
DELETE FROM wp_term_relationships WHERE object_id IN (<post ID:s selected in 1)>) 
DELETE FROM wp_comments WHERE comment_ID IN (<comment ID:s selected in 2)>) 
DELETE FROM wp_posts WHERE ID IN (<post ID:s selected in 1)>) 

Да, некоторые из них могут быть объединены, но я как держать вещи как можно проще.

Имена таблиц и столбцов взяты из моего WP 3.0-alpha. Вы можете проверить Database description, чтобы убедиться, что все это получилось.

+0

Eh. Я бы предпочел просто удалить их. НО, если запросы на создание мусора - все, что я могу получить, я с радостью возьму их. –

+0

Отредактировал мой ответ. –

+2

При таком подходе вам нужно быть осторожным, чтобы ни один из ваших виджетов или плагинов не кэшировал данные для публикации, иначе вам нужно было бы разобраться, как очистить их кеши. Я думаю, вам, вероятно, будет лучше написать свой собственный плагин, который запланировал работу с Wordpress cron с помощью 'wp_schedule_event', а затем удалил сообщения с помощью' wp delete post', таким образом будут выполняться все соответствующие зарегистрированные фильтры и действия - хотя очевидно, что это будет менее результативно. –