如果用户尚未完成其个人资料,则每周发送电子邮件

时间:2016-10-03 作者:Kevin Mamaqi

我已经创建了一个每周发送电子邮件的功能,但它似乎不起作用,我也不知道为什么。此外,由于缺乏使用wp\\u cron和wp\\u mail的经验,我还有一些疑问,下面是我需要的和我的疑问,以及我的代码:

设置每周定期事件。(link)首先:

/**
 * Weekly schedule for WordPress
 */
function intervalo_semanal_para_emails( $schedules ) {
  // add a \'weekly\' schedule to the existing set
  $schedules[\'weekly\'] = array(
    \'interval\' => 604800,
    \'display\' => __(\'Once Weekly\')
  );
  return $schedules;
}
add_filter( \'cron_schedules\', \'intervalo_semanal_para_emails\' ); 
第二个:

/**
 * Get the Users and send an email each monday
 */

// schedule the enviar_email_a_preparadores event only once
if( !wp_next_scheduled( \'enviar_email_a_preparadores\' ) ) {
   wp_schedule_event( 1476118800, \'weekly\', \'enviar_email_a_preparadores\' );
}
第三,其余:

add_action( \'enviar_email_a_preparadores\', \'send_email_to_uncompleted_profiles\' );
function send_email_to_uncompleted_profiles() {

  $preparadores = get_users( array( \'role__in\' => \'preparador\' ) );

  foreach ( $preparadores as $preparador ) {

    /* Get the ACF ID to retrieve the custom fields */
    $user_id_acf = \'user_\'.$preparador->ID; /* I use ACF for some fields */

    /* Get the User Alias */
    $alias_author = get_the_author_meta( \'nickname\', $preparador->ID );

    /* 
     * Check if the fields are complete, if not, store as variables to use in the Mail Function
     */

    // Descripción Breve
    if (!get_field(\'descripcion_breve\', $user_id_acf)) {
      $descripcion_breve = "<strong>Descripción breve</strong>: Por favor, añade una descripción breve a tu perfil.";
    }

    // Titulación del preparador
    if (!get_field(\'titulacion_preparador\', $user_id_acf)) {
      $titulacion_preparador = "<strong>Titulación</strong>: Por favor, añade cual es tu titulación.";
    }

    // Alias del Preparador
    if (empty($alias_author)) {
      $alias_preparador = "<strong>Alias</strong>: Por favor, añade un Alias a tu perfil para que te identifiquen.";
    }

    // Experiencia del Preparador
    if (!get_field(\'experiencia_desde\', $user_id_acf)) {
      $experiencia_desde = "<strong>Experiencia desde</strong>: Indica desde cuando tienes experiencia como preparador.";
    }

    // Precio/Hora
    if (!get_field(\'precio_hora_preparador\', $user_id_acf)) {
      $precio_hora_preparador = "<strong>Precio/hora</strong>: Por favor, añade un precio/hora aproximado.";
    }

    // Conocimiento Interno del Organismo Convocante
    if (!get_field(\'conocimiento_interno\', $user_id_acf)) {
      $conocimiento_interno = "<strong>Conocimiento Interno</strong>: Por favor, indica si tienes conocimiento de la plaza para la que preparas.";
    }

    // Comprobar si los campos estan completos para no hacer nada
    if ( 
      get_field(\'descripcion_breve\', $user_id_acf) &&
      get_field(\'titulacion_preparador\', $user_id_acf) &&
      empty($alias_author) &&
      get_field(\'experiencia_desde\', $user_id_acf) &&
      get_field(\'precio_hora_preparador\', $user_id_acf) &&
      get_field(\'conocimiento_interno\', $user_id_acf)
    ) {
      return;
    } else {

      $to = $preparador->user_email;
      $subject = \'Por favor, actualiza tu perfil\';
      $message = \'<p>Hola \' . $current_user->user_login . \'</p>\';
      $message .= \'<p>Nos ponemos en contacto contigo para avisarte del estado de tu perfil, recuerda que completarlo es necesario para que este se publique y genere interés entre los opositores. A continuación te detallamos los campos que faltan por rellenar:</p>\'
      $message .= \'<ul>\';
      $message .= if (!get_field(\'descripcion_breve\', $user_id_acf)) {
        echo \'<li>\' . $descripcion_breve . \'</li>\';
      }
      $message .= if (!get_field(\'titulacion_preparador\', $user_id_acf)) {
        echo \'<li>\' . $titulacion_preparador . \'</li>\';
      }
      $message .= if (empty($alias_author)) {
        echo \'<li>\' . $alias_preparador . \'</li>\';
      }
      $message .= if (!get_field(\'experiencia_desde\', $user_id_acf)) {
        echo \'<li>\' . $experiencia_desde . \'</li>\';
      }
      $message .= if (!get_field(\'precio_hora_preparador\', $user_id_acf)) {
        echo \'<li>\' . $precio_hora_preparador . \'</li>\';
      }
      $message .= if (!get_field(\'conocimiento_interno\', $user_id_acf)) {
        echo \'<li>\' . $conocimiento_interno . \'</li>\';
      }
      $message .= \'</ul>\';
      $message .= \'<p>Por favor, no respondas a este mensaje. Si necesitas ayuda accede a la <a href="example.com/help/">guía de preparadores</a> o ponte en <a href="example.com/contacto/">contacto</a>.\';

      $headers[] = \'From: Myname.com <[email protected]>;\' . \'\\r\\n\';
      $headers[] = \'Bcc: My name <[email protected]>\'; /* To check if the emails is arriving and how it arrives.*/
      $headers[] = array(\'Content-Type: text/html; charset=UTF-8\');

      wp_mail( $to, $subject, $message, $headers );
    }
  }
}

1 个回复
最合适的回答,由SO网友:cybmeta 整理而成

乍一看,代码中的调度任务代码似乎还可以。我只是建议在插件停用时引入计划任务清除;这有几个原因,其中一个原因可能是问题的根源:如果您正在测试,则可能已经设置了计划的事件,并且代码中的此代码片段对再次计划事件没有任何影响:

if( ! wp_next_scheduled( \'enviar_email_a_preparadores\' ) ) {
   wp_schedule_event( 1476118800, \'weekly\', \'enviar_email_a_preparadores\' );
}
此代码应适用于:

add_filter( \'cron_schedules\', \'intervalo_semanal_para_emails\' );
function intervalo_semanal_para_emails( $schedules ) {

  $schedules[\'weekly\'] = array(
    \'interval\' => 604800,
    \'display\' => __(\'Once Weekly\')
  );

  return $schedules;

}

register_activation_hook( __FILE__, \'cyb_activation\' );
function cyb_activation() {
    // Add a scheduled task on plugin activation
    // Fist run at 2016-10-10 17:00:00 UTC
    $time = new DateTime( "2016-10-10 17:00:00", new DateTimeZone( \'UTC\' ) );
    if( ! wp_next_scheduled( \'cyb_weekly_event\' ) ) {
        wp_schedule_event( $time->getTimestamp(), \'weekly\', \'cyb_weekly_event\' );
    }

}

register_deactivation_hook( __FILE__, \'cyb_deactivation\' );
function cyb_deactivation() {
    // Remove scheduled task on plugin deactivation
    wp_clear_scheduled_hook( \'cyb_weekly_event\' );
}

// Hook a task to the scheduled event
add_action( \'cyb_weekly_event\', \'send_email_to_uncompleted_profiles\' );
function send_email_to_uncompleted_profiles() {
    // log a message to test.
    // Check error.log file in your server
    // See error_log() docuemntation if you want to
    // set a custom error.log file path
    error_log( \'Test!!\' );

    /*
    if( true === $condition_to_send_email ) {
        wp_mail( ... );
    }
    */

}
一旦设置了cron并检查它是否正常工作,就可以从发送邮件测试开始。

不幸的是,您发布的代码包含第三方插件的代码,无法按原样进行测试(另外,third party plugins are off-topic here); 无论如何,您正在回显数据并使用if 在值分配中。这使得您的代码崩溃,因为PHP syntax fatal error; 例如,您答案中的代码错误:

  $message .= \'<ul>\';
  $message .= if (! get_field(\'descripcion_breve\', $user_id_acf)) {
    echo \'<li>\' . $descripcion_breve . \'</li>\';
  }
有几种连接字符串的方法,对于exmaple,这是一个简单的选项:

  $message .= \'<ul>\';
  if ( ! get_field( \'descripcion_breve\', $user_id_acf ) ) {
    $message .=  \'<li>\' . $descripcion_breve . \'</li>\';
  }
我希望你能看到不同之处。

相关推荐

Wp_Get_Scheduled和wp_Next_Scheduled找不到我计划的wp-cron作业

我尝试了以下两种方法,每种方法都会反复添加cronjob,直到我删除代码为止。我已经安排了数百次了。。。if(!wp_next_scheduled(\'send_order_surveys\')){ wp_schedule_event(time(), \'30min\', \'send_order_surveys\'); } if(!wp_get_schedule(\'send_order_surveys\')){ wp_schedule_event