reminder wp_schedule_event

时间:2021-03-18 作者:Dimitry

嗨,我使用此插件创建事件https://wordpress.org/plugins/modern-events-calendar-lite/ 这是在我的android应用程序上发送通知。https://github.com/dream-space/wp-fcm

我对插件进行了修改,以便在3天前发送即将发生的事件的提醒通知。修改如下所示。

`

 function fcm_main_get_option_event(){
  $options = get_option(\'fcm_event_setting\');
  if(!is_array($options)){
    $options = array(
        \'event_check\' => 0,
    );
 }

return $options;
}

if (!wp_next_scheduled(\'my_task_hook\')) {
wp_schedule_event( time(), \'daily\', \'my_task_hook\' );
}
add_action ( \'my_task_hook\', \'my_task_function\' );
`

和发送通知的功能:

`

function my_task_function() {
$options  = get_option(\'fcm_event_setting\');
 //  $is_send_notif = false;
if(!empty($options[\'event_check\'])) {
   $is_send_notif = true;
  $args = array(  
    \'post_type\' => \'mec-events\',
    \'post_status\' => \'publish\',
    \'posts_per_page\' => -1, 
  );

$loop = new WP_Query( $args ); 

    
while ( $loop->have_posts() ) : $loop->the_post(); 
$datetime2 = date("Y-m-d"); 
$my_meta = get_post_meta(get_the_ID(), \'mec_start_date\', true ); 
$diff = strtotime($my_meta) - strtotime($datetime2);
    $gap = abs(round($diff / 86400)); 

    
    if($gap == \'3\'){
         $is_send_notif = true;
         $title = \'Потсетување\';
         $event = "POTSETNIK 1";
        $body    = \'For \'.$gap.\' days :\' .get_the_title();

    }


    if($is_send_notif == true){
    $message = array(
        \'title\'     => $title,
        \'content\'   =>  \'For \'.$gap.\' days:\' .get_the_title()

    );

    $total = fcm_data_get_all_count();
    if($total <= 0) return;

    $respon  = fcm_notif_divide_send("", $total, $message);

    fcm_data_insert_log($title, $content, "ALL", $event, $respon[\'status\']);
}
    endwhile;
wp_reset_postdata();
}
}
`

这项工作,但在活动前3天和活动后3天发送通知。

问题出在哪里。

谢谢

1 个回复
SO网友:Jacob Peattie

这是因为您的代码是显式编写的,可以忽略事件是否发生在过去或未来。

请参见此处:

$diff = strtotime($my_meta) - strtotime($datetime2);
如果活动日期在将来,$diff 将是一个正数,但如果是过去的话,它将是一个负数。接下来的一行是:

$gap = abs(round($diff / 86400));
整个要点abs() 函数用于确保数字是正数。这意味着无论事件发生在过去还是未来,结果都将完全相同。

如果您只想为即将到来的事件发送通知,那么您需要知道该数字是否为负数。所以只需删除abs() 确保您只检查3 而不是-3:

$diff = strtotime($my_meta) - strtotime($datetime2);
$gap = round($diff / 86400); 


if($gap === 3){
    // etc.
}

相关推荐

Can I make plugins required?

我正在开发自己的Wordpress主题,将用于多个客户端。它有一个主题选项页面,这样我每次都可以轻松自定义网站,但我也会在我制作的每个网站上使用一些插件(如SEO插件、安全性等)。有没有办法让它们成为“必需的”,这样我就可以得到这些插件的列表,这样当我在新网站上安装主题时就不必在插件目录中找到它们了?