Слов в тексте - 60, время чтения в минутах - 1
Данный сниппет поможет устанавливать класс девайса для которого предназначен тот или иной виджет.
DISCLAMER: Может не работать с некоторыми виджетами в некоторых шаблонах (темах) внешнего вида. Это относится ко многим сниппетам и настройкам CSS, к сожалению.
<?php
/**
* Snippet Name: Widget Device Visibility Controls
* Description: Adds device visibility controls (Desktop/Tablet/Mobile) to all widgets
* Version: 1.0
* Author: newsbee
* Author URI: https://newsbee.blog/wp-tips/
* Snippet URI: https://newsbee.blog/wp-tips/snippets/widget-classes.txt
* License: GPLv2 or later
* Network: false
*
* This snippet adds device visibility controls to WordPress widgets,
* allowing you to control which devices each widget appears on.
*/
// Exit if accessed directly
if (!defined('ABSPATH')) {
exit;
}
// Add device visibility controls to widget form
function widget_device_controls($widget, $return, $instance) {
$visibility = isset($instance['device_visibility']) ? $instance['device_visibility'] : 'all';
?>
<div class="widget-visibility-control">
<p>
<label for="<?php echo $widget->get_field_id('device_visibility'); ?>">
<strong>Display on:</strong>
</label>
<select
class="widefat"
id="<?php echo $widget->get_field_id('device_visibility'); ?>"
name="<?php echo $widget->get_field_name('device_visibility'); ?>">
<option value="all" <?php selected($visibility, 'all'); ?>>All Devices</option>
<option value="desktop" <?php selected($visibility, 'desktop'); ?>>Desktop Only</option>
<option value="mobile" <?php selected($visibility, 'mobile'); ?>>Mobile Only</option>
<option value="tablet" <?php selected($visibility, 'tablet'); ?>>Tablet Only</option>
</select>
</p>
</div>
<?php
return $instance;
}
add_action('in_widget_form', 'widget_device_controls', 10, 3);
// Save widget visibility settings
function save_widget_visibility($instance, $new_instance) {
$instance['device_visibility'] = isset($new_instance['device_visibility']) ? $new_instance['device_visibility'] : 'all';
return $instance;
}
add_filter('widget_update_callback', 'save_widget_visibility', 10, 2);
// Filter widget display based on device
function filter_widget_visibility($instance, $widget) {
if (!isset($instance['device_visibility']) || $instance['device_visibility'] === 'all') {
return $instance;
}
// Get current device type
$ua = $_SERVER['HTTP_USER_AGENT'] ?? '';
$current_device = 'desktop';
if (preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i', $ua)) {
$current_device = 'mobile';
} elseif (preg_match('/android|ipad|playbook|silk/i', $ua)) {
$current_device = 'tablet';
}
// Hide widget if it doesn't match current device
if ($instance['device_visibility'] !== $current_device) {
return false;
}
return $instance;
}
add_filter('widget_display_callback', 'filter_widget_visibility', 10, 2);
// Add device-specific CSS classes to widgets
function add_device_visibility_classes($params) {
if (!isset($params[0]['widget_id'])) {
return $params;
}
// Get widget details
$widget_id = $params[0]['widget_id'];
$id_base = preg_replace('/-[0-9]+$/', '', $widget_id);
$widget_number = (int) str_replace($id_base . '-', '', $widget_id);
$widget_obj = get_option('widget_' . $id_base);
// Add device class if visibility is set
if (isset($widget_obj[$widget_number]['device_visibility'])) {
$params[0]['before_widget'] = preg_replace(
'/class="/',
'class="device-' . $widget_obj[$widget_number]['device_visibility'] . ' ',
$params[0]['before_widget'],
1
);
}
return $params;
}
add_filter('dynamic_sidebar_params', 'add_device_visibility_classes');
// Add CSS for device visibility
function add_device_visibility_styles() {
?>
<style>
/* Desktop */
@media (min-width: 1024px) {
.device-mobile,
.device-tablet {
display: none !important;
}
}
/* Tablet */
@media (min-width: 768px) and (max-width: 1023px) {
.device-desktop,
.device-mobile {
display: none !important;
}
}
/* Mobile */
@media (max-width: 767px) {
.device-desktop,
.device-tablet {
display: none !important;
}
}
</style>
<?php
}
add_action('wp_head', 'add_device_visibility_styles');
Копируем контент файла и переносим его в новый сниппет с помощью плагина Code Snippets.
По умолчанию стоит All Devices, т.е. все устройства, а потом можно выбрать то, что вам нужно.
Enjoy!
Рубрики блога
CSS (23) Фрагменты кодов (16) Плагины (8) Ненужные советы (5) Разное (5) Шорткоды (4) WP Info (3) Юмор (3) Виджеты (3)