web-dev-qa-db-ja.com

ワードプレスの外側/内側のダイナミクスiCalジェネレーター

だからこの記事から続けて: https://stackoverflow.com/q/1463480/1086990 私はそれがWordpressにそれを統合することが正確にどのように機能するか疑問に思いました。

私はカスタム投稿タイプの設定をしています、そして今のところ私は上記のリンクコードで "ical.php"へのリンクを試みました(そしてタイトルをthe_title()にそして日付を私のdate(..)コードのGMTバージョンに変えます)。 WPループ、またはWP関連ファイルではないため、明らかなget_post_custom_values()を見つけることができるため、何も動作しません。

次にheadersheader.php WPファイルに追加し、if(is_singular("event"))を追加することを試みましたが、ヘッダーは自動ダウンロードされます。私が自動ダウンロードを停止することができれば私はエースです、そうでなければ私は助けを求めてここに来ます!

自動的にではなく、リンクをクリックしたときにWPおよび のみ ダウンロードを介して動的に移入できる合理的な方法はありますか?

私はすべてのものをホストしますが、イベントは頻繁に行われるため、作成やホスティングは無駄になりますまた 自動的に機能するGoogleカレンダーのようなhrefジェネレータがあるかも


編集(私の作業コード):

カスタム分類ループ

<form action="<?php echo get_feed_link('calendar-event'); ?>" method="post">
    <input hidden="hidden" name="eventID" value="<?php the_ID(); ?>">
    <button title="Add to iCal" type="submit" name="iCalForm">iCal</button>
</form>

iCal.php 私はこれをrequire()を介してfunctions.phpに含めました。

<?php //Event ICAL feed
class SH_Event_ICAL_Export  {

    public function load() { add_feed('calendar-event', array(__CLASS__,'export_events')); }

    // Creates an ICAL file of events in the database
    public function export_events(){ 

        //Give the iCal export a filename
        $filename = urlencode( 'event-ical-' . date('Y-m-d') . '.ics' );

        //Collect output 
        ob_start();

        // File header
        header("Content-Description: File Transfer");
        header("Content-Disposition: attachment; filename=".$filename);
        header("Content-type: text/calendar");
        header("Pragma: 0");
        header("Expires: 0");
?>
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//<?php echo get_bloginfo('name'); ?> //NONSGML Events //EN
CALSCALE:GREGORIAN
X-WR-CALNAME:<?php echo get_bloginfo('name');?>: Events
<?php // Query for events

    if(isset($_POST['iCalForm'])) {
        $post_ID = $_POST['eventID'];
        $events = new WP_Query(array(
            'p' => $post_ID,
            'post_type' => 'event'  //Or whatever the name of your post type is
        ));

    if($events->have_posts()) : while($events->have_posts()) : $events->the_post();
        $uid = get_the_ID(); // Universal unique ID
        $dtstamp = date_i18n('Ymd\THis\Z',time(), true); // Date stamp for now.
        $created_date = get_post_time('Ymd\THis\Z', true, get_the_ID() ); // Time event created
        // Other pieces of "get_post_custom_values()" that make up for the StartDate, EndDate, EventOrganiser, Location, etc.
        // I also had a DeadlineDate which I included into the BEGIN:VALARM
        // Other notes I found while trying to figure this out was for All-Day events, you just need the date("Ymd"), assuming that Apple iCal is your main focus, and not Outlook, or others which I haven't tested :]
?>
BEGIN:VEVENT
CREATED:<?php echo $created_date;?>

UID:<?php echo $uid;?>

DTEND;VALUE=DATE:<?php echo $end_date; ?>

TRANSP:OPAQUE
SUMMARY:<?php echo $organiser; ?>

DTSTART;VALUE=DATE:<?php echo $start_date ; ?>

DTSTAMP:<?php echo $dtstamp;?>

LOCATION:<?php echo $location;?>

ORGANIZER:<?php echo $organiser;?>

URL;VALUE=URI:<?php echo "http://".$url; ?>

BEGIN:VALARM
ACTION:DISPLAY
TRIGGER;VALUE=DATE-TIME:<?php echo $dLine; ?>

DESCRIPTION:Closing submission day of films for <?php echo $organiser; ?>! Enter quickly!
END:VALARM
END:VEVENT
<?php endwhile; endif; } ?>
END:VCALENDAR
<?php //Collect output and echo 
    $eventsical = ob_get_contents();
    ob_end_clean();
    echo $eventsical;
    exit();
    }   

} // end class
SH_Event_ICAL_Export::load();
?>

