Poner en cola el script / hoja de estilo de un widget en HEAD (solo cuando esté presente en la página)

12

He estado intentando cargar scripts y estilos para un widget de WordPress con las siguientes condiciones ...

  1. Los scripts DEBEN cargarse en la CABEZA (de lo contrario, se romperán).
  2. Las secuencias de comandos SOLO deben cargarse cuando el widget realmente se muestra (son bastante pesados).

He realizado muchas búsquedas y este parece ser un problema común (sin resolver) ... pero espero que alguien aquí haya implementado con éxito una solución.

Esto es lo mejor que tengo hasta ahora ...

El siguiente es un widget simple que imprime texto en la barra lateral. Se carga correctamente jQuery condicionalmente (cuando se muestra el widget) ... ¡aunque solo en el pie de página! (Nota: también puede funcionar en WordPress 3.3 , aunque este truco puede proporcionar compatibilidad con versiones anteriores).

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

Parece que una vez que WordPress comienza a manejar widgets, es demasiado tarde para poner en cola (o incluso para cancelar el registro de algo en cola).

¡Cualquier idea sería muy apreciada!

Mark.

    
pregunta Mark Jeldi 01.04.2012 - 21:06

3 respuestas

15

Wordpress como una función agradable is_active_widget que puedes usar en tu __construcción y prueba si el widget está presente en la página actual y agrega tus scripts / estilos basados en eso:

function __construct() {
    parent::__construct(__CLASS__, 'BasicWidget', array(
        'classname' => __CLASS__,
        'description' => "This is a basic widget template that outputs text to the sidebar"
    ));
     if ( is_active_widget(false, false, $this->id_base) )
        add_action( 'wp_head', array(&$this, 'add_styles_and_scripts') );
}

function add_styles_and_scripts(){
    //since its wp_head you need to echo out your style link:
    echo '<link rel="stylesheet" href="http://example.com/css/style.css" type="text/css" />';
    //as for javascript it can be included using wp_enqueue_script and set the footer parameter to true:
    wp_enqueue_script( 'widget_script','http://example.com/js/script.js',array(),'',true );
}
    
respondido por el Bainternet 01.04.2012 - 21:57
0

Alternativamente, puedes probar el complemento "Widget Logic" ... utiliza instrucciones condicionales para la carga del widget.

Eso es bastante al revés, pero el resultado debería ser el esperado.

wp_print_scripts & wp_print_styles podrían ser los ganchos adecuados, simplemente agregue acciones a estos enlaces con prioridad 100 algo - para ser el último en la cola. wp_enqueue_script (), wp_enqueue_style (), wp_deregister_script (), wp_deregister_style () ...

¿Sus problemas con el código anterior pueden carecer del parámetro de prioridad (no probado)? Códice WP

    
respondido por el Martin Zeitler 04.04.2012 - 03:47
-1

Simplemente puede usar wp_enqueue_script o wp_enqueue_style en el método del widget (función) en su clase de Widget personalizado y cargará los scripts solo si el widget está activo. Vea los detalles y el ejemplo aquí: enlace

    
respondido por el iStefan 10.04.2016 - 23:00

Lea otras preguntas en las etiquetas