Enviar e-mail semanal se os usuários não completarem seus perfis

Criei uma function para enviar um email a cada semana, mas não parece funcionar e não sei por quê. Além disso, tenho várias dúvidas devido à minha falta de experiência com wp_cron e wp_mail, então aqui está o que eu preciso e minhas duvidas e abaixo do meu código:

  1. Defina um evento recorrente semanal. ( link )
  2. Programe o evento para começar em 2016/10/10 às 5h da UTF e apenas dispare uma vez por semana. (Eu já agendado para esta manhã para fins de teste, é assim que eu sei que não está funcionando). Não tenho certeza se vai triggersr todas as semanas ou cada vez que o site recebe uma visita.
  3. Obtenha os usuários e verifique todos os campos se estiver completo.
  4. Envie um email se um dos campos não estiver completo.
  5. Defina os parâmetros de email como mostrado abaixo.

Primeiro:

/** * 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' ); 

Segundo:

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

Terceiro e o resto:

 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 = "Descripción breve: 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 = "Titulación: Por favor, añade cual es tu titulación."; } // Alias del Preparador if (empty($alias_author)) { $alias_preparador = "Alias: 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 = "Experiencia desde: Indica desde cuando tienes experiencia como preparador."; } // Precio/Hora if (!get_field('precio_hora_preparador', $user_id_acf)) { $precio_hora_preparador = "Precio/hora: Por favor, añade un precio/hora aproximado."; } // Conocimiento Interno del Organismo Convocante if (!get_field('conocimiento_interno', $user_id_acf)) { $conocimiento_interno = "Conocimiento Interno: 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 = '

Hola ' . $current_user->user_login . '

'; $message .= '

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:

' $message .= '
    '; $message .= if (!get_field('descripcion_breve', $user_id_acf)) { echo '
  • ' . $descripcion_breve . '
  • '; } $message .= if (!get_field('titulacion_preparador', $user_id_acf)) { echo '
  • ' . $titulacion_preparador . '
  • '; } $message .= if (empty($alias_author)) { echo '
  • ' . $alias_preparador . '
  • '; } $message .= if (!get_field('experiencia_desde', $user_id_acf)) { echo '
  • ' . $experiencia_desde . '
  • '; } $message .= if (!get_field('precio_hora_preparador', $user_id_acf)) { echo '
  • ' . $precio_hora_preparador . '
  • '; } $message .= if (!get_field('conocimiento_interno', $user_id_acf)) { echo '
  • ' . $conocimiento_interno . '
  • '; } $message .= '
'; $message .= '

Por favor, no respondas a este mensaje. Si necesitas ayuda accede a la guía de preparadores o ponte en contacto.'; $headers[] = 'From: Myname.com ;' . '\r\n'; $headers[] = 'Bcc: My name '; /* 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 ); } } }

Solutions Collecting From Web of "Enviar e-mail semanal se os usuários não completarem seus perfis"

Na primeira exibição, o código de tarefa esquentado em seu código parece estar bem. Eu apenas sugeriria que as tarefas programadas estivessem esvaziando a desativação do plugin; Isso é útil por várias razões e um deles pode ser a origem do seu problema: se você estiver testando, o evento agendado já pode ser configurado e esse trecho no seu código não tem efeito para agendar novamente o evento:

 if( ! wp_next_scheduled( 'enviar_email_a_preparadores' ) ) { wp_schedule_event( 1476118800, 'weekly', 'enviar_email_a_preparadores' ); } 

Este código deve funcionar:

 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( ... ); } */ } 

Depois de configurar o cron e verificar se está funcionando, você pode começar com o teste de envio de correio.

Infelizmente, o código que você publicou inclui código para plugins de terceiros e não pode ser testado como está (também, os plugins de terceiros são off-topic aqui ); De qualquer forma, você está ecoando dados e usando if dentro de um valor assigment. Isso faz com que seu código seja travado porque um erro fatal da syntax do PHP ; por exemplo, este código na sua resposta é errado:

  $message .= '
    '; $message .= if (! get_field('descripcion_breve', $user_id_acf)) { echo '
  • ' . $descripcion_breve . '
  • '; }

Existem várias maneiras de concatenar cordas, por exemplo, uma opção simples:

  $message .= '
    '; if ( ! get_field( 'descripcion_breve', $user_id_acf ) ) { $message .= '
  • ' . $descripcion_breve . '
  • '; }

Espero que você veja a diferença.