使用wp_Schedule_Event或任何其他方法获取Facebook分享计数和更新的最佳方法

时间:2015-03-15 作者:Naresh Devineni

我最近开发了一个新闻博客,我的客户需要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篇文章,我也不想有任何问题。

1 个回复
最合适的回答,由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!
}

结束

相关推荐

如何在自定义主题的标题中添加附件的Facebook OpenGraph元标记?

当标题已经被调用,并且需要添加的值在正文中获得时,如何在标题中添加Facebook OpenGraph标记?这是一个高度定制的主题(我没有创建)。这是image.php 包含图像附件页的文件: <div class=\"posted-att\"> <?php echo wp_get_attachment_image($attachment_id,\'large\'); 我不知道在哪里$attachment_id 已设置。它没有设定imag