This commit is contained in:
2026-04-26 23:47:49 +02:00
parent 1b95f03d1e
commit b073e009d8
5288 changed files with 1112699 additions and 55536 deletions

View File

@@ -0,0 +1,12 @@
<?php
namespace SmashBalloon\YouTubeFeed\Customizer;
class Config extends \Smashballoon\Customizer\Config {
public $plugin_slug = 'sby';
public $statuses_option = 'sby_statuses';
public function isPro() {
return sby_is_pro_version();
}
}

View File

@@ -0,0 +1,48 @@
<?php
namespace SmashBalloon\YouTubeFeed\Customizer;
use Smashballoon\Stubs\Services\ServiceProvider;
use SmashBalloon\YouTubeFeed\Helpers\Util;
class Customizer_Compatibility extends ServiceProvider {
public function register() {
add_action('admin_enqueue_scripts', [$this, 'register_scripts']);
}
public function register_scripts() {
$asset_url = trailingslashit( SBY_PLUGIN_URL ) . 'js/customizer.min.js';
if ( isset( $_GET['sb_debug'] ) ) {
$asset_url = trailingslashit( SBY_PLUGIN_URL ) . 'js/customizer-debug.js';
}
if(!Util::isProduction()) {
$asset_url = 'http://localhost:9005/customizer.min.js';
}
// only enqueue the below scripts on allowed pages; YouTube plugin All Feeds page
if ( !$this->is_allowed_screens() ) {
return;
}
wp_enqueue_script( 'sby_builder_extension', $asset_url, [], SBYVER );
}
/**
* Check for allowed screens
*
* @since 2.0
*/
public function is_allowed_screens() {
global $current_user;
$current_screen = get_current_screen();
$allowed_screens = array(
'toplevel_page_sby-feed-builder',
);
if ( in_array( $current_screen->base, $allowed_screens ) ) {
return true;
}
return;
}
}

View File

@@ -0,0 +1,90 @@
<?php
namespace SmashBalloon\YouTubeFeed\Customizer;
use Smashballoon\Customizer\Feed_Builder;
class DB extends \Smashballoon\Customizer\DB {
protected $feeds_table = 'sby_feeds';
protected $sources_table = 'sby_sources';
/**
* Query the feeds table
* Porcess to define the name of the feed when adding new
*
* @param array $args
*
* @return array|bool
*
* @since 2.0
*/
public static function feeds_query_name( $feedname ) {
global $wpdb;
$feeds_table_name = $wpdb->prefix . 'sby_feeds';
$sql = $wpdb->prepare(
"SELECT * FROM $feeds_table_name
WHERE feed_name LIKE %s;",
$wpdb->esc_like($feedname) . '%'
);
$count = sizeof($wpdb->get_results( $sql, ARRAY_A ));
return ($count == 0) ? $feedname : $feedname .' ('. ($count+1) .')';
}
/**
* Query to Duplicate a Single Feed
*
* @param array $args
*
* @return array|bool
*
* @since 2.0
*/
public static function duplicate_feed_query( $feed_id ){
global $wpdb;
$feeds_table_name = $wpdb->prefix . 'sby_feeds';
$wpdb->query(
$wpdb->prepare(
"INSERT INTO $feeds_table_name (feed_name, settings, author, status)
SELECT CONCAT(feed_name, ' (copy)'), settings, author, status
FROM $feeds_table_name
WHERE id = %d; ", $feed_id
)
);
$builder = Feed_Builder::instance();
echo sby_json_encode($builder->get_feed_list());
wp_die();
}
/**
* Query to Remove Feeds from Database
*
* @param array $args
*
* @return array|bool
*
* @since 2.0
*/
public static function delete_feeds_query( $feed_ids_array ) {
global $wpdb;
$feeds_table_name = $wpdb->prefix . 'sby_feeds';
$feed_caches_table_name = $wpdb->prefix . 'sby_feed_caches';
$feed_ids_array = array_map('intval', $feed_ids_array);
$feed_ids_array = implode(',', $feed_ids_array);
$wpdb->query(
$wpdb->prepare(
"DELETE FROM $feeds_table_name WHERE id IN ($feed_ids_array)"
)
);
$wpdb->query(
$wpdb->prepare(
"DELETE FROM $feed_caches_table_name WHERE feed_id IN ($feed_ids_array)"
)
);
$builder = Feed_Builder::instance();
echo sby_json_encode($builder->get_feed_list());
wp_die();
}
}

