web-dev-qa-db-ja.com

カスタムフィールドの日付に基づいてカスタム投稿を削除する

解決済み##以下のコードを更新。

'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ファイルに。

今それは働いた。助けてくれてありがとう。

1
Mayank

ここで日付形式の不一致があります。あなたはあなたの日付があなたのカスタムフィールドに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 );
    }
}
0
Pieter Goosen