我尝试在 cronjob 任务中使用 wp_mail,但没有发送电子邮件。相反,纯 php 函数 mail() 可以工作。
问题 1):为什么 mail() 可以工作,而 wp_mail 却不能?
问题 2):手动调用 www.domain.de/wp-cron.php 会触发电子邮件。但收到的电子邮件的html电子邮件正文仍然是一个字符串,没有转换为html。你知道为什么吗?
搜索解决方案,找到了一些。根据这篇文章(WordPress 中的 Cron 作业不起作用),我像这样设置了我的 cronjob:
设置自定义间隔:
function example_add_cron_interval( $schedules ) {
$schedules['five_seconds'] = array(
'interval' => 5,
'display' => esc_html__( 'Every Five Seconds' ),
);
$schedules['daily'] = array(
'display' => esc_html__( 'Once Daily' )
);
return $schedules;
}
add_filter( 'cron_schedules', 'example_add_cron_interval', 999 );
激活定时任务:
function cron_activation() {
if( !wp_next_scheduled( 'dbs_cron_hook' ) ) {
wp_schedule_event(time(), 'daily', 'dbs_cron_hook' );
}
}
add_action('init', 'cron_activation');
做逻辑: 函数 my_task_function() {
$max_hours = 336; // entspricht 2 Wochen
global $post;
$args = array( 'post_type' => 'bookings', );
$booking_listing = new WP_Query( $args );
$mail_body = '<table>';
if( $booking_listing->have_posts() ) :
while( $booking_listing->have_posts() ) : $booking_listing->the_post();
$post_id = get_the_ID();
$email_sent_timestamp = intval( get_post_meta( $post_id, 'approvement_email_sent', true ) );
$event_id = intval( get_post_meta( $post_id, 'event_id', true ) );
if( $email_sent_timestamp != 0 ){
$date = date_create();
$now_timestamp = date_timestamp_get($date);
$hoursPassed = diff_timestamp( $now_timestamp, $email_sent_timestamp );
var_dump($hoursPassed["full_hours"] >= $max_hours);
if( $hoursPassed >= $max_hours ){
update_post_meta( $event_id, 'event_reserved', intval(0) );
$mail_body .= '<tr><td>BuchungsNr ' . $post_id . ': 2 Wochen sind abgelaufen.</td></tr><tr><td>Der Termin ' . $event_id . ' wurde wieder aktiviert.</td></tr>';
}
}
endwhile;
else:
wp_send_json_error( "No events found" );
endif;
$mail_body .= '</table>';
var_dump($max_hours);
// wp_mail( '[email protected]', 'Rervierung ' . $post_id . ' abgelaufen', $mail_body );
mail( '[email protected]', 'Rervierung ' . $post_id . ' abgelaufen', $mail_body );
}
add_action( 'dbs_cron_hook', 'my_task_function' );
我像这样在 config.php 中禁用了 wp cron
define('DISABLE_WP_CRON', true);
并像这样在服务器上设置系统 cronjob
* */1 * * * /vrmd/webserver/php70/bin/php-cli /homepages/xxxxxx/wp-cron.php > /dev/null
希望你能帮助我。
编辑问题 2:只需在 mail() 函数中使用 $headers
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
mail( $to, $subject, $mail_body, $headers );
问题1还在想...
WordPress 使用伪 cron 系统
wp-cron.php
来处理计划任务,这包括发送由事件或计划任务触发的电子邮件
您可以将以下行添加到 wp-config.php 文件中,以强制运行真正的 cron 作业,而不是依赖于 Web 请求。
define('DISABLE_WP_CRON', true);