web-dev-qa-db-fra.com

Postes à expiration (supprimés) après une date

Je crée un site de coupon à partir de zéro. J'ai examiné de nombreux exemples de code sur Internet, mais je n'ai rien trouvé qui puisse fonctionner, car mes exigences sont légèrement différentes.

J'ai besoin d'aide pour créer une fonction d'expiration qui effacerait automatiquement le "coupon" (post_type).

En tant que site de coupon, tous les coupons sont importés en vrac. Par conséquent, le format de la date d'expiration (par exemple, 01/12/2014, 01-12-2014 ou 1er décembre 2014) diffère d'un coupon à l'autre dans une importation (session) donnée. Cela crée un problème lorsque le format de la date diffère, et ce n'est jamais le même.

Le champ personnalisé est "expiry_date", il stockera la date.

Quelqu'un at-il une bonne solution à ce problème?

1
user2506619

J'ai fait quelque chose de similaire il y a quelque temps. Je ne suis pas sûr que la suppression d'un message soit une bonne solution. Vous pouvez peut-être modifier uniquement le statut du message en un message personnalisé appelé Expiré, par exemple. Mais pour un exemple, le code ci-dessous supprimera le message.

Commencez par créer un travail cron quotidien:

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' );

Utilisez ensuite la fonction delete_expired_coupons_callback pour parcourir les publications de coupon, vérifier la date et supprimer si nécessaire:

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;
}

Quelques suggestions: lorsque vous importez les coupons, vous pouvez effectuer une conversion strtotime afin que le format de date soit le même dans la base de données. Ainsi, vous n'avez pas besoin de parcourir toutes les publications pour vérifier la date d'expiration. Vous pouvez utiliser une requête personnalisée pour vérifier si elle a expiré. Le travail quotidien s'exécutera donc beaucoup plus rapidement:

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

Vous pouvez créer un statut de publication Expiration pour désactiver simplement ces publications sans les supprimer: http://codex.wordpress.org/Function_Reference/register_post_status

Et vous pouvez changer le statut de la publication comme ceci, au lieu de la fonction 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

Je suggère d'ouvrir CSV dans Excel et d'utiliser le formatage pour convertir toutes les dates au même format et enregistrer CSV avant de l'utiliser pour l'importation. Cela devrait éviter tout effort de développement.

1
AlexG