過去X日(たとえば、週)からあるカテゴリに属するすべての投稿を永久に消去するクーロン・ジョブを実行したいと思います。これはおそらく非常に基本的なことですが、私はいくつかのポインタをいただければ幸いです。ありがとう。
最初のステップはcronジョブを設定することです。
2番目の部分では、エントリが1週間を超えている特定の投稿タイプについてデータベースを照会する必要があります。これを行うには、get_posts()を使用し、category引数とdate_query引数を指定します。
//* If the scheduled event got removed from the cron schedule, re-add it
if( ! wp_next_scheduled( 'wpse_263953_remove_old_entries' ) ) {
wp_schedule_event( time(), 'daily', 'wpse_263953_remove_old_entries' );
}
//* Add action to hook fired by cron event
add_action( 'wpse_263953_remove_old_entries', 'wpse_263953_remove_old_entries' );
function wpse_263953_remove_old_entries() {
//* Get all posts older than 7 days...
$posts = get_posts( [
'numberposts' => -1,
//* Use `cat` to query the category ID
//* 'cat' => 'wpse_263953_category_id',
//* Use `category_name` to query the category slug
'category_name' => 'wpse_263953_category',
'date_query' => [
'after' => date( "Y-m-d H:i:s", strtotime( '-7 days', current_time( 'timestamp' ) ) ),
//* For posts older than a month, use '-1 months' in strtotime()
],
]);
//* ...and delete them
foreach( $posts as $post ) {
wp_delete_post( $post->ID );
}
}
以下のクエリはあなたに与えられたカテゴリIDの30日以上前の投稿IDのリストを与えます。
SELECT
p.ID as post_id,
term.term_id as category_id
FROM wp_posts as p
LEFT JOIN wp_term_relationships as tr ON tr.object_id = p.ID
LEFT JOIN wp_terms as term ON tr.term_taxonomy_id = term.term_id
WHERE term.term_id = "CATEGORY ID HERE"
AND DATEDIFF(NOW(), p.post_date) > 30
リストを取得したら、投稿を削除するかどうかを決めることができます。
投稿を削除するには、以下の機能を使用します。2番目のパラメータ(TRUE)は投稿を永久に削除します。投稿をゴミ箱に入れたい場合(FALSE)
wp_delete_post( 'YOUR_POST_ID_HERE', TRUE);
テーブルの接頭辞が 'wp_'でない場合は、忘れずに変更してください。