Làm thế nào để enqueue script nếu widget được hiển thị trên trang?


8

Tôi đã tạo một tiện ích sử dụng plugin jquery và tôi đã sử dụng is_active_widget để xử lý tập lệnh, nó hoạt động tốt nhưng nó cũng bao gồm tập lệnh ngay cả trên các trang không hiển thị tiện ích này. Vì vậy, có cách nào để chỉ enqueue script nếu widget này được hiển thị?

cảm ơn trước.

Câu trả lời:


11

Bạn sẽ có thể gọi wp_enqueue_script()như một phần của đầu ra Widget.

Biên tập

Nhanh chóng và bẩn thỉu, bằng cách sử dụng ví dụ về lớp Widgets API trần trụi :

<?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' );
?>

Thêm nội tuyếnwp_enqueue_script() cuộc gọi của bạn , trong đầu ra của Widget - tức là trong :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...
    }
?>

Trên thực tế tôi đang làm điều đó và sử dụng is_active_widget () nhưng nó sẽ ghi lại tập lệnh trên tất cả các trang nếu tiện ích đang hoạt động ngay cả trên một.
Pierre

Sử dụng is_active_widget()không giống như gọi wp_enqueue_script()từ trong đầu ra Widget của bạn . Xem câu trả lời cập nhật.
Chip Bennett

cảm ơn bạn đã cập nhật, nhưng bạn có ý gì khi nhanh chóng và làm bẩn ví dụ hoặc cách này để sử dụng wp_enqueue_script ()? và một câu hỏi ngoài chủ đề xin vui lòng, tôi đang thấy rất nhiều những điều riêng tư và công khai này trước các chức năng trong các widget vậy họ làm gì? và chúng ta có nên sử dụng chúng các widget cụ thể cho các chủ đề? và cảm ơn bạn rất nhiều :)
Pierre

Theo " ví dụ nhanh và bẩn ", ý tôi là tôi đang tham khảo cấu trúc lớp Widget tiêu chuẩn, như được mô tả trong bài viết Codex được liên kết. Tôi giả sử rằng bạn đã viết Widget tùy chỉnh bằng API Widgets. Nếu không, bạn nên ; nhưng dù sao, nếu bạn cần hướng dẫn cụ thể hơn, chúng tôi sẽ cần xem mã Widget của bạn.
Chip Bennett

Điều này không hoạt động. Không chắc chắn nếu nó được sử dụng để làm việc vì nó được đánh dấu là một câu trả lời. Nhưng ngay bây giờ, biểu mẫu widget được kích hoạt sau hành động wp_enqueue_scripts
Omar Abid

6

Nếu kịch bản cần phải đi trong <head>phần:

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;
    }           

  }


}

Mặt khác, giải pháp của Chip Bennett sẽ hoạt động để xếp hàng ở chân trang.

Biến $did_scripttĩnh không bắt buộc, tôi đã sử dụng nó chỉ để tránh các cuộc gọi không cần thiết tiếp theo wp_enqueue_scriptnếu có nhiều phiên bản widget trên trang ...


1
Ý tưởng tuyệt vời, nhưng điều này thực sự không giải quyết được câu hỏi của OP, vì is-active_widget()chỉ cho bạn biết liệu một tiện ích đã được kích hoạt hay chưa (nghĩa là: được kéo vào một trong các khu vực thanh bên trong Giao diện> Tiện ích), trái ngược với thực tế xuất hiện trên bất kỳ trang nào. .
Tom Auger

Điều kiện sai: (1) is_active_widget sẽ trả về sidebar_id, ngay cả khi thanh bên đó không được hiển thị trên trang hiện tại. Điều này sẽ thêm tập lệnh trên mỗi trang. (2) wp_enqueue_script sẽ thêm một tập lệnh chỉ một lần, ngay cả khi bạn gọi nó nhiều lần. không cần self::$did_script (3)__constructđược gọi trên mỗi yêu cầu trang, ngay cả khi tiện ích thậm chí không được hiển thị
Philipp

2

Pierre,

Cách tôi xử lý việc này là với wp_enqueue_scriptwp_dequeue_script, và sử dụng một biến thể hiện $is_activetrong lớp Your_Widget

Vì vậy, làm wp_enqueue_scriptdựa trên is_active_widgetđó bao gồm kịch bản lệnh trên tất cả các trang nhưng với tham số chân trang được đặt thành đúng. Lưu ý rằng dequeue được chạy ở mức ưu tiên để đảm bảo nó chạy trước khi các tập lệnh được xuất ra.

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 );
  }

}

Sau đó, trong chức năng widget cho biết nếu widget đang hoạt động trên trang đó

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

Sau đó, trong phần chân trang sẽ xử lý tập lệnh nếu tiện ích không hoạt động trên trang đó

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

Cách tiếp cận này của enqueue sau đó dequeueing nếu không được sử dụng cũng hoạt động tốt cho các plugin xác định mã ngắn yêu cầu tập lệnh


0

Tôi đã xem xét hook 'wp_footer' vì hook này được thực thi ở chân trang và có lẽ là cách tốt nhất để thêm tập lệnh chỉ khi sử dụng widget.

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()xin vui lòng. Không in trực tiếp của JS.
Tom Auger

Tôi sợ wp_enqueue_script () sẽ không hoạt động ở đây vì hook ngoài wp_enqueue_script được kích hoạt nhiều trước khi tiện ích thực sự được gọi.
Dipesh KC

Bạn có thể gọi wp_enqueue_script () bất cứ lúc nào trước khi hành động wp_footer. Các widget được gọi trong quá trình xây dựng trang mẫu. Bạn có thể nối vào dynamic_sidebarhành động, phát hiện khi tiện ích của bạn thực sự được hiển thị hoặc đơn giản hơn là chỉ cần đặt enqueue_script()quyền của bạn vào widget()phương thức, như @ChipBennet khuyến nghị.
Tom Auger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.