通过WordPress生成并发送ICS文件

时间:2019-03-20 作者:ZWPDev

我正在为预订编写一个自定义插件。我需要生成一个。需要发送到预定义电子邮件地址的ics文件。

我尝试了一些库,比如ZContent iCalendar和在github上找到的PHP脚本,这些脚本包含在插件代码中。脚本运行良好,我可以获得有效的输出。问题是我不知道如何生成ics文件并使用wp\\U mail功能将其附加到电子邮件。

这是我的代码:

<?php
/**
 * ICS.php
 * =======
 * Use this class to create an .ics file.
 *
 * Usage
 * -----
 * Basic usage - generate ics file contents (see below for available properties):
 *   $ics = new ICS($props);
 *   $ics_file_contents = $ics->to_string();
 *
 * Setting properties after instantiation
 *   $ics = new ICS();
 *   $ics->set(\'summary\', \'My awesome event\');
 *
 * You can also set multiple properties at the same time by using an array:
 *   $ics->set(array(
 *     \'dtstart\' => \'now + 30 minutes\',
 *     \'dtend\' => \'now + 1 hour\'
 *   ));
 *
 * Available properties
 * --------------------
 * description
 *   String description of the event.
 * dtend
 *   A date/time stamp designating the end of the event. You can use either a
 *   DateTime object or a PHP datetime format string (e.g. "now + 1 hour").
 * dtstart
 *   A date/time stamp designating the start of the event. You can use either a
 *   DateTime object or a PHP datetime format string (e.g. "now + 1 hour").
 * location
 *   String address or description of the location of the event.
 * summary
 *   String short summary of the event - usually used as the title.
 * url
 *   A url to attach to the the event. Make sure to add the protocol (http://
 *   or https://).
 */
class WP_ICS{
  const DT_FORMAT = \'Ymd\\THis\\Z\';
  protected $properties = array();
  private $available_properties = array(
    \'description\',
    \'dtend\',
    \'dtstart\',
    \'location\',
    \'summary\',
    \'url\'
  );
  public function __construct($props) {
    $this->set($props);
  }
  public function set($key, $val = false) {
    if (is_array($key)) {
      foreach ($key as $k => $v) {
        $this->set($k, $v);
      }
    } else {
      if (in_array($key, $this->available_properties)) {
        $this->properties[$key] = $this->sanitize_val($val, $key);
      }
    }
  }
  public function to_string() {
    $rows = $this->build_props();
    return implode("\\r\\n", $rows);
  }
  private function build_props() {
    // Build ICS properties - add header
    $ics_props = array(
      \'BEGIN:VCALENDAR\',
      \'VERSION:2.0\',
      \'PRODID:-//hacksw/handcal//NONSGML v1.0//EN\',
      \'CALSCALE:GREGORIAN\',
      \'BEGIN:VEVENT\'
    );
    // Build ICS properties - add header
    $props = array();
    foreach($this->properties as $k => $v) {
      $props[strtoupper($k . ($k === \'url\' ? \';VALUE=URI\' : \'\'))] = $v;
    }
    // Set some default values
    $props[\'DTSTAMP\'] = $this->format_timestamp(\'now\');
    $props[\'UID\'] = uniqid();
    // Append properties
    foreach ($props as $k => $v) {
      $ics_props[] = "$k:$v";
    }
    // Build ICS properties - add footer
    $ics_props[] = \'END:VEVENT\';
    $ics_props[] = \'END:VCALENDAR\';
    return $ics_props;
  }
  private function sanitize_val($val, $key = false) {
    switch($key) {
      case \'dtend\':
      case \'dtstamp\':
      case \'dtstart\':
        $val = $this->format_timestamp($val);
        break;
      default:
        $val = $this->escape_string($val);
    }
    return $val;
  }
  private function format_timestamp($timestamp) {
    $dt = new DateTime($timestamp);
    return $dt->format(self::DT_FORMAT);
  }
  private function escape_string($str) {
    return preg_replace(\'/([\\,;])/\',\'\\\\\\$1\', $str);
  }
}


class iCalBooking{

  public function init(){
    add_action(\'admin_post_forward_booking_request\', array($this, \'send_booking_request\'));
    add_action(\'admin_post_nopriv_forward_booking_request\', array($this, \'send_booking_request\'));
    #add_action();
    add_shortcode(\'booking\', array($this, \'display_booking_form\'));
  }

  public function display_booking_form(){
    include_once \'booking-form.php\';
  }

  private function has_valid_nonce() {
      if(!isset( $_POST[\'booking_nonce\'] )){
        return false;
      }
      $field  = wp_unslash( $_POST[\'booking_nonce\'] );
      $action = \'validate_booking_request\';
      return wp_verify_nonce( $field, $action );
  }

  public function send_booking_request(){
    if(! ( $this->has_valid_nonce() ) ){
      return;
    }
    $fname = $_POST[\'client_fname\'];
    $lname = $_POST[\'client_lname\'];
    $phone = $_POS[\'client_phone\'];
    $email = $_POST[\'client_email\'];

    $title = \'Prenotazione\';

    $description = $fname . $lname . $phone . $email;


    $ics = new WP_ICS(array(
      \'location\' => \'\',
      \'description\' => $description,
      \'dtstart\' => $_POST[\'client_checkin\'],
      \'dtend\' => $_POST[\'client_checkout\'],
      \'summary\' => \'\',
      \'url\' => \'\'
    ));

    file_put_contents(\'reservation.ics\', $ics->to_string() );

    #header(\'Content-Type: text/calendar; charset=utf-8\');
    #header(\'Content-Disposition: attachment; filename=reservation.ics\');


  }

}

$booking = new iCalBooking;
$booking->init();
?> 

1 个回复
SO网友:butlerblog

这是未经测试的,但这是您需要采取的方法。我正在讨论你们班的最后一种方法。

以下是我的做法:

保存文件时需要指定文件路径,以便以后使用该路径来附加文件

  • 使用#2中的变量for wp\\u mail()发送邮件
  • 这是您的类中的函数和我的补充:

    public function send_booking_request(){
        if(! ( $this->has_valid_nonce() ) ){
          return;
        }
        $fname = $_POST[\'client_fname\'];
        $lname = $_POST[\'client_lname\'];
        $phone = $_POS[\'client_phone\'];
        $email = $_POST[\'client_email\'];
    
        $title = \'Prenotazione\';
    
        $description = $fname . $lname . $phone . $email;
    
    
        $ics = new WP_ICS(array(
          \'location\' => \'\',
          \'description\' => $description,
          \'dtstart\' => $_POST[\'client_checkin\'],
          \'dtend\' => $_POST[\'client_checkout\'],
          \'summary\' => \'\',
          \'url\' => \'\'
        ));
    
    
        // You need to specify the path here so you can use it later to get the attachment
        $uploads = wp_upload_dir();
        $path = $uploads[\'path\'];
    
        file_put_contents( $path . \'/reservation.ics\', $ics->to_string() );
    
        // Set up email
        $to = \'you@email.com\';
        $subject = "reservation file";
        $message = "Please see attached reservation.";
        $headers = \'From: My Name <myname@mydomain.com>\' . "\\r\\n";
        $attachments = array( $path . \'/reservation.ics\' );
    
        // Send the email.
        wp_mail( $to, $subject, $message, $headers, $attachments );
    
        #header(\'Content-Type: text/calendar; charset=utf-8\');
        #header(\'Content-Disposition: attachment; filename=reservation.ics\');
    
    }
    
    假设您的其余代码正常,并且文件已创建,则应该能够获取该文件并将其附加到电子邮件中。