File "class-instagram.php"

Full Path: /home/siazco/grocery.siazco.se/wp-content/plugins/kapee-extensions/inc/widgets/class-instagram.php
File size: 6.28 KB
MIME-type: text/x-php
Charset: utf-8

<?php
/**
 *	Kapee Widget: Instagram
 */
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}


if ( ! class_exists( 'Kapee_Widget_Base' ) ) {
	return;
}

class Kapee_Instagram extends Kapee_Widget_Base {
	public $access_token,$new_refresh_token,$option_name = 'kapee_instagram_access_token';
	/**
	 * Constructor.
	 */
	public function __construct() {

		$this->widget_cssclass 		= 'kapee-instagram';
        $this->widget_description 	= esc_html__("Display instagram images.", 'kapee-extensions');
        $this->widget_id 			= 'kapee-instagram';
        $this->widget_name 			= esc_html__('KP: Instagram', 'kapee-extensions');
		$this->settings = array(
            'title' => array(
                'type' 	=> 'text',
                'label' => esc_html__('Title:', 'kapee-extensions'),
                'std' 	=> esc_html__('Instagram', 'kapee-extensions'),
            ),
			'hide_title' => array(
                'type' 	=> 'checkbox',
                'label' => esc_html__('Hide Widget Title?', 'kapee-extensions'),
                'std' 	=> false,
            ),
			'access_token' => array(
                'type' 	=> 'text',
                'label' => esc_html__('Access Token:', 'kapee-extensions'),
                'std' 	=> '',
            ),
			'number_of_photos' => array(
                'type' 	=> 'number',
                'label' => esc_html__('Number Of Photos:', 'kapee-extensions'),
				'std' 	=> 9,
            ),
		);
		parent::__construct();
	}
	
	/**
     * Output widget.
     *
     * @see WP_Widget
     *
     * @param array $args
     * @param array $instance
     */
    public function widget($args, $instance){

        ob_start();
		
		$hide_title = (!empty($instance['hide_title'])) ? (bool) $instance['hide_title'] : false;
		if($hide_title) unset($instance['title']);
		
		$this->widget_start($args, $instance);
		
		do_action( 'kapee_before_instagram_widget');		
		
		$number_of_photos 	= (!empty($instance['number_of_photos'])) ?  $instance['number_of_photos'] : 9;
		$num 				= $number_of_photos;
		
		$this->access_token 	= (!empty($instance['access_token'])) ?  $instance['access_token'] : '';
		$refresh_token = $this->refresh_access_token();
		
		if( is_wp_error( $refresh_token ) ){
			echo esc_html( $refresh_token->get_error_message() );
			$this->access_token = '';
			return;
		}
		
		if( !empty( $this->access_token ) ){
			$instagram_data = $this->instagram_media( $num );
			if( is_wp_error( $instagram_data ) ){
				echo esc_html( $instagram_data->get_error_message() );
			}
		}
		if( is_wp_error( $instagram_data )|| empty( $instagram_data ) ){
			return;
		}?>
		
		<div class="kapee-instagram-widget">
			<?php foreach( $instagram_data as $item ){	
				$image_url 		= $item['image_url']; ?>	
				<div class="instagram-picture-wrap">
					<div class="instagram-picture">
						<a href="<?php echo esc_url( $item['image_link'] ); ?>" target="_blank"></a>
						<?php echo kapee_get_src_image_loaded($image_url);?>
					</div>
				</div>		
			<?php } ?>	
		</div>
		<?php
		do_action( 'kapee_after_instagram_widget');

		$this->widget_end($args);

        echo ob_get_clean();
    }
	
	public function instagram_media( $limit = 10 ){
		
		$transient_key = 'kapee_'.sanitize_title_with_dashes($this->access_token).'_'.$limit;
		
		$stored_transient 	= get_transient( $transient_key ); // Getting cache value
		$stored_transient	= !empty($stored_transient) ? json_decode($stored_transient, true) : false;
		if ( false === $stored_transient ) {
			$args = [
				'fields'       => 'id,caption,media_type,media_url,permalink,thumbnail_url,username',
				'limit'		=> $limit,
				'access_token' => $this->access_token,
			];
			$result_data = array();
			$url = add_query_arg( $args, 'https://graph.instagram.com/me/media' );

			$response = wp_remote_get( $url );
			
			$response = wp_remote_retrieve_body( $response );		
			$response   = json_decode( $response, true );
			
			if( !is_array($response) ){
				return new WP_Error( 'invalid_response', esc_html__( 'Instagram has returned invalid data.', 'kapee-extensions' ) );
			}
			
			if( isset($response['error']['message']) ){
				return new WP_Error( 'error_response', $response['error']['message'] );
			}
			
			foreach ( $response['data'] as $media ) {
				$result_data[] = array(
					'username'    => $media['username'],
					'type'    => $media['media_type'],
					'caption' => isset( $media['caption'] ) ? $media['caption'] : $media['id'],
					'image_link'    => $media['permalink'],
					'image_url'  => strtolower( $media['media_type'] ) == 'video' ? $media['thumbnail_url'] : $media['media_url'],
				);
			}
			set_transient( $transient_key, json_encode($result_data), apply_filters( 'kapee_instagram_cache_time', HOUR_IN_SECONDS * 2 ) );
		}else{
			$result_data = $stored_transient;
		}
		if ( ! empty( $result_data ) ) {
			return array_slice( $result_data, 0, $limit );
		} else {
			return new WP_Error( 'no_images', esc_html__( 'Instagram did not return any images.', 'kapee-extensions' ) );
		}
	}
	public function refresh_access_token(){
		$token_data = array();
		$generate_new_taken = true;
		$access_token = get_option( $this->option_name, [] );
		
		if ( !empty( $access_token ) && isset($access_token[$this->access_token]) ) {
			if( isset( $access_token[$this->access_token]['timestamp'] ) && 
			 $access_token[$this->access_token]['timestamp'] > time() ){
				$generate_new_taken = false;
			}
			$this->access_token = $access_token[$this->access_token]['refreshed_token'];			
		}
		
		if($generate_new_taken){
			$args = [
				'grant_type' => 'ig_refresh_token',
				'access_token'  => $this->access_token
			];
			$url = add_query_arg( $args, 'https://graph.instagram.com/refresh_access_token' );
			$response 	= wp_remote_get( $url );
			$data 		= wp_remote_retrieve_body( $response );			
			$data = json_decode( $data, true );			
			if( isset($data['access_token']) ){
				$token_data[$this->access_token]['refreshed_token'] = $data['access_token'];
				$token_data[$this->access_token]['timestamp'] = time() + MONTH_IN_SECONDS;
				if(!empty($access_token)){
					$token_data = array_merge($access_token, $token_data);
				}
				update_option($this->option_name, $token_data);
				$this->access_token = $data['access_token'];
				return true;
			}else{
				return new WP_Error( 'access_token_refresh', esc_html__( "can't refresh token. Please check your access key.", 'kapee-extensions' ) );
			}
		}		
	}

}