FullCalendar与JSON Feed加载缓慢

时间:2011-05-31 13:43:53

标签: wordpress fullcalendar

我正在使用FullCalendar通过JSON提要从WP上的自定义帖子类型加载事件。它正在运行,但需要一些时间来加载。请在这里查看:http://cea3.iscte.pt/en/agenda-3/(6月或8月)。你们中的任何一个人都知道可能导致它的原因吗?

这是JSON Feed的完整代码:

<?php

// - standalone json feed -

header('Content-Type:application/json');

// - grab wp load, wherever it's hiding -
if(file_exists('../../../../wp-load.php')) :
    include '../../../../wp-load.php';
else:
    include '../../../../../wp-load.php';
endif;

global $wpdb;

// - grab date barrier -
$oneyear = strtotime('-1 year') + ( get_option( 'gmt_offset' ) * 3600 );

// - query -
global $wpdb;
$querystr = "
    SELECT *
    FROM $wpdb->posts wposts, $wpdb->postmeta metastart, $wpdb->postmeta metaend
    WHERE (wposts.ID = metastart.post_id AND wposts.ID = metaend.post_id)
    AND (metaend.meta_key = 'tf_events_enddate' AND metaend.meta_value > $oneyear )
    AND metastart.meta_key = 'tf_events_enddate'
    AND wposts.post_type = 'tf_events'
    AND wposts.post_status = 'publish'
    ORDER BY metastart.meta_value ASC LIMIT 500
 ";

$events = $wpdb->get_results($querystr, OBJECT);
$jsonevents = array();

// - loop -
if ($events):
global $post;
foreach ($events as $post):
setup_postdata($post);

// - custom variables -
$custom = get_post_custom(get_the_ID());
$sd = $custom["tf_events_startdate"][0];
$ed = $custom["tf_events_enddate"][0];

// - grab gmt for start -
$gmts = date('Y-m-d H:i:s', $sd);
$gmts = get_gmt_from_date($gmts); // this function requires Y-m-d H:i:s
$gmts = strtotime($gmts);

// - grab gmt for end -
$gmte = date('Y-m-d H:i:s', $ed);
$gmte = get_gmt_from_date($gmte); // this function requires Y-m-d H:i:s
$gmte = strtotime($gmte);

// - set to ISO 8601 date format -
$stime = date('c', $gmts);
$etime = date('c', $gmte);

$thetitle = $post->post_title;
$short_title = substr($thetitle,0,50);

$eventpostid = $post->ID;
$eventslug = wp_get_post_terms( $eventpostid, 'tf_eventcategory' );
$eventvenueslug = $eventslug[0]->slug;

$tf_events_link = get_post_meta($post->ID, 'tf_events_link', true);
$tf_events_permalink = get_permalink($post->ID);
if ($tf_events_link) { $url_event = $tf_events_link ; }
else { $url_event = $tf_events_permalink; };

// - json items -
$jsonevents[]= array(
    'title' => $short_title . '...',
    'allDay' => false, // <- true by default with FullCalendar
    'start' => $stime,
    'end' => $etime,
    'url' => $url_event,
    'className' => $eventvenueslug
    );

endforeach;
else :
endif;

// - fire away -
echo json_encode($jsonevents);

?> 

谢谢。

1 个答案:

答案 0 :(得分:1)

看起来好像需要几秒钟才能加载。

我使用这个日历,加载大约需要2-6秒 - 最长的是6秒,但我有大约3个来源和~40个事件。

现在我不确定这对你来说是不是很长时间,因为你没有具体说明它需要多长时间。 看起来调用是在同一台服务器上,所以唯一的问题可能是需要很长时间才能回复的SQL。它是专用服务器还是共享服务器?

您的PHP看起来很好,应该快速执行。我使用.NET和SQL Server有类似的逻辑。

这是从世界各地加载日历所需的时间。

enter image description here

加快速度的另一种方法是使用缓存

http://arshaw.com/fullcalendar/docs/event_data/events_json_feed/#options

并通过巧妙地检查日期来管理它以某种方式重新加载源?或者其他的东西。 我确信在之前加载Feed时,时间会减少到ms。

您必须做一些聪明的事情,例如快速加载当前月份 - 并在后台加载1年或2年并缓存它。然后,当你改变几个月时,它将是即时的,因为它在内存中。