View File

@@ -0,0 +1,19 @@
<?php
namespace SmashBalloon\YouTubeFeed\Customizer;
use SmashBalloon\YouTubeFeed\Pro\SBY_Settings_Pro;
use SmashBalloon\YouTubeFeed\SBY_Settings;
class ProxyProvider extends \Smashballoon\Customizer\ProxyProvider {
public function get_settings_class() {
if(!sby_is_pro_version()) {
return new SBY_Settings([], sby_get_database_settings());
}
return new SBY_Settings_Pro([], sby_get_database_settings());
}
public function get_db_settings() {
return sby_get_database_settings();
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace SmashBalloon\YouTubeFeed\Customizer;
use Smashballoon\Customizer\PreviewProvider;
class ShortcodePreviewProvider implements PreviewProvider {
public function render( $attr, $settings ) {
return apply_filters( 'sby_render_shortcode', $attr, $settings );
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,184 @@
<?php
/**
* Customizer Tab
*
*
* @since 2.0
*/
namespace SmashBalloon\YouTubeFeed\Customizer\Tabs;
use Smashballoon\Customizer\Tabs\Tab;
use Smashballoon\Customizer\YouTube_License_Tier;
class Settings_Tab extends Tab {
protected $id = 'settings';
protected $heading = "";
protected $license_tier_features;
public function __construct() {
$this->heading = __('Settings', 'feeds-for-youtube');
// init license tier
$license_tier = new YouTube_License_Tier;
$this->license_tier_features = $license_tier->tier_features();
}
/**
* Get Settings Tab Sections
*
*
* @since 2.0
* @access public
*
* @return array
*/
public function get_sections() {
$learn_more = 'https://smashballoon.com/pricing/youtube-feed?utm_campaign=youtube-free&utm_source=moderation&utm_medium=learn-more';
return array(
'settings_feedtype' => array(
'heading' => __( 'Feed Type', 'feeds-for-youtube' ),
'icon' => 'feedtype',
'controls' => $this->get_settings_feedtype_controls(),
),
'settings_filters' => array(
'heading' => !sby_is_pro() ? __( 'Filters and Moderation', 'feeds-for-youtube' ) . '<span class="sb-breadcrumb-pro-label">PRO</span>' : __( 'Filters and Moderation', 'feeds-for-youtube' ),
'description' => sprintf( __('Hide one or more videos individually or with the help of Pro features. <a href="%s" target="_blank">Learn More</a>', 'feeds-for-youtube'), $learn_more ),
'icon' => 'filters',
'controls' => $this->get_settings_filters_controls(),
),
'empty_sections' => array(
'heading' => '',
'isHeader' => true,
),
'settings_advanced' => array(
'heading' => __( 'Advanced', 'feeds-for-youtube' ),
'icon' => 'cog',
'controls' => $this->get_settings_advanced_controls(),
),
);
}
/**
* Get Settings Tab Feed Type Section
*
* @since 2.0
* @return array
*/
public static function get_settings_feedtype_controls() {
return [
[
'type' => 'customview',
'viewId' => 'feedtype'
],
[
'type' => 'switcher',
'id' => 'showpast',
'label' => __( 'Show Past Live Streams', 'feeds-for-youtube' ),
'strongHeading' => 'true',
'labelStrong' => 'true',
'condition' => array( 'type' => array( 'live' ) ),
'conditionHide' => true,
'options' => array(
'enabled' => true,
'disabled' => false,
),
]
];
}
/**
* Get Settings Tab Filters Section
*
* @since 2.0
* @return array
*/
private function get_settings_filters_controls() {
return array(
array(
'type' => 'textarea',
'id' => 'includewords',
'heading' => __( 'Allowed Words or Hashtags', 'feeds-for-youtube' ),
'tooltip' => __( 'Allowed Words or Hashtags', 'feeds-for-youtube' ),
'checkExtensionPopup' => sby_is_pro() && !sby_license_notices_active() && in_array('video_filtering', $this->license_tier_features) ? null : 'advancedFilters',
'placeholder' => __( 'Show videos containing these words or hashtags. Separate multiple words with comma, and include “#” for hashtags.', 'feeds-for-youtube' ),
'ajaxAction' => 'filtersAndModeration'
),
array(
'type' => 'textarea',
'id' => 'excludewords',
'heading' => __( 'Blocked Words or Hashtags', 'feeds-for-youtube' ),
'placeholder' => __( 'Hide videos containing these words or hashtags. Separate multiple words with comma, and include “#” for hashtags.', 'feeds-for-youtube' ),
'tooltip' => __( 'Blocked Words or Hashtags', 'feeds-for-youtube' ),
'checkExtensionPopup' => sby_is_pro() && !sby_license_notices_active() && in_array('video_filtering', $this->license_tier_features) ? null : 'advancedFilters',
'separator' => 'bottom',
'ajaxAction' => 'filtersAndModeration',
),
array(
'type' => 'textarea',
'id' => 'hidevideos',
'heading' => __( 'Hide specific Videos', 'feeds-for-youtube' ),
'tooltip' => __( 'Hide specific Videos', 'feeds-for-youtube' ),
'placeholder' => __( 'Enter video IDs. Separate multiple IDs with comma', 'feeds-for-youtube' ),
'checkExtensionPopup' => sby_is_pro() && !sby_license_notices_active() && in_array('video_filtering', $this->license_tier_features) ? null : 'advancedFilters',
'ajaxAction' => 'feedRefresh',
),
);
}
/**
* Get Settings Tab Advanced Section
* @since 2.0
* @return array
*/
private function get_settings_advanced_controls() {
return array(
array(
'type' => 'select',
'id' => 'storage_process',
'strongHeading' => 'true',
'heading' => __( 'Local Storage Process', 'feeds-for-youtube' ),
'options' => array(
'background' => 'Background',
'page' => 'Page',
'none' => 'None',
),
),
array(
'type' => 'switcher',
'id' => 'ajax_post_load',
'label' => __( 'Load Initial Posts with AJAX', 'feeds-for-youtube' ),
'strongHeading' => 'true',
'labelStrong' => 'true',
'options' => array(
'enabled' => true,
'disabled' => false,
),
),
array(
'type' => 'switcher',
'id' => 'eagerload',
'label' => __( 'Load iFrames on Page Load', 'feeds-for-youtube' ),
'strongHeading' => 'true',
'labelStrong' => 'true',
'options' => array(
'enabled' => true,
'disabled' => false,
),
),
);
}
/**
* Get Settings TabSources Section
* @since 6.0
* @return array
*/
private function get_settings_sources_controls() {
return array(
array(
'type' => 'customview',
'viewId' => 'sources',
),
);
}
}

View File

@@ -0,0 +1,408 @@
<?php
/**
* Styling Tab
* Contains different controls for the individual Elements
*
* @since 2.0
*/
namespace SmashBalloon\YouTubeFeed\Customizer\Tabs;
if(!defined('ABSPATH')) exit;
use SmashBalloon\YouTubeFeed\SBY_Display_Elements;
class Styling_Tab{
/**
*
* @since 2.0
* @return array
*/
public static function empty_style(){
return [];
}
/**
* Get Customize Tab Individual Elements Nested Section
* @since 2.0
* @return array
*/
public static function playicon_styling_title(){
return [
[
'type' => 'separator',
'top' => 20,
'bottom' => 5,
],
[
'type' => 'heading',
'heading' => __( 'Text', 'feeds-for-youtube' ),
],
[
'type' => 'colorpicker',
'id' => 'playiconcolor',
'layout' => 'half',
'strongHeading' => 'false',
'heading' => __( 'Color', 'feeds-for-youtube' ),
'style' => array( '[id^=sb_youtube_].sb_youtube .sby_video_title' => 'color:{{value}};' ),
'stacked' => 'true'
]
];
}
/**
* Get Customize Tab Individual Elements Nested Section
* @since 2.0
* @return array
*/
public static function video_styling_title(){
return [
[
'type' => 'separator',
'top' => 20,
'bottom' => 5,
],
[
'type' => 'heading',
'heading' => __( 'Text', 'feeds-for-youtube' ),
],
[
'type' => 'colorpicker',
'id' => 'videotitlecolor',
'layout' => 'half',
'strongHeading' => 'false',
'heading' => __( 'Color', 'feeds-for-youtube' ),
'style' => array( '[id^=sb_youtube_].sb_youtube .sby_video_title' => 'color:{{value}} !important;' ),
'stacked' => 'true'
]
];
}
/**
* Get Customize Tab Individual Elements Nested Section
* @since 2.0
* @return array
*/
public static function user_styling_title(){
return [
[
'type' => 'separator',
'top' => 20,
'bottom' => 5,
],
[
'type' => 'heading',
'heading' => __( 'Text', 'feeds-for-youtube' ),
],
[
'type' => 'colorpicker',
'id' => 'videouserecolor',
'layout' => 'half',
'strongHeading' => 'false',
'heading' => __( 'Color', 'feeds-for-youtube' ),
'style' => array( '[id^=sb_youtube_].sb_youtube .sby_meta span.sby_username_wrap' => 'color:{{value}} !important;' ),
'stacked' => 'true'
]
];
}
/**
* Get Customize Tab Individual Elements Nested Section
* @since 2.0
* @return array
*/
public static function views_styling_title(){
return [
[
'type' => 'separator',
'top' => 20,
'bottom' => 5,
],
[
'type' => 'heading',
'heading' => __( 'Text', 'feeds-for-youtube' ),
],
[
'type' => 'colorpicker',
'id' => 'videoviewsecolor',
'layout' => 'half',
'strongHeading' => 'false',
'heading' => __( 'Color', 'feeds-for-youtube' ),
'style' => array( '[id^=sb_youtube_].sb_youtube .sby_meta span.sby_view_count_wrap' => 'color:{{value}} !important;' ),
'stacked' => 'true'
]
];
}
/**
* Get Customize Tab Individual Elements Nested Section
* @since 2.0
* @return array
*/
public static function countdown_styling_title(){
return [
[
'type' => 'separator',
'top' => 20,
'bottom' => 5,
],
[
'type' => 'heading',
'heading' => __( 'Text', 'feeds-for-youtube' ),
],
[
'type' => 'colorpicker',
'id' => 'videocountdowncolor',
'layout' => 'half',
'strongHeading' => 'false',
'heading' => __( 'Color', 'feeds-for-youtube' ),
'style' => array( '[id^=sb_youtube_].sb_youtube .sby_ls_message_wrap .sby_ls_message' => 'background-color:{{value}} !important;' ),
'stacked' => 'true'
]
];
}
/**
* Get Customize Tab Individual Elements Nested Section
* @since 2.0
* @return array
*/
public static function stats_styling_title(){
return [
[
'type' => 'separator',
'top' => 20,
'bottom' => 5,
],
[
'type' => 'heading',
'heading' => __( 'Text', 'feeds-for-youtube' ),
],
[
'type' => 'colorpicker',
'id' => 'videostatscolor',
'layout' => 'half',
'strongHeading' => 'false',
'heading' => __( 'Color', 'feeds-for-youtube' ),
'style' => array( '[id^=sb_youtube_].sb_youtube .sby_info .sby_stats' => 'color:{{value}}!important;' ),
'stacked' => 'true'
]
];
}
/**
* Get Customize Tab Individual Elements Nested Section
* @since 2.0
* @return array
*/
public static function date_styling_title(){
$full_date = SBY_Display_Elements::full_date( strtotime( 'July 25th, 5:30 pm' ), array( 'dateformat' => '0', 'customdate' => '' ), $include_time = true );
return [
[
'type' => 'separator',
'top' => 20,
'bottom' => 5,
],
[
'type' => 'heading',
'heading' => __( 'Format', 'feeds-for-youtube' ),
],
[
'type' => 'select',
'id' => 'dateformat',
'stacked' => 'true',
'options' => array(
'0' => sprintf( __( 'WordPress Default (%s)', 'feeds-for-youtube' ), $full_date ),
'1' => __( 'July 25th, 5:30 pm', 'feeds-for-youtube'),
'2' => __( 'July 25th', 'feeds-for-youtube'),
'3' => __( 'Mon July 25th', 'feeds-for-youtube'),
'4' => __( 'Monday July 25th', 'feeds-for-youtube'),
'5' => __( 'Mon Jul 25th, 2020', 'feeds-for-youtube'),
'6' => __( 'Monday July 25th, 2020 - 5:30 pm', 'feeds-for-youtube'),
'7' => __( '07.25.20', 'feeds-for-youtube'),
'8' => __( '07.25.20 - 17:30', 'feeds-for-youtube'),
'9' => __( '07/25/20', 'feeds-for-youtube'),
'10' => __( '25.07.20', 'feeds-for-youtube'),
'11' => __( '25/07/20', 'feeds-for-youtube'),
'12' => __( '25th July 2020, 17:30', 'feeds-for-youtube'),
'custom' => __( 'Custom', 'feeds-for-youtube'),
),
'default' => 'automatically',
'ajaxAction' => 'feedFlyPreview',
],
[
'type' => 'text',
'id' => 'customdate',
'condition' => array( 'dateformat' => array( 'custom' ) ),
'conditionHide' => true,
'strongHeading' => 'false',
'stacked' => 'true',
'placeholder' => 'Enter custom format (F j, Y g:i a)',
'ajaxAction' => 'feedFlyPreview',
],
[
'type' => 'checkbox',
'id' => 'userelative',
'label' => __( 'Use relative time (for example: 5 hours ago) when the video is less than 2 days old', 'feeds-for-youtube' ),
'reverse' => 'true',
'stacked' => 'true',
'options' => array(
'enabled' => true,
'disabled' => false,
)
]
];
}
/**
* Get Customize Tab Individual Elements Nested Section
* @since 2.0
* @return array
*/
public static function description_styling_title(){
return [
[
'type' => 'separator',
'top' => 20,
'bottom' => 5,
],
[
'type' => 'number',
'id' => 'descriptionlength',
'stacked' => 'true',
'fieldSuffix' => 'characters',
'heading' => __( 'Maximum Text Length', 'feeds-for-youtube' ),
'description' => __( 'Description will truncate after reaching the length', 'feeds-for-youtube' ),
],
[
'type' => 'heading',
'heading' => __( 'Text', 'feeds-for-youtube' ),
],
[
'type' => 'select',
'id' => 'descriptiontextsize',
'heading' => __( 'Description Text Size', 'feeds-for-youtube' ),
'layout' => 'half',
'strongHeading' => 'false',
'stacked' => 'true',
'options' => array(
'12px' => '12px',
'13px' => '13px',
'14px' => '14px',
'15px' => '15px',
'16px' => '16px',
'18px' => '18px',
'20px' => '20px',
),
'default' => '13px',
'style' => array( '[id^=sb_youtube_].sb_youtube .sby_caption_wrap .sby_caption' => 'font-size:{{value}} !important;' ),
],
[
'type' => 'colorpicker',
'id' => 'videodescriptioncolor',
'layout' => 'half',
'strongHeading' => 'false',
'heading' => __( 'Color', 'feeds-for-youtube' ),
'style' => array( '[id^=sb_youtube_].sb_youtube .sby_caption_wrap.sby_item_caption_wrap .sby_caption' => 'color:{{value}}!important;' ),
'stacked' => 'true'
],
];
}
/**
* Get Customize Tab Individual Elements Nested Section
* @since 2.0
* @return array
*/
public static function call_to_action( $feed_id ){
return array(
array(
'type' => 'separator',
'top' => 0,
'bottom' => 10,
),
array(
'type' => 'select',
'id' => 'cta',
'heading' => __( 'Type', 'feeds-for-youtube' ),
'description' => __( 'What the user sees when a video pauses or ends', 'feeds-for-youtube' ),
'strongHeading' => 'true',
'stacked' => 'true',
'options' => array(
'related' => 'Related Videos',
'link' => 'Custom Link',
'default' => 'YouTube Default',
),
'default' => 'related'
),
array(
'type' => 'separator',
'condition' => array( 'cta' => array( 'link' ) ),
'conditionHide' => true,
'top' => 20,
'bottom' => 5,
),
array(
'type' => 'heading',
'heading' => __( 'Settings', 'feeds-for-youtube' ),
'condition' => array( 'cta' => array( 'link' ) ),
'conditionHide' => true,
),
array(
'type' => 'text',
'id' => 'linktext',
'layout' => 'half',
'condition' => array( 'cta' => array( 'link' ) ),
'conditionHide' => true,
'strongHeading' => 'false',
'stacked' => 'true',
'heading' => __( 'Button Text', 'feeds-for-youtube' ),
),
array(
'type' => 'colorpicker',
'id' => 'linkcolor',
'condition' => array( 'cta' => array( 'link' ) ),
'conditionHide' => true,
'layout' => 'half',
'strongHeading' => 'false',
'heading' => __( 'Button Background', 'feeds-for-youtube' ),
'style' => array( '[id^=sb_youtube_].sb_youtube.sby_palette_custom_' . $feed_id . ' .sby_video_title' => 'color:{{value}}!important;' ),
'stacked' => 'true',
),
array(
'type' => 'colorpicker',
'id' => 'linktextcolor',
'condition' => array( 'cta' => array( 'link' ) ),
'conditionHide' => true,
'layout' => 'half',
'strongHeading' => 'false',
'heading' => __( 'Button Text Color', 'feeds-for-youtube' ),
'style' => array( '[id^=sb_youtube_].sb_youtube.sby_palette_custom_' . $feed_id . ' .sby_video_title' => 'color:{{value}}!important;' ),
'stacked' => 'true',
),
array(
'type' => 'select',
'id' => 'linkopentype',
'heading' => __( 'Open link in', 'feeds-for-youtube' ),
'condition' => array( 'cta' => array( 'link' ) ),
'conditionHide' => true,
'layout' => 'half',
'strongHeading' => 'false',
'stacked' => 'true',
'options' => array(
'same' => 'Same Window',
'newwindow' => 'New Window',
),
'default' => 'same'
),
array(
'type' => 'textarea',
'id' => 'linkurl',
'heading' => __( 'Default Link', 'feeds-for-youtube' ),
'placeholder' => __( 'https://', 'feeds-for-youtube' ),
'condition' => array( 'cta' => array( 'link' ) ),
'conditionHide' => true,
)
);
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace SmashBalloon\YouTubeFeed\Customizer\Tabs;
use Smashballoon\Customizer\Tabs\Manager;
use Smashballoon\Stubs\Services\ServiceProvider;
class TabsService extends ServiceProvider {
/**
* @var Customize_Tab
*/
private $customize_tab;
/**
* @var Settings_Tab
*/
private $settings_tab;
public function __construct(Customize_Tab $customize_tab, Settings_Tab $settings_tab) {
$this->customize_tab = $customize_tab;
$this->settings_tab = $settings_tab;
}
public function register() {
$tabs_manager = Manager::getInstance();
$tabs_manager->register_tab($this->customize_tab);
$tabs_manager->register_tab($this->settings_tab);
}
}