web-dev-qa-db-ja.com

日付後に期限切れになる(削除される)投稿

クーポンサイトを最初から作成しています。私はインターネット上で多くのコード例を見直しましたが、私の要件はほとんど変わっていないので、うまくいくものは何も見つけていません。

私は自動的に "coupon"(post_type)を削除する期限切れ関数を作るのに助けが必要です。

クーポンサイトとしては、すべてのクーポンがまとめてインポートされるため、有効期限の形式(2014年12月1日、2014年12月12日、2014年12月1日など)は、特定のインポート(セッション)におけるクーポンごとに異なります。これは日付フォーマットが異なるときに問題を引き起こし、そしてそれは決して同じではありません。

カスタムフィールドは "expiry_date"です、それは日付を格納します。

誰かがこの問題に対する良い解決策を持っていますか?

1
user2506619

私はしばらく前に似たようなことをしました。投稿を削除するのが良い解決策であるかどうか私は確信していません、多分あなたは例えば期限切れと呼ばれるカスタムのものに投稿ステータスのみを変更することができます。しかし、例として、以下のコードは投稿を削除します。

まず、毎日のcronジョブを作成します。

add_action( 'wp', 'delete_expired_coupons_daily' );
function delete_expired_coupons_daily() {
    if ( ! wp_next_scheduled( 'delete_expired_coupons' ) ) {
        wp_schedule_event( time(), 'daily', 'delete_expired_coupons');
    }
}
add_action( 'delete_expired_coupons', 'delete_expired_coupons_callback' );

次に、delete_expired_coupons_callback関数を使用してクーポンの投稿をループ処理し、日付を確認し、必要に応じて削除します。

function delete_expired_coupons_callback() {
    $args = array(
        'post_type' => 'coupon',
        'posts_per_page' => -1
    );

    $coupons = new WP_Query($args);
    if ($coupons->have_posts()):
        while($coupons->have_posts()): $coupons->the_post();    

            $expiration_date = get_post_meta( get_the_ID(), 'expiry_date', true );
            $expiration_date_time = strtotime($expiration_date);

            if ($expiration_date_time < time()) {
                wp_delete_post(get_the_ID());
                //Use wp_delete_post(get_the_ID(),true) to delete the post from the trash too.                  
            }

        endwhile;
    endif;
}

提案のカップル:あなたがクーポンを輸入するとき、あなたはstrtotime変換をすることができるので、日付フォーマットはデータベースで同じです。こうすることで、有効期限をチェックするためにすべての投稿をループ処理する必要がなくなり、カスタムクエリを使用して有効期限が切れているかどうかをチェックできるので、毎日の仕事がはるかに速くなります。

    $args = array(
        'post_type' => 'coupon',
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
               'key' => 'expiry_date',
               'value' => time(),
               'compare' => '<'
            )
        )
    );

削除することなくこれらの投稿を無効にするために有効期限投稿ステータスを作成できます。 http://codex.wordpress.org/Function_Reference/register_post_status

Wp_delete_post関数の代わりに、あなたはこのように投稿ステータスを変更することができます。

// Update post
$my_post = array();
$my_post['ID'] = get_the_ID();
$my_post['post_status'] = 'expired';

// Update the post into the database
wp_update_post( $my_post );
6
passatgt

CSVをExcelで開き、フォーマットを使用してすべての日付を同じフォーマットに変換してからCSVを保存してからインポートすることをお勧めします。これは開発努力を避けるべきです。

1
AlexG