File: /home/dailygoldindex/public_html/wp-content/themes/jnews/class/Comment/CommentNumber.php
<?php
/**
 * @author : Jegtheme
 */
namespace JNews\Comment;
/**
 * Class JNews_CommentNumber
 */
Class CommentNumber
{
    /**
     * @var CommentNumber
     */
    private static $instance;
    /**
     * @var string
     */
    private $comment_type;
    private $comment_expired;
    /**
     * @var string
     */
    private $cache_key = "jnews_comments_number";
    /**
     * @return CommentNumber
     */
    public static function getInstance()
    {
        if (null === static::$instance)
        {
            static::$instance = new static();
        }
        return static::$instance;
    }
    private function __construct()
    {
        $this->comment_type         = get_theme_mod( 'jnews_comment_type', 'wordpress' );
        $this->comment_expired      = get_theme_mod( 'jnews_comment_cache_expired', '1' );
    }
    /**
     * Return number of post comments
     * 
     * @param  int $post_id
     * 
     * @return int
     * 
     */
    public function comments_number( $post_id )
    {
        if ( $this->comment_type === 'wordpress' )
        {
            $comment_number = get_comments_number( $post_id );
        } else {
            $comment_number = $this->get_comments_cache( $post_id );
        }
        return $comment_number;
    }
    /**
     * Comment cache
     * 
     * @param  int $post_id
     * 
     * @return int
     * 
     */
    protected function get_comments_cache( $post_id = 0 )
    {
        $post_id         = $this->get_post_id( $post_id );
        $comment_expired = $this->comment_expired * 60 * 60;
        // @todo : development
        // delete_post_meta( $post_id, $this->cache_key );
        $data_comment = get_post_meta( $post_id, $this->cache_key, true );
        $current_time = current_time('timestamp');
        $number       = 0;
        $add_data     = true;
        if ( ! empty( $data_comment[$this->comment_type] ) )
        {
            if ( $data_comment[$this->comment_type]['expired'] < ( $current_time - $comment_expired ) )
            {
                // expired
	            $data_comment[$this->comment_type]['expired'] = current_time('timestamp');
	            $data_comment[$this->comment_type]['number']  = $this->fetch_data( $post_id, $this->comment_type );
	            $this->save_result( $post_id, $data_comment );
            }
            $number = $data_comment[$this->comment_type]['number'];
        } else {
            $fetch_data = $this->fetch_data( $post_id, $this->comment_type );
            $number = $fetch_data;
            $data_comment = array(
                $this->comment_type => array(
                    'expired' => current_time('timestamp'),
                    'number'  => $fetch_data,
                )
            );
            $this->save_result( $post_id, $data_comment );
        }
        return $number;
    }
    /**
     * Fetch data post comment
     * 
     * @param  int    $post_id
     * @param  string $type   
     * 
     * @return int
     *      
     */
    protected function fetch_data( $post_id, $type )
    {
        $comment_number = 0;
        if ( $type === 'facebook' )
        {
	        $fb_token   = get_theme_mod('jnews_comment_facebook_token', '');
	        $fb_token   = ! empty( $fb_token ) ? '&access_token=' . $fb_token : '';
            $url        = 'https://graph.facebook.com/?fields=og_object{comments.limit(0).summary(true)}&id=' . apply_filters( 'jnews_get_permalink', get_permalink( $post_id ) ) . $fb_token;
            $result     = $this->make_request( $url );
            if ( !empty( $result['og_object']['comments'] ) )
            {
                $comment_number = $result['og_object']['comments']['summary']['total_count'];
            }
        } 
        if ( $type === 'disqus' ) 
        {
            $api_key   = get_theme_mod( 'jnews_comment_disqus_api_key', '' );
            $shortname = get_theme_mod( 'jnews_comment_disqus_shortname', '' );
            $url       = 'https://disqus.com/api/3.0/threads/set.json?api_key=' . urlencode( $api_key ) . '&forum=' . urlencode( $shortname ) . '&thread:link=' . apply_filters( 'jnews_get_permalink', get_permalink( $post_id ) ); // alternatif use details.json
            $result    = $this->make_request( $url );
            if ( !empty( $result['response'][0]['posts'] ) )
            {
                $comment_number = $result['response'][0]['posts'];
            }
        }
        return $comment_number;
    }
    /**
     * Save post meta data for post comment
     * 
     * @param  int   $post_id
     * @param  array $data   
     *          
     */
    protected function save_result( $post_id, $data )
    {
        update_post_meta( $post_id, $this->cache_key, $data );
    }
    /**
     * Make request
     * 
     * @param  string $url
     * 
     * @return bool|array (default:bool)
     * 
     */
    protected function make_request( $url )
    {
        $response = wp_remote_get( $url );
        if ( !is_wp_error( $response ) && $response['response']['code'] == '200' )
        {
            $result = json_decode( $response['body'], true );
            return $result;
        }
        return false;
    }
    /**
     * Get post id
     * 
     * @param  int $post_id
     * 
     * @return int
     * 
     */
    protected function get_post_id( $post_id )
    {
        $post = get_post( $post_id );
        if ( $post )
        {
            $post_id = $post->ID;
        }
        return $post_id;
    }
}