File "SWP_Popular_Posts_Widget.php"

Full Path: /home/bfxleof/www/wp-content/plugins/social-warfare/lib/widgets/SWP_Popular_Posts_Widget.php
File size: 19.96 KB
MIME-type: text/x-php
Charset: utf-8

<?php

/**
* Popular Posts Widget
*
* Allows users to show most popular posts by share count.
* Settings include widget title, network selections, thumbnail options, styles, and more.
*
* @package   SocialWarfare\Functions
* @copyright Copyright (c) 2018, Warfare Plugins, LLC
* @license   GPL-3.0+
* @since     1.0.0 | Created | Unknown
* @since     3.0.0 | Updated | 07 Feb 2018 | Adding custom thumbnail sizes
* @since     3.0.0 | Updated | 08 Feb 2018 | Refactored code from procedural style to loops. Added set_attributes().
* @since     3.0.0 | Updated | 09 Feb 2018 | Added the post type selector
*
*/
class SWP_Popular_Posts_Widget extends WP_Widget {

	/**
	* Class constructor.
	*
	* This function really doesn't do much except call the constructor from the
	* parent class that's built into WordPress core.
	*
	*  @since  1.0.0 | 01 JAN 2018 | Created
	*  @param  void
	*  @return void
	*  @access public
	*
	*/
	function __construct() {
		parent::__construct( false, $name = 'Social Warfare: Popular Posts' );
	}


	/**
	* Sets commonly applied attributes.
	*
	* @since  3.0.0 | 08 Feb 2018 | Created
	* @param  string $name The name to be called.
	* @param  string $class The CSS class to be applied.
	* @param  string $value The default value for the element.
	* @return string The string filled with attribute/value pairs.
	*
	*/
	private function set_attributes( $name, $class, $value) {
		$attributes = " id=\"{$this->get_field_id($name)}\" class=\"{$class}\" name=\"{$this->get_field_name($name)}\" data-swp-name=\"{$name}\" ";

		if ( isset( $value) ) {
			$attributes .= " value=\"{$value}\" ";
		}

		return $attributes;
	}


	/**
	 * Outputs the Settings Update form
	 *
	 * @since  1.0.0 | 01 JAN 2018 | Created
	 * @since  3.0.0 | 01 MAY 2018 | Refactored using loops, $this->set_attributes(),
	 *                              and added custom thumb sizes
	 * @param  array $instance Current settings.
	 * @return void Output is echoed directly to the screen
	 *
	 */
	function form( $instance ) {

		$defaults = array(
			'title'         => "Popular Posts",
			'count'         => "10",
			'timeframe'     => "0",
			'post_type'     => "post",
			'network'       => "total_shares",
			'showCount'     => "true",
			'countLabel'    => "Total Shares",
			'style'         => "style_01",
			'thumbnails'    => "true",
			'thumb_size'    => "100",
			'thumb_width'   => "thumb_size",
			'thumb_height'  => "thumb_size",
			'font_size'     => "100",
			'custom_bg'     => "#ffffff",
			'custom_link'   => "#000000"
		);


		/**
		 * If the user set their value for $var, set it to that. Otherwise set
		 * it to the default display value.
		 *
		 */
		foreach($defaults as $var => $display):
			if (isset ($instance[$var])) {
				$$var = esc_attr ($instance[$var]);
			} else {
				$$var = $display;
			}
		endforeach;

		// Fetch the Social Warfare Options
		global $swp_user_options;
		$options = $swp_user_options;

		// Fetch the networks that are active on this blog
		$availableNetworks = $options['order_of_icons'];


		// Build the Widget Form
		$form = '<div class="swp_popular_post_options">';


		// The Widget Title Field
		$form .= '<p class="title">';
		$form .= '<label for="' . $this->get_field_id( 'title' ) . '">Widget Title</label>';
		$form .= "<input type=\"text\" {$this->set_attributes("title", "widefat", $title)} />";
		$form .= '</p>';


		// Number of Posts to Display Field
		$form .= '<p class="count">';
		$form .= '<label for="' . $this->get_field_id( 'count' ) . '">How many posts would you like to display?</label>';
		$form .= "<input type=\"text\" {$this->set_attributes("count", "widefat", $count)} />";
		$form .= '</p>';


		// Age of the posts to display field
		$form .= '<p class="timeframe">';
		$form .= '<label for="' . $this->get_field_id( 'timeframe' ) . '">What is maximum age of a post (in days) that you would like to include (0 = Unlimited)?</label>';
		$form .= "<input type=\"number\" {$this->set_attributes("timeframe", "widefat", $timeframe)} min=\"0\" />";
		$form .= '</p>';

		// Get the public post Types
		$post_types = SWP_Utility::get_post_types();

		if( !empty( $post_types ) ):

			// Display the share count toggle field
			$form .= '<p class="post_type">';
			$form .= '<label for="' . $this->get_field_id( 'post_type' ) . '">What post type would you like to display?</label>';
			$form .= "<select {$this->set_attributes( 'post_type', 'widefat', null )}>";

			// Loop through the Custom Post Type Options
			foreach($post_types as $this_post_type):
				$form .= '<option value="' . $this_post_type . '" ' . selected($this_post_type, $post_type, false) . '>' . ucfirst( $this_post_type ) . '</option>';
			endforeach;

			$form .= '</select>';
			$form .= '</p>';

		endif;

		// Which networks to use as the basis field
		$form .= '<p class="network">';
		$form .= '<label for="' . $this->get_field_id( 'network' ) . '">Which network would you like to base your posts\' popularity on?</label>';
		$form .= "<select {$this->set_attributes('network', 'widefat', null)}>";
		$form .= "<option value=\"total_shares\" {selected($network, 'total_shares', false)}>All Networks</option>";

		foreach( $availableNetworks as $key => $value ) :

			$opt = $key . '_shares';
			$selected = selected($network, $opt, false);
			$net = ucfirst($value);

			$form .= "<option value=\"$opt\" $selected>$net</option>";

		endforeach;

		$form .= '</select>';
		$form .= '</p>';

		// Display the share count toggle field
		$form .= '<p class="showCount">';
		$form .= '<label for="' . $this->get_field_id( 'showCount' ) . '">Would you like to show the count?</label>';
		$form .= "<select {$this->set_attributes( 'showCount', 'widefat', null )}>";
		$form .= '<option value="true" ' . selected($showCount, 'true', false) . '>Yes</option>';
		$form .= '<option value="false" ' . selected($showCount, 'false', false) . '>No</option>';
		$form .= '</select>';
		$form .= '</p>';


		// Count Label Field
		$form .= '<p ' . ( $showCount != true ? 'style="display:none;"' : '' ) . ' data-dep="showCount" data-dep_val=\'' . json_encode( array(true) ) . '\' class="countLabel">';
		$form .= '<label for="' . $this->get_field_id( 'countLabel' ) . '">Count Number Label</label>';
		$form .= "<input type=\"text\" {$this->set_attributes( 'countLabel', 'widefat', $countLabel)} />";
		$form .= '</p>';


		// Post thumbnails toggle field
		$form .= '<p class="thumbnails">';
		$form .= '<label for="' . $this->get_field_id( 'thumbnails' ) . '">Would you like to display thumbnails?</label>';
		$form .= "<select {$this->set_attributes( 'thumbnails', 'widefat', null)} >";
		$form .= '<option value="true" ' . selected($thumbnails, 'true', false) . '>Yes</option>';
		$form .= '<option value="false" ' . selected($thumbnails, 'false', false) . '>No</option>';
		$form .= '</select>';
		$form .= '</p>';


		// Thumbnails size field
		$form .= '<p ' . ( $thumbnails != true ? 'style="display:none;"' : '' ) . ' data-dep="thumbnails" data-dep_val=\'' . json_encode( array(true) ) . '\' class="thumb_size">';
		$form .= '<label for="' . $this->get_field_id( 'thumb_size' ) . '">What size would you like your thumbnails?</label>';
		$form .= "<select {$this->set_attributes( 'thumb_size', 'widefat', null )} >";

		for ($i = 5; $i < 16; $i++) {
			$val = $i * 10;
			$selected = selected($thumb_size, $val, false);
			$form .= "<option value=\"$val\" $selected>${val}px</option>";
		}

		$form .= '<option value="custom" ' . selected($thumb_size, 'custom', false) . '>Custom</option>';
		$form .= '</select>';
		$form .= '</p>';


		//  If $thumb_size, show the custom height/width fields.
		$form .= '<p ' . ( $thumb_size != 'custom' ? 'style="display:none;"' : '' ) . ' data-dep="thumb_size" data-dep_val=\'' . json_encode( array('custom') ) . '\' class="custom_thumb_size">';
		$form .= '<label for="' . $this->get_field_id( 'thumb_width' ) . '">Thumbnail width</label>';
		$form .= "<input type=\"number\" {$this->set_attributes( 'thumb_width', 'widefat', $thumb_width)} />";
		$form .= '</p>';

		$form .= '<p ' . ( $thumb_size != 'custom' ? 'style="display:none;"' : '' ) . ' data-dep="thumb_size" data-dep_val=\'' . json_encode( array('custom') ) . '\' class="custom_thumb_size">';
		$form .= '<label for="' . $this->get_field_id( 'thumb_height' ) . '">Thumbnail height</label>';
		$form .= "<input type=\"number\" {$this->set_attributes( 'thumb_height', 'widefat', $thumb_height)} />";
		$form .= '</p>';


		// Font size field
		$form .= '<p class="font_size">';
		$form .= '<label for="' . $this->get_field_id( 'font_size' ) . '">What size would you like the font?</label>';
		$form .= "<select {$this->set_attributes( 'font_size', 'widefat', null )}>";

		for ($i = 5; $i < 16; $i++) {
			$val = $i * 10;
			$selected = selected($font_size, $val, false);
			$form .= "<option value=\"$val\" $selected>${val}%</option>";
		}

		$form .= '</select>';
		$form .= '</p>';


		// Color Scheme Field
		$ctt_styles = array(
			"Vanilla",
			"Inspired by Twitter",
			"Inspired by Facebook",
			"Inspired by Google Plus",
			"Don't Stop Believin'",
			"Thunderstruck",
			"Livin' On A Prayer"
		);

		$form .= '<p class="style">';
		$form .= '<label for="' . $this->get_field_id( 'style' ) . '">Which color scheme would you like to use?</label>';
		$form .= "<select {$this->set_attributes( 'style', 'widefat', null )}>";

		foreach($ctt_styles as $idx => $ctt_style):

			// *Accounting for 0 offset
			$idx += 1;

			if ($idx < 10) :
				$val = "style_0{$idx}";
			else:
				$val = "style_{$idx}";
			endif;

			$selected = selected($val, $style, false);
			$form .= "<option value=\"$val\" $selected>${ctt_style}</option>";

		endforeach;

		$form .= '<option value="custom" ' . selected($style, 'custom', false) . '>Custom</option>';
		$form .= '</select>';
		$form .= '</p>';

		// Custom Background Color Field
		$form .= '<p ' . ( $style != 'custom' ? 'style="display:none;"' : '' ) . ' data-dep="style" data-dep_val=\'' . json_encode( array('custom') ) . '\' class="custom_bg">';
		$form .= '<label for="' . $this->get_field_id( 'custom_bg' ) . '">Custom Background Color</label>';
		$form .= "<input type=\"text\" {$this->set_attributes( 'custom_bg', 'widefat', $custom_bg )} />";
		$form .= '</p>';

		// Custom Link Color Field
		$form .= '<p ' . ( $style != 'custom' ? 'style="display:none;"' : '' ) . ' data-dep="style" data-dep_val=\'' . json_encode( array('custom') ) . '\' class="custom_link">';
		$form .= '<label for="' . $this->get_field_id( 'custom_link' ) . '">Custom Link Color</label>';
		$form .= "<input type=\"text\" {$this->set_attributes( 'custom_link', 'widefat', $custom_link )} />";
		$form .= '</p>';

		// Close the Div
		$form .= '</div>';

		// Output the form fields
		echo $form;

	}


	/**
	* Update widget form values.
	*
	* @since  1.0.0
	* @access public
	* @param  array $new_instance Updated values as input by the user in WP_Widget::form()
	* @param  array $old_instance Previously set values.
	* @return array Sanitized array of final values.
	*
	*/
	function update( $new_instance, $old_instance ) {
		$instance = $old_instance;

		// Fetch the values from the form
		$instance['title'] 			= strip_tags( $new_instance['title'] );
		$instance['count'] 			= strip_tags( $new_instance['count'] );
		$instance['timeframe'] 		= strip_tags( $new_instance['timeframe'] );
		$instance['post_type'] 		= strip_tags( $new_instance['post_type'] );
		$instance['network'] 		= strip_tags( $new_instance['network'] );
		$instance['showCount'] 		= strip_tags( $new_instance['showCount'] );
		$instance['countLabel'] 	= strip_tags( $new_instance['countLabel'] );
		$instance['style'] 			= strip_tags( $new_instance['style'] );
		$instance['thumbnails'] 	= strip_tags( $new_instance['thumbnails'] );
		$instance['thumb_size'] 	= strip_tags( $new_instance['thumb_size'] );
		$instance['thumb_width']    = strip_tags( $new_instance['thumb_width'] );
		$instance['thumb_height']   = strip_tags( $new_instance['thumb_height'] );
		$instance['font_size'] 		= strip_tags( $new_instance['font_size'] );
		$instance['custom_bg'] 		= strip_tags( $new_instance['custom_bg'] );
		$instance['custom_link'] 	= strip_tags( $new_instance['custom_link'] );

		return $instance;
	}


	/**
	* Echoes the widget content.
	*
	* This sub-class over-rides this function from the parent class to generate the widget code.
	*
	* @since  1.0.0
	* @since  3.0.0 | 09 FEB 2018 | Refactored and added the $args array output
	* @access public
	* @param  array $args     Display arguments including 'before_title', 'after_title', 'before_widget', and 'after_widget'.
	* @param  array $instance The settings for the particular instance of the widget.
	*
	*/
	function widget( $args, $instance ) {
		extract( $args );

		// Fetch the field values from the form
		(isset( $instance['title'] ) 		? $title 		= $instance['title'] 		: $title 		= 'Popular Posts');
		(isset( $instance['count'] ) 		? $count 		= $instance['count'] 		: $count 		= '10');
		(isset( $instance['timeframe'] ) 	? $timeframe 	= $instance['timeframe'] 	: $timeframe 	= '0');
		(isset( $instance['post_type'] ) 	? $post_type 	= $instance['post_type'] 	: $post_type 	= 'post');
		(isset( $instance['network'] ) 		? $network 		= $instance['network'] 		: $network 		= 'total_shares');
		(isset( $instance['showCount'] ) 	? $showCount 	= $instance['showCount'] 	: $showCount 	= 'true');
		(isset( $instance['countLabel'] ) 	? $countLabel 	= $instance['countLabel'] 	: $countLabel 	= 'Total Shares');
		(isset( $instance['style'] ) 		? $style 		= $instance['style'] 		: $style 		= 'style_01');
		(isset( $instance['thumbnails'] ) 	? $thumbnails 	= $instance['thumbnails'] 	: $thumbnails 	= 'true');
		(isset( $instance['thumb_size'] ) 	? $thumb_size 	= $instance['thumb_size'] 	: $thumb_size 	= '100');
		(isset( $instance['font_size'] ) 	? $font_size 	= $instance['font_size'] 	: $font_size 	= '100');
		(isset( $instance['custom_bg'] ) 	? $custom_bg 	= $instance['custom_bg'] 	: $custom_bg 	= '#ffffff');
		(isset( $instance['thumb_width'] )  ? $thumb_width  = $instance['thumb_width']  : $thumb_width  =  $thumb_size);
		(isset( $instance['thumb_height'] ) ? $thumb_height = $instance['thumb_height'] : $thumb_height =  $thumb_size);
		(isset( $instance['custom_link'] ) 	? $custom_link 	= $instance['custom_link'] 	: $custom_link 	= '#000000');

		// Correct the previous style with the new version if it is present on the site
		if ( $style == 'first_style' || $style == 'second_style' ) :
			$style = 'style_01';
		endif;

		//  Define the array of background links and clors.

		// Vanilla (No Styling)
		$styles['style_01']['wrapper'] 	= 'background:transparent;';
		$styles['style_01']['links']	= '';

		// Inspired by Twitter
		$styles['style_02']['wrapper'] 	= 'padding:15px;background:#429cd6;';
		$styles['style_02']['links']	= 'color:#ffffff;';

		// Inspired by Facebook
		$styles['style_03']['wrapper'] 	= 'padding:15px;background:#3a589e;';
		$styles['style_03']['links']	= 'color:#ffffff;';

		// Inspired by Google Plus
		$styles['style_04']['wrapper'] 	= 'padding:15px;background:#df4b37;';
		$styles['style_04']['links']	= 'color:#ffffff;';

		// Inspired by LinkedIn
		$styles['style_05']['wrapper'] 	= 'padding:15px;background:#0d77b7;';
		$styles['style_05']['links']	= 'color:#ffffff;';

		// Inspired by Pinterest
		$styles['style_06']['wrapper'] 	= 'padding:15px;background:#cd2029;';
		$styles['style_06']['links']	= 'color:#ffffff;';

		// Don't Stop Believin'
		$styles['style_07']['wrapper'] 	= 'padding:15px;background:#333333;';
		$styles['style_07']['links']	= 'color:#ffffff;';

		// Thunderstruck
		$styles['style_08']['wrapper'] 	= 'padding:15px;background:#30394F;';
		$styles['style_08']['links']	= 'color:#ffffff;';

		// Livin' On A Prayer
		$styles['style_09']['wrapper'] 	= 'padding:15px;background:#EEEEEE;';
		$styles['style_09']['links']	= 'color:#30394F;';

		// Custom
		$styles['custom']['wrapper'] 	= 'padding:15px;background:' . $custom_bg . ';';
		$styles['custom']['links']		= 'color:' . $custom_link . ';';

		/**
		 * BUILD OUT THE WIDGET
		 */

		// Output the "Before Widget" content
		if( isset( $args['before_widget'] ) ) :
			echo $args['before_widget'];
		endif;

		// Begin output of the widget html
		echo '<div class="widget-text swp_widget_box" style="' . $styles[ $style ]['wrapper'] . '">';

		// Check if title is set
		if ( $title ) :

			// Output the "Before Title" content
			if( isset( $args['before_title'] ) ) :
				echo $args['before_title'];
			endif;

			echo '<span class="widgettitle widget-title swp_popular_posts_title" style="' . $styles[ $style ]['links'] . '">' . $title . '</span>';

			// Output the "After Title" content
			if( isset( $args['after_title'] ) ) :
				echo $args['after_title'];
			endif;
		endif;

		$swp_args = array(
			'posts_per_page' 	=> $count,
			'post_type' 		=> $post_type,
			'meta_key' 			=> '_' . $network,
			'orderby' 			=> 'meta_value_num',
			'order' 			=> 'DESC',
			'cache_results'     => false,
			'update_post_meta_cache' => false,
			'update_post_term_cache' => false,
			'ignore_sticky_posts' => 1
		);

		if ($timeframe != 0) {
			$swp_args['date_query'] = array(
					'column'  		=> 'post_date',
					'after'   		=> '- ' . $timeframe . ' days',
				);
		}

		// Reset the main query
		wp_reset_postdata();

		// Query and fetch the posts
		$swq = new WP_Query( $swp_args );

		// Begin the loop
		if ( $swq->have_posts() ) :
			$i = 1;
			while ( $swq->have_posts() ) :

				if ( $i <= $count ) :
					$swq->the_post();

					// If we are supposed to show count numbers....
					if ( $showCount == 'true' ) :
						$postID = get_the_ID();
						$shares = get_post_meta( $postID,'_' . $network,true );
						$share_html = '<span class="swp_pop_count">' . SWP_Utility::kilomega( $shares ) . ' ' . $countLabel . '</span>';

					// If we are not supposed to show count numbers
					else :
						$share_html = '';
					endif;

					// If we are supposed to show thumbnails
					if ( $thumbnails == 'true' && has_post_thumbnail() ) :
						$thumbnail_url = wp_get_attachment_image_src( get_post_thumbnail_id() , 'thumbnail' );
						$thumbnail_html = '<a href="' . get_the_permalink() . '">';

						if ($thumb_size === 'custom') :
							$thumb_width = preg_replace("/[^0-9]/", "", $thumb_width);
							$thumb_height = preg_replace("/[^0-9]/", "", $thumb_height);

							$thumbnail_html .= '<img style="width:' . $thumb_width . 'px;height:' . $thumb_height . 'px;" class="swp_pop_thumb" src="' . $thumbnail_url[0] . '" title="' . str_replace('"','\'',get_the_title()) . '" alt="' . str_replace('"','\'',get_the_title()) . '" '. SWP_AMP::hide_if_amp('nopin="nopin"') . ' />';
						else:
							$thumbnail_html .= '<img style="width:' . $thumb_size . 'px;height:' . $thumb_size . 'px;" class="swp_pop_thumb" src="' . $thumbnail_url[0] . '" title="' . str_replace('"','\'',get_the_title()) . '" alt="' . str_replace('"','\'',get_the_title())  . '" '. SWP_AMP::hide_if_amp('nopin="nopin"') . '  />';
						endif;

						$thumbnail_html .= '</a>';

						// If we are not supposed to show thumbnails
					else :
						$thumbnail_html = '';
					endif;

					// Generate the HTML for a link
					$link_html = '<a style="font-size:' . $font_size . '%;' . $styles[ $style ]['links'] . '" class="swp_popularity" href="' . get_the_permalink() . '"><b>' . get_the_title() . '</b>' . $share_html . '</a>';

					// Output the post to the site
					echo '<div class="swp_popular_post">' . $thumbnail_html . '' . $link_html . '</div>';
					echo '<div class="swp_clearfix"></div>';

				endif;

			// End the loop
			endwhile;
		endif;

		// Reset the main query so as not to interfere with other queries on the same page
		wp_reset_postdata();
		echo '</div>';

		// Output the "After Widget" content
		if( isset( $args['after_widget'] ) ) :
			echo $args['after_widget'];
		endif;
	}
}