60日以上経過している特定の投稿タイプ(この場合は "vfb_entry")の投稿をすべて削除します。クーロン・ジョブは1日1回実行する必要があります。
次のようなコードがありますが、cronジョブを起動しても機能しません。ただし、phpMyAdminでクエリのみを実行しても正しい結果が返されます。だから機能自体に問題があるに違いない。
誰でも手伝ってもらえますか?
// Cron Job to Delete VFB Entries older than 60 days
if(!wp_next_scheduled( 'remove_old_vfb_entries')){
wp_schedule_event(time(), 'daily', 'remove_old_vfb_entries');
}
add_action('remove_old_vfb_entries', 'myd_remove_old_vfb_entries');
// Build the function
function myd_remove_old_vfb_entries(){
global $wpdb;
// Set max post date and post_type name
$date = date("Y-m-d H:i:s", strtotime('-60 days'));
$post_type = 'vfb_entry';
// Build the query
// Only select VFB Entries from LFG or LFM Form
$query = "
SELECT $wpdb->posts.ID FROM $wpdb->posts
WHERE post_type = '$post_type'
AND post_status = 'publish'
AND post_date < '$date'
AND ($wpdb->posts.ID IN (SELECT entry_id FROM wp_postmeta_lfg4 WHERE post_id IS NOT NULL) OR $wpdb->posts.ID IN (SELECT entry_id FROM wp_postmeta_lfm3 WHERE post_id IS NOT NULL))
ORDER BY post_modified DESC
";
$results = $wpdb->get_results($query);
foreach($results as $post){
// Let the WordPress API clean up the entire post trails
wp_delete_post( $post->ID, true);
}
}
編集:wp_postsとwp_postmetaと以下のINNER JOINを使うだけで、私の意見を問い合わせることなく解決できます。
// add the schedule event if it has been removed
if( ! wp_next_scheduled( 'mg_remove_old_entries' ) ) {
wp_schedule_event( time(), 'daily', 'mg_remove_old_entries' ); //run the event daily
}
// action hooked to fired with wordpress cron job
add_action( 'mg_remove_old_entries', 'mg_remove_old_entries' );
function mg_remove_old_entries() {
$posts = get_posts( [
'numberposts' => -1,
'post_type' => 'vfb_entry',
'date_query' => [
// get all the posts from the database which are older than 60 days
'before' => date( "Y-m-d H:i:s", strtotime( '-60 days' ) ),
],
]);
if( !empty($posts) ) {
foreach( $posts as $post ) {
wp_delete_post( $post->ID ); //remove the post from the database
}
}
}
注:カスタムSQLクエリを実行する必要はありません。それは質問を遅くするでしょうそしてまたそれはwordpressのためによくありません。 Wordpressにはすでにすべての機能が組み込まれています。
// Cron Job to Delete VFB Entries older than 60 days
if(!wp_next_scheduled( 'remove_old_vfb_entries')){
wp_schedule_event(time(), 'daily', 'remove_old_vfb_entries');
}
add_action('remove_old_vfb_entries', 'myd_remove_old_vfb_entries');
// Build the function
function myd_remove_old_vfb_entries(){
global $wpdb;
// Set max post date and post_type name
$date = date("Y-m-d H:i:s", strtotime('-60 days'));
$post_type = 'vfb_entry';
// Build the query
// Only Delete Entries from Form 5 and 8
$query = "
SELECT $wpdb->posts.ID FROM $wpdb->posts
INNER JOIN $wpdb->postmeta
ON $wpdb->posts.ID = $wpdb->postmeta.post_id
WHERE post_type = '$post_type'
AND post_status = 'publish'
AND $wpdb->postmeta.meta_key = '_vfb_form_id'
AND ($wpdb->postmeta.meta_value = 5 OR $wpdb->postmeta.meta_value = 8)
AND post_date < '$date'
";
$results = $wpdb->get_results($query);
foreach($results as $post){
// Let the WordPress API clean up the entire post trails
wp_delete_post( $post->ID, true);
}
}
60日以上経過している特定の投稿タイプ(この場合は "vfb_entry")の投稿をすべて削除します。クーロン・ジョブは1日1回実行する必要があります。
最初のステップはcronジョブを設定することです。問題のコードはこの部分に対して正しいので、基本的には以下のようになります。
2番目の部分では、エントリが60日を超えている特定の投稿の種類についてデータベースを照会する必要があります。これをget_posts()
で行い、post_type
引数とdate_query
引数を指定することができます。
//* If the scheduled event got removed from the cron schedule, re-add it
if( ! wp_next_scheduled( 'wpse_213720_remove_old_entries' ) ) {
wp_schedule_event( time(), 'daily', 'wpse_213720_remove_old_entries' );
}
//* Add action to hook fired by cron event
add_action( 'wpse_213720_remove_old_entries', 'wpse_213720_remove_old_entries' );
function wpse_213720_remove_old_entries() {
//* Get all the custom post type entries older than 60 days...
$posts = get_posts( [
'numberposts' => -1,
'post_type' => 'wpse_262471_post_type',
'date_query' => [
'before' => date( "Y-m-d H:i:s", strtotime( '-60 days' ) ),
],
]);
//* ...and delete them
array_filter( function( $post ) {
wp_delete_post( $post->ID );
}, $posts );
}
上記の答えは直接$wpdb
を問い合わせます。 get_posts()
抽象化の使用は、読みやすさや将来性の保証など、さまざまな理由で優れています。