我已经创建了一个每周发送电子邮件的功能,但它似乎不起作用,我也不知道为什么。此外,由于缺乏使用wp\\u cron和wp\\u mail的经验,我还有一些疑问,下面是我需要的和我的疑问,以及我的代码:
设置每周定期事件。(link)活动计划于2016年10月10日下午5点开始,每周仅举行一次。(我已经把它安排在今天早上进行测试,所以我知道它不起作用)。我不确定是每周还是每次访问该网站时都会发生火灾获取用户并检查每个字段是否完整如果其中一个字段不完整,请发送电子邮件设置电子邮件参数,如下所示首先:
/**
* 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 );
}
}
}
最合适的回答,由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>\';
}
我希望你能看到不同之处。