Условно поставьте в очередь скрипт / таблицу стилей виджета в HEAD (только если присутствует на странице!)

13

Я пытался загрузить скрипты и стили для виджета WordPress со следующими условиями ...

  1. Скрипты ДОЛЖНЫ загружаться в ГОЛОВУ (иначе они ломаются).
  2. Скрипты должны загружаться ТОЛЬКО, когда виджет действительно отображается (они довольно тяжелые).

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

Это лучшее, что у меня есть ...

Ниже приведен простой виджет, который печатает текст на боковой панели. Он успешно загружает jQuery условно (когда виджет фактически отображается) ... хотя только в нижнем колонтитуле! (Примечание: он также может работать только на WordPress 3.3 , хотя этот хак может обеспечить обратную совместимость).

class BasicWidget extends WP_Widget
{

    function __construct() {
        parent::__construct(__CLASS__, 'BasicWidget', array(
            'classname' => __CLASS__,
            'description' => "This is a basic widget template that outputs text to the sidebar"
        ));
    }

  function form($instance) {
    $instance = wp_parse_args( (array) $instance, array( 'title' => '' ) );
    $title = $instance['title'];
?>
  <p><label for="<?php echo $this->get_field_id('title'); ?>">Title: <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /></label></p>
<?php
  }

  function update($new_instance, $old_instance) {
    $instance = $old_instance;
    $instance['title'] = $new_instance['title'];
    return $instance;
  }

  function widget($args, $instance) {

    extract($args, EXTR_SKIP);

    echo $before_widget;
    $title = empty($instance['title']) ? ' ' : apply_filters('widget_title', $instance['title']);

    if (!empty($title))
      echo $before_title . $title . $after_title;;

    echo "<h1>This is a basic widget!</h1>";

    echo $after_widget;

        // if we're echoing out content, enqueue jquery.

        if (!empty($after_widget)) {
            wp_enqueue_script('jquery');
        }
    }
}
add_action( 'widgets_init', create_function('', 'return register_widget("BasicWidget");') );

Кажется, что как только WordPress начинает обрабатывать виджеты, слишком поздно ставить в очередь (или даже отменять регистрацию чего-либо, помещенного в очередь ранее).

Любые идеи будут высоко ценится!

Отметка.

Марк Джелди
источник

Ответы:

15

Wordpress как хорошая функция, is_active_widgetкоторую вы можете использовать в своей __construct и проверить, присутствует ли виджет на текущей странице, и добавить свои сценарии / стили на основе этого примера:

function __construct() {
    parent::__construct(__CLASS__, 'BasicWidget', array(
        'classname' => __CLASS__,
        'description' => "This is a basic widget template that outputs text to the sidebar"
    ));
     if ( is_active_widget(false, false, $this->id_base) )
        add_action( 'wp_head', array(&$this, 'add_styles_and_scripts') );
}

function add_styles_and_scripts(){
    //since its wp_head you need to echo out your style link:
    echo '<link rel="stylesheet" href="http://example.com/css/style.css" type="text/css" />';
    //as for javascript it can be included using wp_enqueue_script and set the footer parameter to true:
    wp_enqueue_script( 'widget_script','http://example.com/js/script.js',array(),'',true );
}
Bainternet
источник
Спасибо за ваш ответ, Bainternet! Я только что тестировал ваш код и, к сожалению, хотя javascript действительно загружается условно, он все равно загружается в нижний колонтитул ... даже если он вызывается в wp_head. Очень странный! (кстати, он все еще делает это без «истинной» инструкции нижнего колонтитула). Кроме того, отображение таблицы стилей заставляет его загружаться независимо от того, находится ли виджет на странице. Есть идеи?
Марк Джелди
wp_headвызывается после того, как сценарии заголовка уже распечатаны, поэтому он будет загружать их только в нижний колонтитул, но вы можете вывести его (вместо постановки в очередь) так же, как при использовании таблицы стилей, echo '<script src="path/to/script.js"></script>';а также для таблицы стилей, невозможно, чтобы она загружалась виджеты не активны
Bainternet
попробуйте использовать wp_enqueue_scriptsвместо wp_headсвоих действий. Это позволит вам поместить javascript в верхний или нижний колонтитул. http://codex.wordpress.org/Function_Reference/wp_enqueue_script
Ник
Спасибо, Ник! Я попробовал wp_enqueue_scripts, и хотя он загружает javascript в голову, он не загружается условно.
Марк Джелди
0

В качестве альтернативы вы можете попробовать плагин "Widget Logic" ... он использует условные операторы для загрузки виджета.

Это все наоборот, но результат должен быть таким, как ожидалось.

wp_print_scripts & wp_print_styles могут быть правильными хуками, просто добавьте действия к этим хукам с приоритетом 100, чтобы быть последними в очереди. wp_enqueue_script (), wp_enqueue_style (), wp_deregister_script (), wp_deregister_style () ...

В ваших проблемах с кодом выше может отсутствовать параметр приоритета (не тестировался)? WP кодекс

Мартин Цайтлер
источник
Спасибо Syslogic! Я тоже попробовал Widget Logic, думая, что могу подключиться к его фильтру widget_content. Не повезло, к сожалению. Он использует ob_start для буферизации вывода виджета, так что вы можете манипулировать им до того, как он будет напечатан на экране, но это все еще происходит слишком поздно, чтобы что-то выстрелить в голове. Если, может быть, вы знаете об обходном пути?
Марк Джелди
Может быть, сочетание решения Bainternet, которое кажется вполне подходящим для логики виджетов? Таким образом, вы можете определить, какой виджет куда загружать, а также что должно быть загружено. Добавление собственных условных операторов в файл functions.php темы может помочь в дальнейшем улучшении.
Мартин Цайтлер,
-1

Вы можете просто использовать wp_enqueue_script или wp_enqueue_style в методе (функции) виджета в вашем пользовательском классе виджетов, и он будет загружать сценарии, только если виджет активен. Подробности и пример смотрите здесь: https://wpshed.com/wordpress/load-scripts-styles-widget-active/

iStefan
источник
Ответы только на ссылки плохие, так как ссылки порвутся со временем. Вы должны хотя бы обобщить то, что в ссылке. В любом случае, это просто неправильно. Так как ОП нужны скрипты в заголовке страницы.
Марк Каплун
function widget( $args, $instance ) { wp_enqueue_script( 'wpshed-front-end', plugin_dir_url( __FILE__ ) . 'wpshed-front-end.js', array( 'jquery' ), '1.0.0', false ); }«False» в и означает загрузку скрипта в верхнем или нижнем колонтитуле. Чтобы снова подвести итог, используйте wp_enqueue_script или wp_enqueue_style в методе виджета (функция) . Так делают разработчики из WordPress.com/org.
iStefan
Комментарий должен был быть правкой для ответа;) но когда виджет "отображается", вы уже сделали заголовок страницы и поэтому не можете поставить его в очередь.
Марк Каплун