Próbowałem załadować skrypty i style dla widgetu WordPress z następującymi warunkami ...
- Skrypty MUSZĄ ładować się do HEAD (w przeciwnym razie się zepsują).
- Skrypty muszą się ładować TYLKO wtedy, gdy widżet faktycznie się wyświetla (są dość ciężkie).
Przeprowadziłem wiele poszukiwań i wydaje się, że jest to powszechny (nierozwiązany) problem ... ale mam nadzieję, że ktoś tutaj pomyślnie wdrożył obejście.
To najlepsze, jakie dotychczas miałem ...
Poniżej znajduje się prosty widget, który drukuje tekst na pasku bocznym. Z powodzeniem ładuje jQuery warunkowo (gdy widżet jest faktycznie wyświetlany) ... choć tylko w stopce! (Uwaga: może również działać tylko na WordPress 3.3 , chociaż ten hack może zapewnić zgodność wsteczną).
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");') );
Wydaje się, że gdy WordPress zacznie obsługiwać widżety, jest już za późno, aby umieścić je w kolejce (a nawet wyrejestrować coś zamaskowanego wcześniej).
Jakiekolwiek pomysły będą mile widziane!
Znak.
źródło
wp_head
jest wywoływany po wydrukowaniu skryptów głównych, więc załaduje je tylko w stopce, ale możesz je echo (zamiast umieszczać w kolejce), podobnie jak w przypadku arkusza stylów używanegoecho '<script src="path/to/script.js"></script>';
i, podobnie jak w przypadku arkusza stylów, nie jest możliwe, aby został załadowany to widżety nie są aktywnewp_enqueue_scripts
zamiastwp_head
w akcji. Umożliwi to wstawienie javascript do nagłówka lub stopki. http://codex.wordpress.org/Function_Reference/wp_enqueue_scriptAlternatywnie możesz wypróbować wtyczkę „Widget Logic” ... używa ona instrukcji warunkowych do ładowania widżetu.
To całkiem odwrotne myślenie - ale wynik powinien być zgodny z oczekiwaniami.
wp_print_scripts & wp_print_styles mogą być odpowiednimi hakami, po prostu dodaj akcje do tych haków z priorytetem 100 coś - aby być ostatnim w kolejce. wp_enqueue_script (), wp_enqueue_style (), wp_deregister_script (), wp_deregister_style () ...
W Twoich problemach z powyższym kodem może brakować parametru priorytetu (nie testowano)? Kodeks WP
źródło
Możesz po prostu użyć wp_enqueue_script lub wp_enqueue_style w metodzie widgetu (funkcji) w niestandardowej klasie Widget, a załaduje on skrypty tylko wtedy, gdy widget jest aktywny. Zobacz szczegóły i przykład tutaj: https://wpshed.com/wordpress/load-scripts-styles-widget-active/
źródło
function widget( $args, $instance ) { wp_enqueue_script( 'wpshed-front-end', plugin_dir_url( __FILE__ ) . 'wpshed-front-end.js', array( 'jquery' ), '1.0.0', false ); }
„Fałsz” na i oznacza ładowanie skryptu w nagłówku lub stopce. Aby podsumować ponownie, użyj wp_enqueue_script lub wp_enqueue_style w metodzie widget (funkcja) . W ten sposób robią to programiści z WordPress.com/org.