我最近开发了一个新闻博客,我的客户需要facebook共享计数。我成功地获得了共享计数,并使用下面的代码更新了自定义字段。(在cybermeta). 这段代码的作用是,它循环遍历所有可用的帖子,并从facebook api获取共享计数,并更新单个帖子的自定义字段。
register_activation_hook( __FILE__, \'cb_fb_share_count_activation\' );
function cb_fb_share_count_activation() {
wp_schedule_event( time(), \'hourly\', \'cb_update_fb_share_count\' );
}
register_deactivation_hook( __FILE__, \'cb_delete_fb_share_count_schedule\' );
function cb_delete_fb_share_count_schedule() {
wp_clear_scheduled_hook( \'cb_update_fb_share_count\' );
}
add_action( \'cb_update_fb_share_count\', \'cb_update_count\' );
function cb_update_count(){
$posts = get_posts(array(\'numberposts\' => -1) );
foreach($posts as $post) {
$url = get_permalink( $post->ID );
$response = wp_remote_get(\'https://api.facebook.com/method/links.getStats?urls=\'.$url.\'&format=json\' );
if( ! is_wp_error( $response ) ) {
$fbcount = json_decode( wp_remote_retrieve_body( $response ) );
$fb_share_count = $fbcount[0]->share_count;
update_post_meta( $post->ID, \'cb_fb_share_count\', $fb_share_count );
} else {
//Do something if it was an error comunicating with Facebook
}
}
}
然而,这似乎不是获取共享计数和更新自定义字段的好方法。
有没有更好的方法?即使从长远来看,这个博客有2000篇文章,我也不想有任何问题。
最合适的回答,由SO网友:Ben Cole 整理而成
我实际上制作了一个插件,名为Social Metrics Tracker 这正是你想要实现的。请随时read the source code on GitHub.
回答您的问题:
您是对的,运行每小时一次的cron任务来更新所有帖子都会导致仅200篇文章出现问题,因为服务器每小时都会向Facebook API发出一个GET请求。
以下是我所学到的以及我为实施所做的:
1。仅当帖子实际有流量时才运行更新任务
没有理由更新没有访客的旧帖子的统计信息。在我的实现中,我在每个帖子的开头运行更新检查,而不是每小时对每个帖子运行更新检查。
2。使用TTL防止频繁更新每次更新给定帖子的统计信息时存储和检索时间戳。这样,帖子更新的频率不会超过每3600秒一次(例如)。这个值是可配置的,因为拥有大量帖子的博客需要更长的TTL。
3。在cron中运行更新在上面的示例中,您已经在cron中运行了更新(这很好)。在我的实现中,更新也在cron中运行,以防止站点访问者额外的页面加载时间。
下面是一些考虑到上述三个因素的示例代码:
add_action( \'wp_head\', \'checkThisPost\');
public function checkThisPost() {
global $post;
if ($post) $post_id = $post->ID;
$last_updated = get_post_meta($post_id, "socialcount_LAST_UPDATED", true);
// Just an example of how this works:
if ($last_updated > time()-3600) {
wp_schedule_single_event( time(), \'social_metrics_update_single_post\', array( $post_id ) );
}
}
function social_metrics_update_single_post($post_id) {
// Run the update!
}