show_access_error( 'Invalid access parameter. Please use the correct link from your email.' );
return;
}
// Validate the access token
if ( ! $this->validate_white_label_access_token( $access_token ) ) {
$this->show_access_error( 'Invalid or expired access token. Please use the correct access link from your email.' );
return;
}
// Valid access - temporarily allow access by setting a flag
add_action('admin_init', [$this, 'admin_init']);
add_action('admin_menu', [$this, 'admin_menu'], 201);
// Add success notice
add_action( 'admin_notices', function() {
echo '
';
echo '
✅ White Label Access Granted! You can now modify white label settings.
',
'Access Denied',
[ 'response' => 403 ]
);
}
/**
* Inject white label icon CSS
*
* @access public
* @return void
*/
public function inject_white_label_icon_css() {
$white_label_enabled = get_option('ps_white_label_enabled', false);
$white_label_icon = get_option('ps_white_label_icon', '');
// Only inject CSS when white label is enabled AND a custom icon is set
if ( $white_label_enabled && ! empty( $white_label_icon ) ) {
echo '';
}
// When white label is disabled or no icon is set, don't inject any CSS
// This allows WordPress's original icon to display naturally
}
/**
* Get used widgets.
*
* @access public
* @return array
* @since 6.0.0
*
*/
public static function get_used_widgets() {
$used_widgets = array();
if (class_exists('Elementor\Modules\Usage\Module')) {
$module = Module::instance();
$old_error_level = error_reporting();
error_reporting(E_ALL & ~E_WARNING); // Suppress warnings
$elements = $module->get_formatted_usage('raw');
error_reporting($old_error_level); // Restore
$ps_widgets = self::get_ps_widgets_names();
if (is_array($elements) || is_object($elements)) {
foreach ($elements as $post_type => $data) {
foreach ($data['elements'] as $element => $count) {
if (in_array($element, $ps_widgets, true)) {
if (isset($used_widgets[$element])) {
$used_widgets[$element] += $count;
} else {
$used_widgets[$element] = $count;
}
}
}
}
}
}
return $used_widgets;
}
/**
* Get used separate widgets.
*
* @access public
* @return array
* @since 6.0.0
*
*/
public static function get_used_only_widgets() {
$used_widgets = array();
if (class_exists('Elementor\Modules\Usage\Module')) {
$module = Module::instance();
$old_error_level = error_reporting();
error_reporting(E_ALL & ~E_WARNING); // Suppress warnings
$elements = $module->get_formatted_usage('raw');
error_reporting($old_error_level); // Restore
$ps_widgets = self::get_ps_only_widgets();
if (is_array($elements) || is_object($elements)) {
foreach ($elements as $post_type => $data) {
foreach ($data['elements'] as $element => $count) {
if (in_array($element, $ps_widgets, true)) {
if (isset($used_widgets[$element])) {
$used_widgets[$element] += $count;
} else {
$used_widgets[$element] = $count;
}
}
}
}
}
}
return $used_widgets;
}
/**
* Get used only separate 3rdParty widgets.
*
* @access public
* @return array
* @since 6.0.0
*
*/
public static function get_used_only_3rdparty() {
$used_widgets = array();
if (class_exists('Elementor\Modules\Usage\Module')) {
$module = Module::instance();
$old_error_level = error_reporting();
error_reporting(E_ALL & ~E_WARNING); // Suppress warnings
$elements = $module->get_formatted_usage('raw');
error_reporting($old_error_level); // Restore
$ps_widgets = self::get_ps_only_3rdparty_names();
if (is_array($elements) || is_object($elements)) {
foreach ($elements as $post_type => $data) {
foreach ($data['elements'] as $element => $count) {
if (in_array($element, $ps_widgets, true)) {
if (isset($used_widgets[$element])) {
$used_widgets[$element] += $count;
} else {
$used_widgets[$element] = $count;
}
}
}
}
}
}
return $used_widgets;
}
/**
* Get unused widgets.
*
* @access public
* @return array
* @since 6.0.0
*
*/
public static function get_unused_widgets() {
if (!current_user_can('install_plugins')) {
die();
}
$ps_widgets = self::get_ps_widgets_names();
$used_widgets = self::get_used_widgets();
$unused_widgets = array_diff($ps_widgets, array_keys($used_widgets));
return $unused_widgets;
}
/**
* Get unused separate widgets.
*
* @access public
* @return array
* @since 6.0.0
*
*/
public static function get_unused_only_widgets() {
if (!current_user_can('install_plugins')) {
die();
}
$ps_widgets = self::get_ps_only_widgets();
$used_widgets = self::get_used_only_widgets();
$unused_widgets = array_diff($ps_widgets, array_keys($used_widgets));
return $unused_widgets;
}
/**
* Get unused separate 3rdparty widgets.
*
* @access public
* @return array
* @since 6.0.0
*
*/
public static function get_unused_only_3rdparty() {
if (!current_user_can('install_plugins')) {
die();
}
$ps_widgets = self::get_ps_only_3rdparty_names();
$used_widgets = self::get_used_only_3rdparty();
$unused_widgets = array_diff($ps_widgets, array_keys($used_widgets));
return $unused_widgets;
}
/**
* Get widgets name
*
* @access public
* @return array
* @since 6.0.0
*
*/
public static function get_ps_widgets_names() {
$names = self::$modules_names;
if (null === $names) {
$names = array_map(
function ($item) {
return isset($item['name']) ? 'prime-slider-' . str_replace('_', '-', $item['name']) : 'none';
},
self::$modules_list
);
}
return $names;
}
/**
* Get separate widgets name
*
* @access public
* @return array
* @since 6.0.0
*
*/
public static function get_ps_only_widgets() {
$names = self::$modules_names_only_widgets;
if (null === $names) {
$names = array_map(
function ($item) {
return isset($item['name']) ? 'prime-slider-' . str_replace('_', '-', $item['name']) : 'none';
},
self::$modules_list_only_widgets
);
}
return $names;
}
/**
* Get separate 3rdParty widgets name
*
* @access public
* @return array
* @since 6.0.0
*
*/
public static function get_ps_only_3rdparty_names() {
$names = self::$modules_names_only_3rdparty;
if (null === $names) {
$names = array_map(
function ($item) {
return isset($item['name']) ? 'prime-slider-' . str_replace('_', '-', $item['name']) : 'none';
},
self::$modules_list_only_3rdparty
);
}
return $names;
}
/**
* Get URL with page id
*
* @access public
*
*/
public static function get_url() {
return admin_url('admin.php?page=' . self::PAGE_ID);
}
/**
* Init settings API
*
* @access public
*
*/
public function admin_init() {
//set the settings
$this->settings_api->set_sections($this->get_settings_sections());
$this->settings_api->set_fields($this->prime_slider_admin_settings());
//initialize settings
$this->settings_api->admin_init();
$this->ps_redirect_to_get_pro();
if (true === _is_ps_pro_activated()) {
$this->bdt_redirect_to_renew_link();
}
}
/**
* Add Plugin Menus
*
* @access public
*
*/
// Redirect to Prime Slider Pro pricing page
public function ps_redirect_to_get_pro() {
if (isset($_GET['page']) && $_GET['page'] === self::PAGE_ID . '_get_pro') {
wp_redirect('https://primeslider.pro/pricing/');
exit;
}
}
// Redirect to renew link
public function bdt_redirect_to_renew_link() {
if (isset($_GET['page']) && $_GET['page'] === self::PAGE_ID . '_license_renew') {
wp_redirect('https://account.bdthemes.com/');
exit;
}
}
public function admin_menu() {
add_menu_page(
BDTPS_CORE_TITLE . ' ' . esc_html__('Dashboard', 'bdthemes-prime-slider'),
BDTPS_CORE_TITLE,
'manage_options',
self::PAGE_ID,
[$this, 'plugin_page'],
$this->prime_slider_icon(),
58
);
add_submenu_page(
self::PAGE_ID,
BDTPS_CORE_TITLE,
esc_html__('Core Widgets', 'bdthemes-prime-slider'),
'manage_options',
self::PAGE_ID . '#prime_slider_active_modules',
[$this, 'display_page']
);
add_submenu_page(
self::PAGE_ID,
BDTPS_CORE_TITLE,
esc_html__('3rd Party Widgets', 'bdthemes-prime-slider'),
'manage_options',
self::PAGE_ID . '#prime_slider_third_party_widget',
[$this, 'display_page']
);
add_submenu_page(
self::PAGE_ID,
BDTPS_CORE_TITLE,
esc_html__('Extensions', 'bdthemes-prime-slider'),
'manage_options',
self::PAGE_ID . '#prime_slider_elementor_extend',
[$this, 'display_page']
);
add_submenu_page(
self::PAGE_ID,
BDTPS_CORE_TITLE,
esc_html__('Special Features', 'bdthemes-prime-slider'),
'manage_options',
self::PAGE_ID . '#prime_slider_other_settings',
[$this, 'display_page']
);
add_submenu_page(
self::PAGE_ID,
BDTPS_CORE_TITLE,
esc_html__('Extra Options', 'bdthemes-prime-slider'),
'manage_options',
self::PAGE_ID . '#prime_slider_extra_options',
[$this, 'plugin_page']
);
add_submenu_page(
self::PAGE_ID,
BDTPS_CORE_TITLE,
esc_html__('System Status', 'bdthemes-prime-slider'),
'manage_options',
self::PAGE_ID . '#prime_slider_analytics_system_req',
[$this, 'plugin_page']
);
add_submenu_page(
self::PAGE_ID,
BDTPS_CORE_TITLE,
esc_html__('Other Plugins', 'bdthemes-prime-slider'),
'manage_options',
self::PAGE_ID . '#prime_slider_other_plugins',
[$this, 'plugin_page']
);
// add_submenu_page(
// self::PAGE_ID,
// BDTPS_CORE_TITLE,
// esc_html__('Get Up to 60%', 'bdthemes-prime-slider'),
// 'manage_options',
// self::PAGE_ID . '#prime_slider_affiliate',
// [$this, 'plugin_page']
// );
if (true == _is_ps_pro_activated()) {
add_submenu_page(
self::PAGE_ID,
BDTPS_CORE_TITLE,
esc_html__('Rollback Version', 'bdthemes-prime-slider'),
'manage_options',
self::PAGE_ID . '#prime_slider_rollback_version',
[$this, 'plugin_page']
);
}
}
/**
* Get SVG Icons of Prime Slider
*
* @access public
* @return string
*/
public function prime_slider_icon() {
return 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjMsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAyMzAuNyAyNTQuOCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjMwLjcgMjU0Ljg7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJLnN0MHtmaWxsOnVybCgjU1ZHSURfMV8pO30NCgkuc3Qxe2ZpbGw6dXJsKCNTVkdJRF8yXyk7fQ0KCS5zdDJ7ZmlsbDp1cmwoI1NWR0lEXzNfKTt9DQoJLnN0M3tmaWxsOnVybCgjU1ZHSURfNF8pO30NCgkuc3Q0e2ZpbGw6dXJsKCNTVkdJRF81Xyk7fQ0KPC9zdHlsZT4NCjxnPg0KCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMTY1Ljg4MTMiIHkxPSItOS4xNzQyIiB4Mj0iLTE0Ljk3ODMiIHkyPSIxOTIuNzE1NiI+DQoJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNGQzZBMkMiLz4NCgkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0ZFNTE2QiIvPg0KCTwvbGluZWFyR3JhZGllbnQ+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTIwMi4yLDY5LjJoLTE3NGMtMywwLTUuNS0yLjUtNS41LTUuNVYzMS4xYzAtMywyLjUtNS41LDUuNS01LjVoMTc0YzMsMCw1LjUsMi41LDUuNSw1LjV2MzIuNg0KCQlDMjA3LjcsNjYuOCwyMDUuMiw2OS4yLDIwMi4yLDY5LjJ6Ii8+DQoJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8yXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyMDUuNjI4MSIgeTE9IjI2LjQzMjMiIHgyPSIyNC43Njg1IiB5Mj0iMjI4LjMyMjEiPg0KCQk8c3RvcCAgb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojRkM2QTJDIi8+DQoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNGRTUxNkIiLz4NCgk8L2xpbmVhckdyYWRpZW50Pg0KCTxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0yMDIuMiwxNDkuMmgtMTc0Yy0zLDAtNS41LTIuNS01LjUtNS41di0zMi42YzAtMywyLjUtNS41LDUuNS01LjVoMTc0YzMsMCw1LjUsMi41LDUuNSw1LjV2MzIuNg0KCQlDMjA3LjcsMTQ2LjgsMjA1LjIsMTQ5LjIsMjAyLjIsMTQ5LjJ6Ii8+DQoJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8zXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyMjMuMDM5IiB5MT0iNDIuMDI5NSIgeDI9IjQyLjE3OTQiIHkyPSIyNDMuOTE5NCI+DQoJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiNGQzZBMkMiLz4NCgkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0ZFNTE2QiIvPg0KCTwvbGluZWFyR3JhZGllbnQ+DQoJPHBhdGggY2xhc3M9InN0MiIgZD0iTTEyMS42LDIyOS4ySDI4LjJjLTMsMC01LjUtMi41LTUuNS01LjV2LTMyLjZjMC0zLDIuNS01LjUsNS41LTUuNWg5My41YzMsMCw1LjUsMi41LDUuNSw1LjV2MzIuNg0KCQlDMTI3LjIsMjI2LjcsMTI0LjcsMjI5LjIsMTIxLjYsMjI5LjJ6Ii8+DQoJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF80XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxNDYuMDMzMSIgeTE9Ii0yNi45NTUiIHgyPSItMzQuODI2NiIgeTI9IjE3NC45MzQ4Ij4NCgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZDNkEyQyIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojRkU1MTZCIi8+DQoJPC9saW5lYXJHcmFkaWVudD4NCgk8cGF0aCBjbGFzcz0ic3QzIiBkPSJNNjYuMyw0NS43VjEyN2MwLDMtMi41LDUuNS01LjUsNS41SDI4LjJjLTMsMC01LjUtMi41LTUuNS01LjVWNDUuN2MwLTMsMi41LTUuNSw1LjUtNS41aDMyLjYNCgkJQzYzLjgsNDAuMiw2Ni4zLDQyLjcsNjYuMyw0NS43eiIvPg0KCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfNV8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMjY0LjcxMzQiIHkxPSI3OS4zNjI4IiB4Mj0iODMuODUzNyIgeTI9IjI4MS4yNTI2Ij4NCgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6I0ZDNkEyQyIvPg0KCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojRkU1MTZCIi8+DQoJPC9saW5lYXJHcmFkaWVudD4NCgk8cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMjA3LjcsMTExLjF2MTEyLjZjMCwzLTIuNSw1LjUtNS41LDUuNWgtMzIuNmMtMywwLTUuNS0yLjUtNS41LTUuNVYxMTEuMWMwLTMsMi41LTUuNSw1LjUtNS41aDMyLjYNCgkJQzIwNS4yLDEwNS42LDIwNy43LDEwOCwyMDcuNywxMTEuMXoiLz4NCjwvZz4NCjwvc3ZnPg0K';
}
/**
* Get SVG Icons of Prime Slider
*
* @access public
* @return array
*/
public function get_settings_sections() {
$sections = [
[
'id' => 'prime_slider_active_modules',
'title' => esc_html__('Core Widgets', 'bdthemes-prime-slider')
],
[
'id' => 'prime_slider_third_party_widget',
'title' => esc_html__('3rd Party Widgets', 'bdthemes-prime-slider')
],
[
'id' => 'prime_slider_elementor_extend',
'title' => esc_html__('Extensions', 'bdthemes-prime-slider')
],
[
'id' => 'prime_slider_other_settings',
'title' => esc_html__('Special Features', 'bdthemes-prime-slider'),
],
];
return $sections;
}
/**
* Merge Admin Settings
*
* @access protected
* @return array
*/
protected function prime_slider_admin_settings() {
return ModuleService::get_widget_settings(function ($settings) {
$settings_fields = $settings['settings_fields'];
self::$modules_list = array_merge($settings_fields['prime_slider_active_modules'], $settings_fields['prime_slider_third_party_widget']);
self::$modules_list_only_widgets = $settings_fields['prime_slider_active_modules'];
self::$modules_list_only_3rdparty = $settings_fields['prime_slider_third_party_widget'];
return $settings_fields;
});
}
/**
* Get Welcome Panel
*
* @access public
* @return void
*/
public function prime_slider_welcome() {
?>
', ''); ?>
Prime Slider
Rooten
';
} else {
echo '';
}
?>
settings_api->show_navigation(); ?>
prime_slider_welcome(); ?>
settings_api->show_forms(); ?>
prime_slider_extra_options(); ?>
prime_slider_analytics_system_req_content(); ?>
prime_slider_others_plugin(); ?>
prime_slider_rollback_version_content(); ?>
prime_slider_get_pro(); ?>
footer_info();
} ?>
script();
}
/**
* Tabbable JavaScript codes & Initiate Color Picker
*
* This code uses localstorage for displaying active tabs
*/
function script() {
?>
ID] = $page->post_title;
}
}
return $pages_options;
}
/**
* Check if current license supports white label features
* Now includes other_param checking for AppSumo WL flag
*
* @access public static
* @return bool
*/
public static function is_white_label_license() {
// Check if pro version is activated first
if (!function_exists('_is_ps_pro_activated') || !_is_ps_pro_activated()) {
return false;
}
// Since PrimeSliderPro\Base doesn't exist, return false for now
// This should be replaced with actual pro license checking logic when available
$license_info = PrimeSliderPro\Base\Prime_Slider_Base::GetRegisterInfo();
// Security: Validate license info structure
if (empty($license_info) ||
!is_object($license_info) ||
empty($license_info->license_title) ||
empty($license_info->is_valid)) {
return false;
}
// Sanitize license title to prevent any potential issues
$license_title = sanitize_text_field(strtolower($license_info->license_title));
// Check for other_param WL flag FIRST (for AppSumo and other special licenses)
if (!empty($license_info->other_param)) {
// Check if other_param contains WL flag
if (is_array($license_info->other_param)) {
if (in_array('WL', $license_info->other_param, true)) {
return true;
}
} elseif (is_string($license_info->other_param)) {
if (strpos($license_info->other_param, 'WL') !== false) {
return true;
}
}
}
// Check standard license types (but NOT AppSumo - AppSumo requires WL flag)
$allowed_types = self::get_white_label_allowed_license_types();
$allowed_hashes = array_values($allowed_types);
// Split license title into words and check each word
$words = preg_split('/\s+/', $license_title, -1, PREG_SPLIT_NO_EMPTY);
foreach ($words as $word) {
$word = trim($word);
if (empty($word) || strlen($word) > 50) { // Prevent extremely long strings
continue;
}
// Use SHA-256 for enhanced security
$hash = hash('sha256', $word);
if (in_array($hash, $allowed_hashes, true)) { // Strict comparison
return true;
}
}
return false;
}
/**
* Render White Label Section
*
* @access public
* @return void
*/
public function render_white_label_section() {
//// Safely check if helper functions exist
$is_pro_installed = function_exists('_is_pro_pro_installed') ? _is_pro_pro_installed() : false;
$is_pro_activated = function_exists('_is_ps_pro_activated') ? _is_ps_pro_activated() : false;
// Define plugin slug (adjust if needed)
$plugin_slug = 'bdthemes-prime-slider/bdthemes-prime-slider.php';
// Case 1: Pro not installed
if ( ! $is_pro_installed ) : ?>