Saya telah mencoba memuat skrip dan gaya untuk widget WordPress dengan ketentuan berikut ...
- Script HARUS dimuat di KEPALA (kalau tidak mereka rusak).
- Skrip harus HANYA memuat ketika widget benar-benar ditampilkan (cukup berat).
Saya telah melakukan banyak pencarian, dan ini tampaknya menjadi masalah yang umum (belum terpecahkan) ... tapi saya berharap seseorang di sini telah berhasil mengimplementasikan solusi.
Ini yang terbaik yang saya dapatkan sejauh ini ...
Berikut ini adalah widget sederhana yang mencetak teks ke sidebar. Berhasil memuat jQuery secara kondisional (saat widget benar-benar ditampilkan) ... meskipun hanya ada di catatan kaki! (Catatan: mungkin juga hanya berfungsi di WordPress 3.3 , meskipun peretasan ini mungkin memberikan kompatibilitas ke belakang).
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");') );
Tampaknya begitu WordPress mulai menangani widget, sudah terlambat untuk melakukan enqueue (atau bahkan membatalkan pendaftaran sesuatu yang sudah enqueued sebelumnya).
Setiap ide akan sangat dihargai!
Menandai.
sumber
wp_head
dipanggil setelah skrip kepala sudah dicetak sehingga hanya akan memuatnya di footer tetapi Anda dapat mengulanginya (bukan en-antri) seperti halnya menggunakan stylesheetecho '<script src="path/to/script.js"></script>';
dan untuk stylesheet, tidak mungkin memuatnya. apakahwp_enqueue_scripts
alih-alihwp_head
dalam tindakan Anda. Ini akan memungkinkan Anda untuk meletakkan javascript di kepala atau bagian bawah. http://codex.wordpress.org/Function_Reference/wp_enqueue_scriptAtau Anda bisa mencoba plug-in "Widget Logic" ... menggunakan pernyataan kondisional untuk memuat widget.
Itu cukup memikirkan sebaliknya - tetapi hasilnya harus seperti yang diharapkan.
wp_print_scripts & wp_print_styles mungkin kait yang tepat, tambahkan saja tindakan ke kait ini dengan prioritas 100 sesuatu - untuk menjadi yang terakhir dalam antrian. wp_enqueue_script (), wp_enqueue_style (), wp_deregister_script (), wp_deregister_style () ...
Masalah Anda dengan kode di atas mungkin kurang parameter prioritas (tidak diuji)? WP codex
sumber
Anda cukup menggunakan wp_enqueue_script atau wp_enqueue_style dalam metode widget (fungsi) di kelas Widget kustom Anda dan itu akan memuat skrip hanya jika widget aktif. Lihat detail dan contoh di sini: https://wpshed.com/wordpress/load-scripts-styles-widget-active/
sumber
function widget( $args, $instance ) { wp_enqueue_script( 'wpshed-front-end', plugin_dir_url( __FILE__ ) . 'wpshed-front-end.js', array( 'jquery' ), '1.0.0', false ); }
The "false" di dan merujuk ke memuat skrip di header atau footer. Untuk meringkas lagi, gunakan wp_enqueue_script atau wp_enqueue_style dalam metode widget (fungsi) . Inilah yang dilakukan pengembang dari WordPress.com/org.