Bagaimana cara membuat skrip jika widget ditampilkan di halaman?

8

Saya membuat widget yang menggunakan plugin jquery, dan saya menggunakan is_active_widget untuk membuat skrip, berfungsi dengan baik tetapi juga termasuk skrip bahkan pada halaman yang tidak menampilkan widget ini. jadi apakah ada cara untuk hanya membuat skrip jika widget ini ditampilkan?

Terima kasih sebelumnya.

Pierre
sumber

Jawaban:

11

Anda harus dapat memanggil wp_enqueue_script()sebagai bagian dari output Widget Anda.

Edit

Cepat dan kotor, menggunakan contoh API kelas telanjang Widgets 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' );
?>

Tambahkan inlinewp_enqueue_script() panggilan Anda , dalam output Widget Anda - yaitu dalam :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...
    }
?>
Chip Bennett
sumber
Sebenarnya saya melakukan itu, dan menggunakan is_active_widget () tapi itu akan membuat skrip di semua halaman jika widget aktif bahkan pada satu.
Pierre
Penggunaannya is_active_widget()tidak sama dengan menelepon wp_enqueue_script()dari dalam keluaran Widget Anda . Lihat jawaban yang diperbarui.
Chip Bennett
terima kasih atas pembaruannya, tetapi apa yang Anda maksud dengan cepat dan kotor contoh atau cara ini untuk menggunakan wp_enqueue_script ()? dan satu lagi pertanyaan topik, tolong, saya melihat banyak fungsi pribadi dan publik ini sebelum di widget jadi apa yang mereka lakukan? dan haruskah kita menggunakannya widget khusus untuk tema? dan terima kasih banyak :)
Pierre
Dengan " contoh cepat dan kotor ", maksud saya bahwa saya mereferensikan konstruk kelas Widget standar, seperti dijelaskan dalam artikel Codex yang ditautkan. Saya berasumsi bahwa Anda telah menulis Widget khusus menggunakan API Widget. Jika tidak, Anda seharusnya ; namun demikian, jika Anda membutuhkan panduan yang lebih spesifik, kami perlu melihat kode Widget Anda.
Chip Bennett
Ini tidak berhasil. Tidak yakin apakah dulu berfungsi karena itu ditandai sebagai jawaban. Tetapi saat ini, bentuk widget dipicu setelah aksi wp_enqueue_scripts
Omar Abid
6

Jika skrip perlu masuk pada <head>bagian:

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

  }


}

Jika tidak, solusi Chip Bennett akan berfungsi untuk mengantri di footer.

The $did_scriptvariabel statis tidak diperlukan, saya menggunakannya hanya untuk menghindari panggilan lebih lanjut tidak perlu untuk wp_enqueue_scriptjika ada beberapa contoh widget pada halaman ...

onetrickpony
sumber
1
Gagasan keren, tetapi ini sebenarnya tidak menjawab pertanyaan OP, karena is-active_widget()cukup beri tahu Anda apakah widget telah diaktifkan (mis.: Diseret ke salah satu area bilah sisi di Appearance> Widgets), dan bukan benar-benar muncul di halaman tertentu .
Tom Auger
Kondisinya salah: (1) is_active_widget akan mengembalikan sidebar_id, bahkan jika sidebar itu tidak ditampilkan pada halaman saat ini. Ini akan menambahkan skrip pada setiap halaman. (2) wp_enqueue_script akan menambahkan skrip hanya sekali, bahkan jika Anda menyebutnya beberapa kali. tidak perlu untuk self::$did_script (3) karena __constructdipanggil pada setiap permintaan halaman, bahkan jika widget bahkan tidak ditampilkan
Philipp
2

Pierre,

Cara saya menangani ini adalah dengan wp_enqueue_scriptdan wp_dequeue_script, dan menggunakan variabel instan $is_activedi kelas Your_Widget

Jadi lakukan wp_enqueue_scriptberdasarkan is_active_widgetyang enqueues skrip di semua halaman tetapi dengan parameter footer disetel ke true. Perhatikan bahwa dequeue dijalankan pada prioritas untuk memastikan itu berjalan sebelum skrip di-output.

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

}

Kemudian pada fungsi widget tunjukkan apakah widget aktif di halaman itu

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

Kemudian di footer dequeue script jika widget tidak aktif di halaman itu

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

Pendekatan enqueue ini kemudian dequeueing jika tidak digunakan juga berfungsi dengan baik untuk plugin yang mendefinisikan shortcode yang membutuhkan skrip

Russell Jamieson
sumber
0

Saya menganggap kait 'wp_footer' karena kait ini dieksekusi di footer, dan mungkin merupakan cara terbaik untuk menambahkan skrip hanya di mana widget digunakan.

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
    }



}
Dipesh KC
sumber
1
Ugh. wp_enqueue_script()silahkan. Tidak ada pencetakan langsung JS.
Tom Auger
Saya khawatir wp_enqueue_script () tidak akan berfungsi di sini karena hook di samping wp_enqueue_script dipecat jauh sebelum widget benar-benar dipanggil.
Dipesh KC
Anda dapat memanggil wp_enqueue_script () kapan saja sebelum aksi wp_footer. Widget ini dipanggil selama pembuatan halaman templat. Anda dapat menghubungkan dynamic_sidebartindakan, mendeteksi kapan widget Anda benar-benar ditampilkan, atau, lebih sederhana, cukup masukkan enqueue_script()hak Anda ke dalam widget()metode, seperti yang direkomendasikan @ChipBennet.
Tom Auger