Синхронизируйте мета-поля пользователя с помощью задания Wp cron


Я ищу информацию об использовании задания wp cron для ежемесячной синхронизации двух пользовательских мета-полей. Я использую очень потрясающий плагин под названием "Syncfields", и он отлично работает автоматически, Но я ищу синхронизацию каждый месяц.

 1
Author: Gamal Elwazeery, 2018-11-20

1 answers

Если вы хотите удалить функциональность оригинального плагина, попробуйте добавить это в свою тему functions.php файл

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

Если вы больше не хотите использовать плагин, вот два варианта. Первый будет проходить каждые тридцать дней, начиная с первого числа следующего месяца.

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

Чтобы запустить синхронизацию в первый день месяца, вам нужно запланировать ежедневный cron.

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

Я создал общую ежедневную задачу cron, потому что, как только вы привыкнете работать в стиле cron задач, особенно ежедневных, вам захочется выполнять больше. В дальнейшем все, что вам нужно сделать, это вызвать ваши новые функции внутри my_daily_tasks(), и вам не придется создавать больше крючков cron, если они не зависят от времени суток.

Я бы также рекомендовал установить плагин cron (я использую WP Crontrol), чтобы посмотреть, что происходит в ваших заданиях cron. Вы также можете создавать/удалять кроны с помощью плагина, а не с помощью wp_schedule_event(), как я делал в жестком коде.

 0
Author: jdp, 2018-11-21 18:03:28