web-dev-qa-db-fra.com

Synchroniser les champs méta des utilisateurs à l'aide du travail cron Wp

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.

1
Gamal Elwazeery

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.

0
jdp