<?php
use \Elementor\Controls_Manager;
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class WPR_DC_Section_Device_Browser extends WPR_DC_Section_Base {
public function get_id() {
return 'wpr_dc_device_browser';
}
public function get_label() {
return esc_html__( 'Device & Browser', 'wpr-addons' );
}
public function get_order() {
return 70;
}
public function register_controls( $element ) {
$element->add_control(
'wpr_dc_devices',
[
'label' => esc_html__( 'Devices', 'wpr-addons' ),
'description' => esc_html__( 'Hidden elements are removed from the page code for faster loading.', 'wpr-addons' ),
'type' => Controls_Manager::SELECT2,
'multiple' => true,
'label_block' => true,
'default' => [],
'options' => [
'desktop' => esc_html__( 'Desktop', 'wpr-addons' ),
'tablet' => esc_html__( 'Tablet', 'wpr-addons' ),
'mobile' => esc_html__( 'Mobile', 'wpr-addons' ),
],
'render_type' => 'none',
]
);
$element->add_control(
'wpr_dc_browsers',
[
'label' => esc_html__( 'Browsers', 'wpr-addons' ),
'type' => Controls_Manager::SELECT2,
'multiple' => true,
'label_block' => true,
'default' => [],
'options' => [
'chrome' => esc_html__( 'Chrome', 'wpr-addons' ),
'firefox' => esc_html__( 'Firefox', 'wpr-addons' ),
'safari' => esc_html__( 'Safari', 'wpr-addons' ),
'edge' => esc_html__( 'Edge', 'wpr-addons' ),
'opera' => esc_html__( 'Opera', 'wpr-addons' ),
'ie' => esc_html__( 'Internet Explorer', 'wpr-addons' ),
],
'render_type' => 'none',
]
);
}
public function evaluate( $settings ) {
$devices = ! empty( $settings['wpr_dc_devices'] ) ? $settings['wpr_dc_devices'] : [];
$browsers = ! empty( $settings['wpr_dc_browsers'] ) ? $settings['wpr_dc_browsers'] : [];
if ( empty( $devices ) && empty( $browsers ) ) {
return null;
}
// Get cached UA info from the manager
global $wpr_dc_manager;
$ua_info = null;
if ( isset( $wpr_dc_manager ) && method_exists( $wpr_dc_manager, 'get_user_agent_info' ) ) {
$ua_info = $wpr_dc_manager->get_user_agent_info();
}
if ( ! $ua_info ) {
$ua_info = $this->parse_user_agent();
}
$results = [];
if ( ! empty( $devices ) ) {
$results[] = in_array( $ua_info['device'], $devices, true );
}
if ( ! empty( $browsers ) ) {
$results[] = in_array( $ua_info['browser'], $browsers, true );
}
if ( empty( $results ) ) {
return null;
}
return ! in_array( false, $results, true );
}
private function parse_user_agent() {
$ua = isset( $_SERVER['HTTP_USER_AGENT'] ) ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ) : '';
return [
'device' => $this->detect_device( $ua ),
'browser' => $this->detect_browser( $ua ),
];
}
private function detect_device( $ua ) {
if ( preg_match( '/iPad|Android(?!.*Mobile)|Tablet/i', $ua ) ) {
return 'tablet';
}
if ( preg_match( '/Mobile|iPhone|iPod|Android.*Mobile|webOS|BlackBerry|Opera Mini|IEMobile/i', $ua ) ) {
return 'mobile';
}
return 'desktop';
}
private function detect_browser( $ua ) {
if ( preg_match( '/Edg\//i', $ua ) ) {
return 'edge';
}
if ( preg_match( '/OPR|Opera/i', $ua ) ) {
return 'opera';
}
if ( preg_match( '/Chrome/i', $ua ) && ! preg_match( '/Edg|OPR/i', $ua ) ) {
return 'chrome';
}
if ( preg_match( '/Safari/i', $ua ) && ! preg_match( '/Chrome|Edg|OPR/i', $ua ) ) {
return 'safari';
}
if ( preg_match( '/Firefox/i', $ua ) ) {
return 'firefox';
}
if ( preg_match( '/MSIE|Trident/i', $ua ) ) {
return 'ie';
}
return 'other';
}
}