Как использовать стиль wp dequeue() для стиля, поставленного в очередь в классе виджетов WP


У меня есть плагин, который создает виджет, который ставит в очередь некоторые интерфейсные CSS для оформления виджета. Я звоню wp_enqueue_style из public widget() метод в расширенном классе WP_Widget:

<?php class FPW_Widget extends WP_Widget {

    // ...

    public function widget( $args, $instance ) {

        // enqueuing here ensure that styles only load when plugin is being displayed
        wp_enqueue_style( 'fpw_styles_css', plugins_url( 'css/fpw_styles.css', dirname(__FILE__)), false, FPW_VERSION );

Чего бы я хотел, так это иметь возможность удалять из очереди, сохраняя при этом удивительный условный характер постановки в очередь (т.Е. Файл CSS загружается только при наличии активного виджета).

Я пробовал wp_dequeue_style() как на wp_enqueue_scripts с высоким приоритетом (999), так и на widgets_init, но без каких-либо удачи.

Возможно ли это, и если да, то как я могу это сделать?

Author: fuxia, 2015-03-29

1 answers

widget() метод вызывается при отображении виджета, поэтому стиль, который вы ставите в очередь, печатается в нижнем колонтитуле (верхний колонтитул уже напечатан в это время).

Даже если большинство браузеров могут отображать стили, связанные с телом страницы, это недопустимый HTML, потому что, в соответствии со стандартами HTML, в отличие от скриптов, стили должны быть размещены на странице <head>. (Попробуйте проверить свою разметку , и вы увидите ошибки).

Это также причина, по которой 'widgets_init' и 'wp_enqueue_scripts' нельзя использовать для удаления стиль: эти крючки срабатывают до вызова метода widget(), и вы не можете удалить стиль, который еще не добавлен.

Существует 2 решения.

Решение 1

Первое решение предполагает, что вы хотите сохранить свой подход, даже если он не соответствует стандартам HTML: как только стиль напечатан в нижнем колонтитуле, пользователи могут использовать 'wp_footer' крюк для удаления стиля из очереди.

Предполагая, что стиль добавлен следующим образом:

public function widget( $args, $instance ) {
    wp_enqueue_style('fpw_styles_css');
}

Может быть удален с помощью:

add_action('wp_footer', function() {
   wp_dequeue_style('fpw_styles_css');
});

Решение 2

Если вы хотите, чтобы ваш плагин не печатал недопустимый HTML, решение состоит в том, чтобы использовать is_active_widget() чтобы проверить, активен ли виджет, и поставить в очередь стиль, если это так:

add_action( 'wp_enqueue_scripts', function() {
  if ( is_active_widget(false, false, $widgetid) ) {
      wp_enqueue_style('fpw_styles_css');
  }
}, 5); // used priority 5 to make possible dequeue using default 10 priority

При этом стиль будет добавлен внутри <head>, и пользователи смогут удалить стиль из очереди, используя стандартный подход: wp_dequeue_style() подключенный к 'wp_enqueue_scripts'.

Единственная проблема заключается в том, что is_active_widget() не проверяет, действительно ли виджет напечатан на странице, но только в том случае, если какой-либо экземпляр виджета настроен в бэкэнде, в любом боковая панель. Это означает, что возможно, что стиль будет добавлен, даже если виджет фактически не напечатан на странице.

Однако пользователи могут легко удалить стиль для определенных страниц, потому что условные теги отлично работают при запуске 'wp_enqueue_scripts'. Пример:

add_action( 'wp_enqueue_scripts', function() {
  if (! is_front_page()) { // allow widget style only in front page
      wp_dequeue_style('fpw_styles_css');
  }
});
 6
Author: gmazzap, 2015-03-30 15:17:59