这完全是基于Event Organiser (我开发的一个插件)。代码几乎是直接从源代码中提取出来的,但经过了修改。因此,我没有按照给定的方式测试代码。
步骤1:创建提要这很简单:
add_action(\'init\',\'wpse63611_add_events_feed\');
function wpse63611_add_events_feed(){
add_feed(\'my-events\',\'wpse63611_events_feed_output\');
}
这会向您的网站添加一个提要:
www.site.com?feed=my-events
或
www.site.com/feed/my-events
如果你有很长的头发。这个
wpse63611_events_feed_output()
回调将输出ICAL文件的内容。但首先。。。
第二步:改变查询,WordPress不知道这个提要要包含什么。这里我们使用pre_get_posts
告诉WordPress,对于这个feed,我们希望帖子类型为“wr\\u event”。我们可以从特定类别、地点或特定日期之间获得活动。
通过将查询与输出分离,您可以有多个feed,它们使用相同的输出函数,但查询不同的事件(基于时间、位置、类别等)。
add_action( \'pre_get_posts\', \'wpse63611_event_feed_query\' );
function wpse63611_event_feed_query( $query ) {
$yesterday = current_time(\'timestamp\') - 24*60*60;
$compare = $latest ? \'>\' : \'<\';
if( $query->is_feed(\'eo-events\') ){
$query->set(\'post_type\', \'wr_event\');
$query->set(\'posts_per_page\', -1);
$query->set(\'meta_key\', \'event_date\');
$query->set(\'orderby\', \'meta_value_num\');
$query->set(\'order\', \'ASC\');
$query->set(\'meta_compare\', $compare);
$query->set(\'meta_value\', $value);
}
}
步骤3:ICS文件的内容,如前所述,
wpse63611_events_feed_output()
负责打印feed的输出。
function wpse63611_events_feed_output(){
//Let\'s give it a name;
$filename = urlencode( \'my_events\' . 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
// Loop through events
if ( have_posts() ):
$now = new DateTime();
$datestamp =$now->format(\'Ymd\\THis\\Z\');
while( have_posts() ): the_post();
global $post;
$uid = md5(uniqid(mt_rand(), true))."@mysite.com";
$start = unixToiCal(get_event_date($post), get_event_time($post));
$end = unixToiCal(get_event_end_date($post), get_event_end_time($post));
$summary = wpse63611_escape_icalText(get_the_title())
$description = apply_filters(\'the_excerpt_rss\', get_the_content());
$description = wpse63611_escape_icalText($description);
BEGIN:VEVENT
UID:<?php echo $uid;?>
DTSTAMP:<?php echo $datestamp;?>
DTSTART:<?php echo $start; ?>
DTEND:<?php echo $end; ?>
SUMMARY:<?php echo wpse63611_esc_ical_text($summary);?>
DESCRIPTION:<?php echo wpse63611_esc_ical_text($description);?>
END:VEVENT
endwhile;
endif;
?>
END:VCALENDAR
<?php
//Collect output and echo
$eventsical = ob_get_contents();
ob_end_clean();
echo $eventsical;
exit();
}
我用过
unixToiCal
您在问题中定义的函数。我还使用以下方法删除了可能会打乱ICAL解析器的任何内容:
function wpse63611_esc_ical_text( $text=\'\' ){
$text = str_replace("\\\\", "\\\\\\\\", $text);
$text = str_replace(",", "\\,", $text);
$text = str_replace(";", "\\;", $text);
$text = str_replace("\\n", "\\n ", $text);
return $text;
}