Supprimer un post en fonction d’un champs Date en ACF

(SPOILER: La methode 1 fonctionne. Les autres fonctionnent mal ou pas du tout)

  • Tentative 1 :

https://wordpress.stackexchange.com/questions/226276/delete-custom-post-based-on-custom-field-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 );
    }
}

(note :

Alternative à Cron

Utilisez ceci, si par exemple, les articles planifiés ne sont pas publiés. Selon les explications d’Otto’s forum explanation (en anglais), « Cette méthode alternative utilise une approche par redirection, qui génère dans le navigateur de l’utilisateur une redirection lorsque le cron a besoin de se lancer, de sorte qu’il revienne immédiatement sur le site tandis que le cron continues de s’exécuter dans la connexion qui vient juste d’être abandonnée. Cette méthode est parfois un peu hasardeuse, ce qui explique que ce ne soit pas la valeur par défaut. »

define('ALTERNATE_WP_CRON', true);
  • Tentative 2 :
// expire offer posts on date field.
if (!wp_next_scheduled('expire_posts')){
  wp_schedule_event(time(), 'twicedaily', 'expire_posts'); // this can be hourly, twicedaily, or daily
}

add_action('expire_posts', 'expire_posts_function');

function expire_posts_function() {
    $today = date('Ymd');
    $args = array(
        'post_type' => array('event'), // post types you want to check
        'posts_per_page' => -1 
    );
    $posts = get_posts($args);
    foreach($posts as $p){
        $expiredate = date( 'Ymd', strtotime( get_field( 'ev_date', $p->ID ) ) ); // get the raw date from the db
        if ($expiredate) {
            if($expiredate < $today){
                $postdata = array(
                    'ID' => $p->ID,
                    'post_status' => 'draft'
                );
                wp_update_post($postdata);
            }
        }
    }
}

Attention:
– format de date du champs ACF doit être similaire !!!

  • Tentative 3
wp_schedule_event(time(), 'daily', 'my_hourly_event');
//add_action('init','my_hourly_event');
function my_hourly_event() {
	$the_query = get_posts( 'post_type=job' );	
	foreach($the_query as $single_post) {
		$id=$single_post->ID;
		$ad_close_date=get_post_meta($id, 'ad_close_date', true );
		if($ad_close_date!=''){
			$today=date("Y-m-d");
			if($ad_close_date<$today){
				$update_post = array(
				'ID' 			=> $id,
				'post_status'	=>	'private',
				'post_type'	=>	'job' );
				wp_update_post($update_post);
			}	
		}
	}
}