Come funziona un cron a step in WordPress

Ogni tanto mi capita di dover lavorare con una grande quantità di dati, con molti ordini o molti prodotti o anche custom post type. E quindi cè un problema.

Avendo molti oggetti da gestire può capitare di voler andare ad aggiornare dei parametri per ogni singolo post. Ma se ne abbiamo 50.000 di post farlo a mano è quasi impossibile.

Per questo vediamo come fare per aggiornare prodotti o per esempio ordini usando WP e le sue funzioni di cronjob.

function aggiorna_prossimo_batch_cpt() {
    $offset = get_option('cpt_aggiornati_offset', 0); // Ottieni l'offset corrente
    $limit = 10; // Numero di cpt da aggiornare per ogni batch

    // Ottieni un blocco di 10 cpt
    $args = array(
        'status' => 'any', // Puoi specificare lo status se necessario
        'limit' => $limit,
        'offset' => $offset,
        'orderby' => 'date',
        'order' => 'ASC',
      	'post_type' => 'tuo_post_type'
    );

    $custom_cpt = get_posts($args);

    if (empty($custom_cpt)) {
        // Se non ci sono più cpt, resetta l'offset e interrompi il cron job
        delete_option('cpt_aggiornati_offset');
      	// Facoltativo invia una email a fine ciclo
      	//wp_mail('[email protected]','WP Ciclo', 'Ciclo finito!'); 
        wp_clear_scheduled_hook('aggiorna_cpt_batch_cron');
        return;
    }

    foreach ($custom_cpt as $cpt) {
        $post_id = $cpt->get_id();
        // QUI FUNZIONE custom che andrà a svolgere tutto il lavoro
    }

    // Incrementa l'offset per il prossimo batch
    $offset += $limit;
    update_option('cpt_aggiornati_offset', $offset); // Salva il nuovo offset
}

// Registra il cron job personalizzato (thirty_seconds = ogni 30 secondi)
function registra_cron_job_aggiornamento_cpt() {
    if (!wp_next_scheduled('aggiorna_cpt_batch_cron')) {
        wp_schedule_event(time(), 'thirty_seconds', 'aggiorna_cpt_batch_cron');
    }
}
add_action('wp', 'registra_cron_job_aggiornamento_cpt');

// Aggiungi l'azione per eseguire il batch di aggiornamento
add_action('aggiorna_cpt_batch_cron', 'aggiorna_prossimo_batch_cpt');

// Intervallo di 30 secondi per il cron job
add_filter('cron_schedules', function($schedules) {
    $schedules['thirty_seconds'] = array(
        'interval' => 30,
        'display'  => __('Ogni 30 secondi')
    );
    return $schedules;
});

Sopra è tutto il meccanismo che serve per modificare ogni 30 secondi 10 custom post type o tutto quello che volete senza stressare il server.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *