File: /home/adltc/public_html/wp-content/plugins/feeds-for-youtube/inc/SBY_Settings.php
<?php
namespace SmashBalloon\YouTubeFeed;
use Smashballoon\Customizer\Feed_Saver;
class SBY_Settings {
/**
* @var array
*/
protected $atts;
/**
* @var array
*/
protected $db;
/**
* @var array
*/
protected $settings;
/**
* @var array
*/
protected $feed_type_and_terms;
/**
* @var array
*/
protected $connected_accounts;
/**
* @var array
*/
protected $connected_accounts_in_feed;
/**
* @var string
*/
protected $transient_name;
/**
* SBY_Settings constructor.
*
* Overwritten in the Pro version.
*
* @param array $atts shortcode settings
* @param array $db settings from the wp_options table
*/
public function __construct( $atts, $db, $preview_settings = false ) {
$atts = is_array( $atts ) ? $atts : array();
if ( ! empty( $atts['feed'] ) && $atts['feed'] !== 'legacy' ) {
$this->settings = self::get_settings_by_feed_id( $atts['feed'], $preview_settings );
if ( ! empty( $this->settings ) ) {
$this->settings['customizer'] = isset($atts['customizer']) && $atts['customizer'] == true ? true : false;
$this->settings['feed'] = intval( $atts['feed'] );
}
}
if ( ! empty( $atts['feed'] ) && $atts['feed'] === 'legacy' ) {
$this->settings = $preview_settings;
if ( ! empty( $this->settings ) ) {
$this->settings['customizer'] = isset($atts['customizer']) && $atts['customizer'] == true ? true : false;
}
}
// convert string 'false' and 'true' to booleans
foreach ( $atts as $key => $value ) {
if ( $value === 'false' ) {
$atts[ $key ] = false;
} elseif ( $value === 'true' ) {
$atts[ $key ] = true;
}
}
$this->atts = $atts;
$this->db = $db;
$this->connected_accounts = isset( $db['connected_accounts'] ) ? $db['connected_accounts'] : array();
if ( ! empty( $this->db['api_key'] ) ) {
$this->connected_accounts = array(
'own' => array(
'access_token' => '',
'refresh_token' => '',
'channel_id' => '',
'username' => '',
'is_valid' => true,
'last_checked' => '',
'profile_picture' => '',
'privacy' => '',
'expires' => '2574196927',
'api_key' => $this->db['api_key']
)
);
}
if ( empty( $this->settings ) ) {
$this->settings = wp_parse_args( $atts, $db );
}
if ( empty( $this->connected_accounts ) ) {
$this->settings['showheader'] = false;
$this->connected_accounts = array( 'rss_only' => true );
}
$this->settings['nummobile'] = $this->settings['num'];
$this->settings['ajaxtheme'] = $this->db['ajaxtheme'];
if ( empty( $atts['caching_type'] ) ) {
$this->settings['caching_type'] = 'background';
}
if ( ! empty( $atts['cachetime'] ) ) {
$this->settings['caching_type'] = 'page';
}
if ( ! empty( $atts['showpast'] ) ) {
$this->settings['showpast'] = (bool)$atts['showpast'];
}
$this->after_settings_set();
}
protected function after_settings_set() {
}
/**
* Get settings or legacy settings depending on feed type
*
* @since 2.0
*
* @param array $atts
* @return array $settings
*/
public function maybe_get_settings_or_legacy_settings( $atts ) {
if ( !empty( $atts['feed'] ) ) {
$settings = $this->get_settings();
} else {
$settings = self::get_legacy_feed_settings( $atts );
}
$settings['global_settings'] = sby_get_database_settings();
return $settings;
}
/**
* Get legacy feed settings
*
* @since 2.0
*
* @param array $atts
* @return array $legacy_settings
*/
public static function get_legacy_feed_settings( $atts = array() ) {
$legacy_settings = get_option( 'sby_legacy_feed_settings', false );
if(false === $legacy_settings) {
$legacy_settings = sby_get_database_settings();
} else {
$legacy_settings = json_decode( $legacy_settings, true );
}
if ( $atts && count( $atts ) > 0 ) {
$legacy_settings = wp_parse_args( $atts, $legacy_settings );
$legacy_settings = self::filter_legacy_shortcode_atts( $atts, $legacy_settings );
}
return $legacy_settings;
}
/**
* Filter legacy feed shortcode atts
*
* @since 2.0
*
* @param array $atts
* @param array $legacy_settings
*
* @return array $legacy_shortcode
*/
public static function filter_legacy_shortcode_atts( $atts, $legacy_settings ) {
if ( isset($atts['gridcols']) && $atts['layout'] === 'grid' ) {
$legacy_settings['cols'] = $legacy_settings['gridcols'];
}
if ( isset($atts['gridcolsmobile']) && $atts['layout'] === 'grid' ) {
$legacy_settings['colsmobile'] = $legacy_settings['gridcolsmobile'];
}
if ( isset($atts['gallerycols']) && $atts['layout'] === 'gallery' ) {
$legacy_settings['cols'] = $legacy_settings['gallerycols'];
}
if ( isset($atts['gallerycolsmobile']) && $atts['layout'] === 'gallery' ) {
$legacy_settings['colsmobile'] = $legacy_settings['gallerycolsmobile'];
}
if ( isset($atts['carouselcols']) && $atts['layout'] === 'carousel' ) {
$legacy_settings['cols'] = $legacy_settings['carouselcols'];
}
if ( isset($atts['carouselcolsmobile']) && $atts['layout'] === 'carousel' ) {
$legacy_settings['colsmobile'] = $legacy_settings['carouselcolsmobile'];
}
$legacy_settings['nummobile'] = $legacy_settings['num'];
return $legacy_settings;
}
/**
* Get Settings By Feed ID
*
* @since 2.0
*/
public static function get_settings_by_feed_id( $feed_id, $preview_settings = false ) {
global $wpdb;
if ( is_array( $preview_settings ) ) {
return $preview_settings;
}
if ( intval( $feed_id ) < 1 ) {
return false;
}
$container = Container::get_instance();
$feed_saver = $container->get(Feed_Saver::class);
$feed_saver->set_feed_id( $feed_id );
return $feed_saver->get_feed_settings();
}
/**
* @return array
*
* @since 1.0
*/
public function get_settings() {
return $this->settings;
}
/**
* The plugin will output settings on the frontend for debugging purposes.
* Safe settings to display are added here.
*
* Overwritten in the Pro version.
*
* @return array
*
* @since 1.0
*/
public static function get_public_db_settings_keys() {
$public = array(
'type' => 'channel',
'channel' => '',
'num' => 9,
'nummobile' => 9,
'minnum' => 9,
'widthresp' => true,
'class' => '',
'height' => '',
'heightunit' => '%',
'disablemobile' => false,
'itemspacing' => 5,
'itemspacingunit' => 'px',
'background' => '',
'headercolor' => '',
'subscribecolor' => '',
'subscribehovercolor' => '',
'subscribetextcolor' => '',
'buttoncolor' => '',
'buttonhovercolor' => '',
'buttontextcolor' => '',
'layout' => 'grid',
'feedtemplate' => 'default',
'playvideo' => 'automatically',
'sortby' => 'none',
'imageres' => 'auto',
'showheader' => true,
'headerstyle' => 'standard',
'customheadertext' => __( 'We are on YouTube', 'feeds-for-youtube' ),
'customheadersize' => 'small',
'customheadertextcolor' => '',
'showdescription' => true,
'showbutton' => true,
'headersize' => 'small',
'headeroutside' => false,
'showsubscribe' => true,
'buttontext' => __( 'Load More...', 'feeds-for-youtube' ),
'subscribetext' => __( 'Subscribe', 'feeds-for-youtube' ),
'caching_type' => 'page',
'cache_time' => 1,
'cache_time_unit' => 'hours',
'backup_cache_enabled' => true,
'resizeprocess' => 'background',
'disable_resize' => true,
'storage_process' => 'background',
'favor_local' => false,
'disable_js_image_loading' => false,
'ajax_post_load' => false,
'ajaxtheme' => false,
'enqueue_css_in_shortcode' => false,
'font_method' => 'svg',
'customtemplates' => false,
'cols' => 3,
'colsmobile' => 2,
'playerratio' => '9:16',
'eagerload' => false,
'custom_css' => '',
'custom_js' => '',
'gdpr' => 'auto',
'disablecdn' => false,
'allowcookies' => false,
// pro only
'usecustomsearch' => false,
'headerchannel' => '',
'customsearch' => '',
'showpast' => true,
'showlikes' => true,
'carouselcols' => 3,
'carouselcolsmobile' => 2,
'carouselarrows' => true,
'carouselpag' => true,
'carouselautoplay' => false,
'infoposition' => 'below',
'include' => array( 'title', 'icon', 'user', 'date', 'countdown' ),
'hoverinclude' => array( 'description', 'stats' ),
'descriptionlength' => 150,
'userelative' => true,
'dateformat' => '0',
'customdate' => '',
'showsubscribers' => true,
'enablelightbox' => true,
'subscriberstext' => __( 'subscribers', 'feeds-for-youtube' ),
'viewstext' => __( 'views', 'feeds-for-youtube' ),
'agotext' => __( 'ago', 'feeds-for-youtube' ),
'beforedatetext' => __( 'Streaming live', 'feeds-for-youtube' ),
'beforestreamtimetext' => __( 'Streaming live in', 'feeds-for-youtube' ),
'minutetext' => __( 'minute', 'feeds-for-youtube' ),
'minutestext' => __( 'minutes', 'feeds-for-youtube' ),
'hourstext' => __( 'hours', 'feeds-for-youtube' ),
'thousandstext' => __( 'K', 'feeds-for-youtube' ),
'millionstext' => __( 'M', 'feeds-for-youtube' ),
'watchnowtext' => __( 'Watch Now', 'feeds-for-youtube' ),
'cta' => 'related',
'colorpalette' => 'inherit',
'linktext' => __( 'Learn More', 'feeds-for-youtube' ),
'linkurl' => '',
'linkopentype' => 'same',
'linkcolor' => '',
'linktextcolor' => '',
'videocardstyle' => 'regular',
'videocardlayout' => 'vertical',
'custombgcolor1' => '',
'customtextcolor1' => '',
'customtextcolor2' => '',
'customlinkcolor1' => '',
'custombuttoncolor1' => '',
'custombuttoncolor2' => '',
'boxedbgcolor' => '#ffffff',
'boxborderradius' => '12',
'enableboxshadow' => false,
'descriptiontextsize' => '13px',
// Video elements color
'playiconcolor' => '',
'videotitlecolor' => '',
'videouserecolor' => '',
'videoviewsecolor' => '',
'videocountdowncolor' => '',
'videostatscolor' => '',
'videodescriptioncolor' => '',
'enablesubscriberlink' => true,
);
return array_keys( $public );
}
/**
* @return array
*
* @since 1.0
*/
public function get_connected_accounts() {
return $this->connected_accounts;
}
/**
* @return array|bool
*
* @since 1.0
*/
public function get_connected_accounts_in_feed() {
if ( isset( $this->connected_accounts_in_feed ) ) {
return $this->connected_accounts_in_feed;
} else {
return false;
}
}
/**
* @return bool|string
*
* @since 1.0
*/
public function get_transient_name() {
if ( isset( $this->transient_name ) ) {
return $this->transient_name;
} else {
return false;
}
}
/**
* Uses the feed types and terms as well as as some
* settings to create a semi-unique feed id used for
* caching and other features.
*
* Overwritten in the Pro version.
*
* @param string $transient_name
*
* @since 1.0
*/
public function set_transient_name( $transient_name = '' ) {
if ( ! empty( $transient_name ) ) {
$this->transient_name = $transient_name;
} elseif ( false && ! empty( $this->settings['feedid'] ) ) { // feed ID not yet applicable for transients
$this->transient_name = 'sby_' . $this->settings['feedid'];
} else {
$feed_type_and_terms = $this->feed_type_and_terms;
$sby_transient_name = 'sby_';
if ( isset( $feed_type_and_terms['channels'] ) ) {
foreach ( $feed_type_and_terms['channels'] as $term_and_params ) {
$channel = $term_and_params['term'];
$sby_transient_name .= $channel;
}
}
$num = $this->settings['num'];
$num_length = strlen( $num ) + 1;
//Add both parts of the caching string together and make sure it doesn't exceed 45
$sby_transient_name = substr( $sby_transient_name, 0, 45 - $num_length );
$sby_transient_name .= '#' . $num;
$this->transient_name = $sby_transient_name;
}
}
/**
* @return array|bool
*
* @since 1.0
*/
public function get_feed_type_and_terms() {
if ( isset( $this->feed_type_and_terms ) ) {
return $this->feed_type_and_terms;
} else {
return false;
}
}
public function feed_type_and_terms_display() {
if ( ! isset( $this->feed_type_and_terms ) ) {
return array();
}
$return = array();
foreach ( $this->feed_type_and_terms as $feed_type => $type_terms ) {
foreach ( $type_terms as $term ) {
$return[] = $term['term'];
}
}
return $return;
}
/**
* Based on the settings related to retrieving post data from the API,
* this setting is used to make sure all endpoints needed for the feed are
* connected and stored for easily looping through when adding posts
*
* Overwritten in the Pro version.
*
* @since 1.0
*/
public function set_feed_type_and_terms() {
//global $sby_posts_manager;
$connected_accounts_in_feed = array();
$feed_type_and_terms = array(
'channels' => array()
);
if ( ! empty( $this->settings['id'] ) ) {
$channel_array = is_array( $this->settings['id'] ) ? $this->settings['id'] : explode( ',', str_replace( ' ', '', $this->settings['id'] ) );
foreach ( $channel_array as $channel ) {
if ( isset( $this->connected_accounts[ $channel ] ) ) {
$feed_type_and_terms['channels'][] = array(
'term' => $this->connected_accounts[ $channel ]['channel_id'],
'params' => array(
'channel_id' => $this->connected_accounts[ $channel ]['channel_id']
)
);
$connected_accounts_in_feed[ $this->connected_accounts[ $channel ]['channel_id'] ] = $this->connected_accounts[ $channel ];
}
}
if ( empty( $connected_accounts_in_feed ) ) {
$an_account = array();
foreach ( $this->connected_accounts as $account ) {
if ( empty( $an_account ) ) {
$an_account = $account;
}
}
foreach ( $channel_array as $channel ) {
$feed_type_and_terms['channels'][] = array(
'term' => $channel,
'params' => array(
'channel_id' => $channel
)
);
$connected_accounts_in_feed[ $channel ] = $an_account;
}
}
} elseif ( ! empty( $this->settings['channel'] ) ) {
$channel_array = is_array( $this->settings['channel'] ) ? $this->settings['channel'] : explode( ',', str_replace( ' ', '', $this->settings['channel'] ) );
$an_account = array();
foreach ( $this->connected_accounts as $account ) {
if ( empty( $an_account ) ) {
$an_account = $account;
}
}
foreach ( $channel_array as $channel ) {
if ( strpos( $channel, 'UC' ) !== 0 ) {
$channel_id = sby_get_channel_id_from_channel_name( $channel );
if ( $channel_id ) {
$feed_type_and_terms['channels'][] = array(
'term' => $channel_id,
'params' => array(
'channel_id' => $channel_id
)
);
$connected_accounts_in_feed[ $channel_id ] = $an_account;
} else {
$feed_type_and_terms['channels'][] = array(
'term' => $channel,
'params' => array(
'channel_name' => $channel
)
);
$connected_accounts_in_feed[ $channel ] = $an_account;
}
} else {
$feed_type_and_terms['channels'][] = array(
'term' => $channel,
'params' => array(
'channel_id' => $channel
)
);
$connected_accounts_in_feed[ $channel ] = $an_account;
}
}
} else {
foreach ( $this->connected_accounts as $connected_account ) {
if ( empty( $feed_type_and_terms['channels'] ) ) {
$feed_type_and_terms['channels'][] = array(
'term' => $connected_account['channel_id'],
'params' => array(
'channel_id' => $connected_account['channel_id']
)
);
$connected_accounts_in_feed[ $connected_account['channel_id'] ] = $connected_account;
}
}
}
$this->connected_accounts_in_feed = $connected_accounts_in_feed;
$this->feed_type_and_terms = $feed_type_and_terms;
}
/**
* @return float|int
*
* @since 1.0
*/
public function get_cache_time_in_seconds() {
if ( $this->db['caching_type'] === 'background' ) {
return SBY_CRON_UPDATE_CACHE_TIME;
} else {
//If the caching time doesn't exist in the database then set it to be 1 hour
$cache_time = isset( $this->settings['cache_time'] ) ? (int)$this->settings['cache_time'] : 1;
$cache_time_unit = isset( $this->settings['cache_time_unit'] ) ? $this->settings['cache_time_unit'] : 'hours';
//Calculate the cache time in seconds
if ( $cache_time_unit == 'minutes' ) $cache_time_unit = 60;
if ( $cache_time_unit == 'hours' ) $cache_time_unit = 60*60;
if ( $cache_time_unit == 'days' ) $cache_time_unit = 60*60*24;
$cache_time = max( 900, $cache_time * $cache_time_unit );
return $cache_time;
}
}
public function update_settings($update_array = []) {
if(!is_array($update_array)) {
return false;
}
$updated = array_merge($this->settings, array_map(function ($value) {
return $this->convert_value($value);
}, $update_array));
return update_option('sby_settings', $updated);
}
private function convert_value($value) {
switch($value) {
case 'true':
return true;
case 'false':
return false;
default:
return $value;
}
}
}