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


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если существует несколько экземпляров виджета на странице ...


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.
— Том Оджер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.