Как поставить скрипт в очередь, если виджет отображается на странице?

8

Я создал виджет, который использует плагин jquery, и использовал is_active_widget, чтобы поставить скрипт в очередь, он работает нормально, но он также включает скрипт даже на страницах, где этот виджет не отображается. так есть ли способ поставить скрипт в очередь только если этот виджет показывает?

заранее спасибо.

пьер
источник

Ответы:

11

Вы должны иметь возможность звонить wp_enqueue_script()как часть вашего вывода виджета.

редактировать

Быстрый и грязный, используя пример класса API виджетов

<?php
class wpse48337_Widget extends WP_Widget {

    public function __construct() {
        // widget actual processes
    }

    public function form( $instance ) {
        // outputs the options form on admin
    }

    public function update( $new_instance, $old_instance ) {
        // processes widget options to be saved
    }

    public function widget( $args, $instance ) {
        // outputs the content of the widget
    }

}
register_widget( 'wpse48337_Widget' );
?>

Добавьте свой wp_enqueue_script()вызов в строке , в выводе вашего виджета - то есть в public function widget():

<?php    
    public function widget( $args, $instance ) {
        // outputs the content of the widget

    // Enqueue a script needed for
    // the Widget's output
    wp_enqueue_script( 'jquery-pluginname', $path, $deps );

    // Rest of widget output goes here...
    }
?>
Чип Беннетт
источник
На самом деле я делаю это и использую is_active_widget (), но он ставит скрипт в очередь на всех страницах, если виджет активен даже на одной из них.
Пьер
Используя is_active_widget()это не то же самое , как вызов wp_enqueue_script()из внутри вашего Widget выхода . Смотрите обновленный ответ.
Чип Беннетт
спасибо за обновление, но что вы подразумеваете под быстрым и грязным примером или таким образом за использование wp_enqueue_script ()? и еще один не по теме вопрос, пожалуйста, я вижу много этих частных и общедоступных перед функциями в виджетах, так что они делают? и должны ли мы использовать их виджеты, специфичные для тем? и большое спасибо :)
Pierre
Под « быстрым и грязным примером » я подразумеваю, что я ссылаюсь на стандартную конструкцию класса Widget, как описано в связанной статье Кодекса. Я предполагаю, что вы написали свой собственный виджет с помощью API виджетов. Если нет, вы должны быть; но, тем не менее, если вам нужно более конкретное руководство, нам нужно увидеть ваш код виджета.
Чип Беннетт
Это не работает Не уверен, что раньше работал, так как он был помечен как ответ. Но прямо сейчас форма виджета запускается после действия wp_enqueue_scripts
Омар Абид
6

Если скрипт должен идти в <head>разделе:

class Your_Widget extends WP_Widget{

  protected static $did_script = false;

  function __construct(){

    // parent::__construct() ...

    add_action('wp_enqueue_scripts', array($this, 'scripts'));

  }

  function scripts(){

    if(!self::$did_script && is_active_widget(false, false, $this->id_base, true)){
      wp_enqueue_script('your-script');
      self::$did_script = true;
    }           

  }


}

В противном случае решение Чипа Беннетта будет работать для постановки его в очередь в нижнем колонтитуле.

$did_scriptСтатическая переменная не требуется, я использовал его только , чтобы избежать в дальнейшем ненужных вызовов , wp_enqueue_scriptесли существует несколько экземпляров виджета на странице ...

onetrickpony
источник
1
Идея классная, но на самом деле это не решает вопрос ОП, поскольку is-active_widget()просто позволяет узнать, активирован ли виджет (т. Е. Перетащен ли он в одну из областей боковой панели в «Внешний вид»> «Виджеты»), в отличие от фактического появления на любой странице. ,
Том Оджер
Условие неверное: (1) is_active_widget будет возвращать sidebar_id, даже если эта боковая панель не отображается на текущей странице. Это добавит скрипт на каждую страницу. (2) wp_enqueue_script добавит скрипт только один раз, даже если вы вызовете его несколько раз. нет необходимости в self::$did_script (3), потому что __constructвызывается при каждом запросе страницы, даже если виджет даже не отображается
Филипп
2

Пьер,

То , как я справиться с этим с wp_enqueue_scriptи wp_dequeue_script, а также использовать переменную экземпляра $is_activeв классе Your_Widget

Так что сделайте на wp_enqueue_scriptоснове, is_active_widgetкоторый ставит скрипт в очередь на всех страницах, но с параметром нижнего колонтитула, установленным в true. Обратите внимание, что очередь запускается с приоритетом, чтобы убедиться, что она запускается до вывода сценариев.

function enqueue_scripts() {
  if ( is_active_widget( false, $this->id, $this->id_base, true ) ) {
    wp_enqueue_script( 'your-script-handle', 'your-script-url', array(), '1.0', true );
    add_action( 'wp_footer', array($this,'dequeue_redundant_scripts'), 1 );
  }

}

Затем в функции виджета укажите, активен ли виджет на этой странице.

function widget( $args, $instance ) {
    // outputs the content of the widget
    $this->is_active = true;  
}

Затем в нижнем колонтитуле удалите скрипт, если виджет не активен на этой странице

function dequeue_redundant_scripts() {
    if (! $this->is_active) {
        wp_dequeue_script('your-script-handle');
    }
}

Этот подход постановки очереди в очередь, а затем ее отмены, если не используется, также хорошо работает для плагинов, которые определяют шорткоды, требующие сценариев

Рассел Джеймисон
источник
0

Я рассмотрел хук 'wp_footer', потому что этот хук выполняется в нижнем колонтитуле и, вероятно, является лучшим способом добавить сценарии только там, где используется виджет.

class Your_Widget extends WP_Widget{

    function widget( $args, $instance ) {

         add_action('wp_footer',array($this,'front_end_scripts'));

    }

    function front_end_scripts(){
       ?><script type="text/javascript">
          console.log('this works!');
        /*
          Or if you need external scripts then you may use 
          $.getScript([your-script-url] );
        */
        </script> <?php
    }



}
Дипеш КЦ
источник
1
Тьфу. wp_enqueue_script()Пожалуйста. Нет прямой печати JS.
Том Оджер
Я боюсь, что wp_enqueue_script () не будет работать здесь, так как ловушка помимо wp_enqueue_script срабатывает задолго до того, как виджет на самом деле вызывается.
Дипеш К.С.
Вы можете вызвать wp_enqueue_script () в любое время до действия wp_footer. Виджет вызывается при построении страницы шаблона. Вы можете либо подключиться к dynamic_sidebarдействию, определяя, когда ваш виджет действительно отображается, либо, проще говоря, просто поместить свое enqueue_script()право в widget()метод, как рекомендует @ChipBennet.
Том Оджер