web-dev-qa-db-fra.com

supprimer le message personnalisé en fonction de la date du champ personnalisé

RÉSOLU ## code mis à jour ci-dessous.

J'avais créé un type de message personnalisé appelé "esitykset" et je voulais les supprimer s'ils sont plus anciens que la date indiquée dans le champ personnalisé "show_date" du message.

J'ai donc essayé le code suivant

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

Pour que le code ci-dessus fonctionne, je devais ajouter

define('ALTERNATE_WP_CRON', true);

dans mon fichier wp-config.php.

Maintenant cela a fonctionné. Merci d'avoir aidé.

1
Mayank

Vous avez une incompatibilité de format de date ici. Vous dites que vos dates sont enregistrées en tant que Y/m/d dans votre champ personnalisé, ce qui est correct, mais vous essayez ensuite de faire correspondre ce format à horodatage unix ( qui est le résultat de time()).

Les formats de date et d’heure doivent être exactement au même format afin de correspondre ou de comparer deux dates différentes dans un champ personnalisé. C’est ainsi que fonctionnent les champs personnalisés. Il n'y a pas de logique à connaître ni de logique pour convertir et faire correspondre différents formats de date/heure, vous devrez donc vous assurer manuellement que tout concorde.

Au lieu d'utiliser time() pour renvoyer la date/heure actuelle et de l'utiliser comme comparaison date/heure, vous devez utiliser current_time( 'Y/m/d' ) . Juste une note, cela n'est possible qu'à partir de WordPress 3.9

Juste une autre remarque, nous pouvons simplifier votre fonction comme suit, ce qui sera plus rapide et plus performant ( NOTE: Nécessite PHP 5.4 au moins )

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