'esitykset'というカスタム投稿タイプを作成し、投稿の 'show_date'カスタムフィールドの日付より古い場合はそれらを削除したいと思いました。
だから私は次のコードを試してみました
add_action( 'wp', 'expire_events_daily' );
function expire_events_daily() {
if ( ! wp_next_scheduled( 'delete_expired_events' ) ) {
wp_schedule_event( time(), 'hourly', 'delete_expired_events');
}
}
add_action( 'delete_expired_events', 'delete_expired_events_callback' );
function delete_expired_events_callback()
{
$args = [
'post_type' => 'esitykset',
'posts_per_page' => -1,
'fields' => 'ids', //only get post id's
'meta_query' => [
[
'key' => 'show_date',
'value' => current_time( 'Y/m/d' ),
'compare' => '<'
]
]
];
$events = get_posts( $args );
if ( $events ) {
// Loop through the post ID's and delete the post
foreach ( $events as $id )
wp_trash_post( $id );
}
}
上記のコードが機能するためには、追加しなければなりませんでした
define('ALTERNATE_WP_CRON', true);
私のwp-config.phpファイルに。
今それは働いた。助けてくれてありがとう。
ここで日付形式の不一致があります。あなたはあなたの日付があなたのカスタムフィールドにY/m/d
として保存されていると言って、それは正しいです、しかしあなたはこのフォーマットを unix timestamp (これはtime()
の結果です。
カスタムフィールド内の2つの異なる日付を一致または比較するには、日付と時刻の形式をまったく同じ形式にする必要があります。これがカスタムフィールドの機能です。知っておくべきロジックや、異なる日付/時刻フォーマットを変換して一致させるロジックはありません。そのため、すべてが一致することを手動で確認する必要があります。
現在の日付/時刻を返すためにtime()
を使い、それを日付/時刻の比較として使う代わりに、 current_time( 'Y/m/d' )
を使うべきです。ちょっと注意してください、これはWordPress 3.9からのみ可能です
別の言い方をすると、以下のように関数を単純化することができます。これにより、パフォーマンスが向上します(注:少なくともPHP 5.4が必要です)。
function delete_expired_events_callback()
{
$args = [
'post_type' => 'esitykset',
'posts_per_page' => -1,
'fields' => 'ids', //only get post id's
'meta_query' => [
[
'key' => 'show_date',
'value' => current_time( 'Y/m/d' ),
'compare' => '<'
]
]
];
$events = get_posts( $args );
if ( $events ) {
// Loop through the post ID's and delete the post
foreach ( $events as $id )
wp_delete_post( $id );
}
}