それが素晴らしい作品であるので、これがそれを必要とする人にうまく役立つことを願っています、それではまた質問以上に手助けしてくれたStephen Harrisに感謝します。

2

私はWordPress 'feedsを使います。 add_feed を使用して独自のフィードを作成できます。コールバックを指定すると、このコールバックが出力を表示します。

フィードを作成する

add_feed('my-events','wpse56187_ical_cb');

wpse56187_ical_cbは、イベントの取得(WP_Queryを使用)、それらのイベントのループ処理、およびICALフィールドの印刷を担当します。

ICALファイルのダウンロード

あなたのフィードが 'my-events'の場合​​は、次のようにしてicalファイルをダウンロードできます。

www.yoursite.com?feed=my-events
www.yoursite.com/feed/my-events //If you have pretty permalinks

フィードへのリンクは get_feed_link() で取得できます。あなたのテンプレートにあなたのイベントのフィードへのリンクを作成したいのであれば:

<a href="<?php echo get_feed_link('my-events'); ?>" > Click here for ical file </a>

イベントの詳細をICAL形式で入力する方法の詳細は省略しました(これを行う方法は詳細の保存方法によって異なります)。

次のクラスは上記のメソッドを実装し、「my-events」というフィードを作成します。詳細が正しくフォーマットされていて有効であることを確認する必要があります( このサイトを参照

注意してください、私は以下をテストしていないので構文エラーがあるかもしれません

<?php
/**
 * Event ICAL feed
 */
class SH_Event_ICAL_Export  {

    public function load(){
        add_feed('my-events', array(__CLASS__,'export_events'));
    }

   /**
    * Creates an ICAL file of events in the database
    *  @param string filename - the name of the file to be created
    *  @param string filetype - the type of the file ('text/calendar')
    */ 
    public function export_events( ){ 

    //Give the ICAL a filename
    $filename = urlencode( 'event-ical-' . date('Y-m-d') . '.ics' );

    //Collect output 
    ob_start();

    // File header
    header( 'Content-Description: File Transfer' );
    header( 'Content-Disposition: attachment; filename=' . $filename );
    header('Content-type: text/calendar');
    header("Pragma: 0");
    header("Expires: 0");
?>
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//<?php  get_bloginfo('name'); ?>//NONSGML Events //EN
CALSCALE:GREGORIAN
X-WR-CALNAME:<?php echo get_bloginfo('name');?> - Events

<?php

    // Query for events
    $events = WP_Query(array(
         'post_type'=>'event' //Or whatever the name of your post type is
         'posts_per_page'=>-1 //Get all events
          ...
    ));

    if( $events->have_posts() ):
        while( $events->have_posts() ): $events->the_post();
            $uid=''; //Universal unique ID
            $dtstamp=date_i18n('Ymd\THis\Z',time(), true); //date stamp for now.
            $created_date=get_post_time('Ymd\THis\Z', true, get_the_ID() ); //time event created
            $start_date=""//event start date
            $end_date=""//event end date
            $reoccurrence_rule=false//event reoccurrence rule.
            $location=''//event location
            $organiser=''//event organiser
?>
BEGIN:VEVENT
UID:<?php echo $uid;?>

DTSTAMP:<?php echo $dtstamp;?>

CREATED:<?php echo $created_date;?>

DTSTART:<?php echo $start_date ; ?>

DTEND:<?php echo $end_date; ?>

<?php if ($reoccurrence_rule):?>
RRULE:<?php echo $reoccurrence_rule;?>

<?php endif;?>

LOCATION: <?php echo $location;?>

ORGANIZER: <?php $organiser;?>

END:VEVENT
<?php
        endwhile;
    endif;
?>
END:VCALENDAR
<?php

    //Collect output and echo 
    $eventsical = ob_get_contents();
    ob_end_clean();
    echo $eventsical;
    exit();
    }   

} // end class
SH_Event_ICAL_Export::load();
3
Stephen Harris

Stephenのものとは少し違うバージョンです。私はいくつかのものを統合し、他のものを変更しました。

プロジェクトでコードを使用しているので、コードはテスト済みで正常に機能します。

function add_calendar_feed(){
    add_feed('calendar', 'export_events');
    // Only uncomment these 2 lines the first time
    /*global $wp_rewrite;
    $wp_rewrite->flush_rules( false );*/
}
add_action('init', 'add_calendar_feed');

function export_events(){

   // Helper - Get the right time format, use this function or date_i18n('Ymd\THis\Z', $yourtimehere, true);
   /*function dateToCal($timestamp) {
       return date('Ymd\THis\Z', $timestamp);
   }*/
   // Helper - Escapes a string of characters
   function escapeString($string) {
       return preg_replace('/([\,;])/','\\\$1', $string);
   }
   // Helper - Cut it
   function shorter_version($string, $lenght) {
        if (strlen($string) >= $lenght) {
            return substr($string, 0, $lenght);
        } else {
            return $string;
        }
   }

    // Query the event
    $the_event = new WP_Query(array(
        'p' => $_REQUEST['id'],
        'post_type' => 'any',
    ));

    if($the_event->have_posts()) :

        while($the_event->have_posts()) : $the_event->the_post();

        $timestamp = date_i18n('Ymd\THis\Z',time(), true);
        $uid = get_the_ID();
        $created_date = get_post_time('Ymd\THis\Z', true, $uid ); // post creation
        $start_date = date_i18n('Ymd\THis\Z',time(), true); // EDIT THIS WITH START DATE VALUE
        $end_date = date_i18n('Ymd\THis\Z',time(), true); // EDIT THIS WITH END DATE VALUE
        $deadline = date_i18n('Ymd\THis\Z',time()-24, true); // deadline in BEGIN:VALARM
        $organiser = get_bloginfo('name'); // YOUR NAME OR SOME VALUE
        $address = ''; // EDIT THIS WITH SOME VALUE
        $url = get_the_permalink();
        $summary = get_the_excerpt();
        $content = trim(preg_replace('/\s\s+/', ' ', get_the_content())); // removes newlines and double spaces

        //Give the iCal export a filename
        $filename = urlencode( get_the_title().'-ical-' . date('Y-m-d') . '.ics' );
        $eol = "\r\n";

        //Collect output
        ob_start();

        // File header
        header("Content-Description: File Transfer");
        header("Content-Disposition: attachment; filename=".$filename);
        header('Content-type: text/calendar; charset=utf-8');
        header("Pragma: 0");
        header("Expires: 0");
?>
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//<?php echo get_bloginfo('name'); ?> //NONSGML Events //EN
CALSCALE:GREGORIAN
X-WR-CALNAME:<?php echo get_bloginfo('name');?>
BEGIN:VEVENT
CREATED:<?php echo $created_date.$eol;?>
UID:<?php echo $uid.$eol;?>
DTEND;VALUE=DATE:<?php echo $end_date.$eol; ?>
DTSTART;VALUE=DATE:<?php echo $start_date.$eol; ?>
DTSTAMP:<?php echo $timestamp.$eol; ?>
LOCATION:<?php echo escapeString($address).$eol; ?>
DESCRIPTION:<?php echo shorter_version($content,70).$eol; ?>
SUMMARY:<?php echo escapeString(get_the_title()).$eol; ?>
ORGANIZER:<?php echo escapeString($organiser).$eol;?>
URL;VALUE=URI:<?php echo escapeString($url).$eol; ?>
TRANSP:OPAQUE
BEGIN:VALARM
ACTION:DISPLAY
TRIGGER;VALUE=DATE-TIME:<?php echo $deadline.$eol; ?>
DESCRIPTION:Fine / Scadenza di <?php echo escapeString(get_the_title()); echo $eol; ?>
END:VALARM
END:VEVENT
<?php
        endwhile;
?>
END:VCALENDAR
<?php
        //Collect output and echo
        $eventsical = ob_get_contents();
        ob_end_clean();
        echo $eventsical;
        exit();

    endif;

}
?>

あなたのテーマでは、このリンクを使用してください:

<a href="<?php echo get_feed_link('calendar'); ?>?id=<?php echo get_the_ID(); ?>">Get the ical file </a>

それから 要旨 を作った(フォークした)、もう少し情報を入れて。

0
The J