He estado tratando de cargar scripts y estilos para un widget de WordPress con las siguientes condiciones ...
- Las secuencias de comandos DEBEN cargarse en la CABEZA (de lo contrario se rompen).
- Las secuencias de comandos SOLO deben cargarse cuando el widget realmente se muestra (son bastante pesadas).
He realizado muchas búsquedas, y este parece ser un problema común (no resuelto) ... pero espero que alguien aquí haya implementado con éxito una solución alternativa.
Esto es lo mejor que tengo hasta ahora ...
El siguiente es un widget simple que imprime texto en la barra lateral. Carga con éxito jQuery condicionalmente (cuando el widget se muestra realmente) ... ¡aunque solo en el pie de página! (Nota: también puede funcionar solo 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 cancelar el registro de algo en cola antes).
¡Cualquier idea sería muy apreciada!
Marca.
fuente
wp_head
se llama después de que los scripts del encabezado ya están impresos, por lo que solo los cargará en el pie de página, pero puede reproducirlo (en lugar de ponerlo en cola) al igual que la hoja de estilo que usaecho '<script src="path/to/script.js"></script>';
y, en cuanto a la hoja de estilo, no es posible que esté cargada es que los widgets no están activoswp_enqueue_scripts
lugar dewp_head
en su acción. Esto le permitirá poner el javascript en el encabezado o en el pie de página. http://codex.wordpress.org/Function_Reference/wp_enqueue_scriptAlternativamente, puede probar el complemento "Widget Logic" ... usa declaraciones 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 pueden ser los ganchos adecuados, solo agregue acciones a estos ganchos con prioridad 100 algo, para ser el último en la cola. wp_enqueue_script (), wp_enqueue_style (), wp_deregister_script (), wp_deregister_style () ...
¿Es posible que sus problemas con el código anterior no tengan el parámetro de prioridad (no probado)? WP codex
fuente
Simplemente puede usar wp_enqueue_script o wp_enqueue_style en el método de widget (función) en su clase Widget personalizada y cargará los scripts solo si el widget está activo. Ver detalles y ejemplo aquí: https://wpshed.com/wordpress/load-scripts-styles-widget-active/
fuente
function widget( $args, $instance ) { wp_enqueue_script( 'wpshed-front-end', plugin_dir_url( __FILE__ ) . 'wpshed-front-end.js', array( 'jquery' ), '1.0.0', false ); }
El "falso" en el y se refiere a cargar el script en el encabezado o pie de página. Para resumir nuevamente, use wp_enqueue_script o wp_enqueue_style en el método del widget (función) . Así es como los desarrolladores de WordPress.com/org lo están haciendo.