Je cherche à utiliser wp cron job pour synchroniser deux méta-champs utilisateur par mois. J'utilise un plugin génial appelé "SyncFields" et tout fonctionne automatiquement, mais je cherche à le synchroniser tous les mois.
Si vous souhaitez supprimer la fonctionnalité du plug-in d'origine, essayez de l'ajouter au fichier functions.php de votre thème.
function add_thirty_day_cron($schedules) {
$schedules['thirtydays'] = array( 'interval' => 30 * DAY_IN_SECONDS, 'display' => __( 'Every 30 days') );
return $schedules;
}
add_filter('cron_schedules','add_thirty_day_cron');//adds 30 day interval
add_action('do_meta_sync', 'my_meta_sync');//hook for cron
function my_meta_sync() {
if (function_exists('msf_action_callback')) msf_action_callback();
}
function modify_syncfields_sync() {
remove_action('edit_user_profile_update', 'msf_action_callback');
remove_action('profile_update', 'msf_action_callback');
}
add_action('plugins_loaded','modify_syncfields_sync');//removes plugin actions
add_action('wp_loaded','add_my_sync_cron');//schedules cron
function add_my_sync_cron() {
if (!wp_next_scheduled('do_meta_sync')) wp_schedule_event(time(), 'thirtydays', 'do_meta_sync');
}
Si vous ne souhaitez plus utiliser le plugin, voici deux options. Le premier sera exécuté tous les trente jours à compter du premier jour du mois prochain.
function my_meta_sync() {
$users = get_users();
foreach ($users as $user) {
$meta = get_user_meta( $user->ID );
if ($meta['firstname'][0] != $meta['billing_firstname'][0]) update_user_meta( $user->ID, $meta['billing_firstname'][0], $meta['firstname'][0] );
}
}
//use this code for 30 day intervals
add_filter('cron_schedules','add_thirty_day_cron');//adds 30 day interval
function add_thirty_day_cron($schedules) {
$schedules['thirtydays'] = array( 'interval' => 30 * DAY_IN_SECONDS, 'display' => __( 'Every 30 days') );
return $schedules;
}
add_action('do_thirty_day_meta_sync', 'my_meta_sync');//hook for cron
add_action('wp_loaded','add_my_thirty_day_sync_cron');//schedules cron
function add_my_thirty_day_sync_cron() {
if (!wp_next_scheduled('do_thirty_day_meta_sync')) {
$timestamp = date_create('first day of next month')->format('U');
wp_schedule_event($timestamp, 'thirtydays', 'do_thirty_day_meta_sync');
}
}
//end
Pour exécuter la synchronisation le premier jour du mois, vous devez planifier un cron quotidien.
function my_meta_sync() {
$users = get_users();
foreach ($users as $user) {
$meta = get_user_meta( $user->ID );
if ($meta['firstname'][0] != $meta['billing_firstname'][0]) update_user_meta( $user->ID, $meta['billing_firstname'][0], $meta['firstname'][0] );
}
}
function my_monthly_meta_sync() {
if (date('d') == '01') my_meta_sync();
}
function add_daily_tasks() {
if (!wp_next_scheduled('my_daily_cron')) wp_schedule_event(time(), 'daily', 'my_daily_cron');
}
add_action('wp_loaded','add_daily_tasks');//schedules cron
function my_daily_tasks(){
my_monthly_meta_sync();
}
add_action('my_daily_cron','my_daily_tasks');
//end
J'ai créé une tâche périodique quotidienne générique, car une fois que vous êtes habitué à exécuter des tâches de style cron, en particulier des tâches quotidiennes, vous aurez envie de faire plus. Pour aller de l'avant, tout ce que vous avez à faire est d'appeler vos nouvelles fonctions dans la my_daily_tasks()
et vous n'aurez pas à créer plus de points d'ancrage cron tant qu'ils sont indépendants de l'heure.
Je recommanderais également d'installer un plug-in cron (j'utilise WP Crontrol) pour voir ce qui se passe dans vos tâches cron. Vous pouvez aussi créer/supprimer des crons en utilisant le plugin plutôt que d'utiliser wp_schedule_event()
comme je l'ai fait dans le code.