Accoda in modo condizionale lo script / foglio di stile di un widget in HEAD (solo quando presente nella pagina!)


13

Ho cercato di caricare script e stili per un widget WordPress con le seguenti condizioni ...

  1. Gli script DEVONO essere caricati in HEAD (altrimenti si rompono).
  2. Gli script devono essere caricati SOLO quando il widget viene effettivamente visualizzato (sono piuttosto pesanti).

Ho fatto molte ricerche, e questo sembra essere un problema comune (irrisolto) ... ma spero che qualcuno qui abbia implementato con successo una soluzione alternativa.

Questo è il migliore che ho finora ...

Di seguito è riportato un semplice widget che stampa il testo sulla barra laterale. Carica correttamente jQuery in modo condizionale (quando il widget viene effettivamente visualizzato) ... anche se sempre e solo nel piè di pagina! (Nota: può funzionare anche su WordPress 3.3 , anche se questo hack può fornire retrocompatibilità).

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

Sembra che quando WordPress inizia a gestire i widget, è troppo tardi per accodarsi (o addirittura annullare la registrazione di qualcosa accodato in precedenza).

Qualsiasi idea sarebbe molto apprezzata!

Marchio.

Risposte:


15

Wordpress come una bella funzione is_active_widgetche puoi usare nel tuo __costruct e prova se il widget è presente nella pagina corrente e aggiungi i tuoi script / stili basati su questo es:

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

Grazie per la tua risposta, Bainternet! Ho appena testato il tuo codice e sfortunatamente, mentre il javascript si carica in modo condizionale, si carica ancora nel piè di pagina ... anche se viene chiamato in wp_head. Molto strano! (a proposito, lo fa ancora senza la "vera" istruzione piè di pagina). Inoltre, l'eco del foglio di stile lo fa caricare indipendentemente dal fatto che il widget sia sulla pagina. Qualche idea?
Mark Jeldi,

wp_headviene chiamato dopo che gli script head sono già stati stampati, quindi li caricherà solo nel piè di pagina ma è possibile riecheggiarlo (invece di metterlo in coda) proprio come il foglio di stile usando echo '<script src="path/to/script.js"></script>';e come per il foglio di stile, non è possibile che sia caricato è che i widget non sono attivi
Bainternet

prova a utilizzare wp_enqueue_scriptsinvece che wp_headnella tua azione. Questo ti permetterà di inserire il javascript nella testa o nel piè di pagina. http://codex.wordpress.org/Function_Reference/wp_enqueue_script
Nick

Grazie Nick! Ho provato wp_enqueue_scripts, e mentre carica il javascript nella testa, non verrà caricato in modo condizionale.
Mark Jeldi,

0

In alternativa, puoi provare il plug-in "Widget Logic" ... utilizza istruzioni condizionali per il caricamento del widget.

Questo è abbastanza il contrario, ma il risultato dovrebbe essere come previsto.

wp_print_scripts & wp_print_styles potrebbero essere gli hook giusti, basta aggiungere azioni a questi hook con priorità 100 qualcosa - per essere l'ultimo in coda. wp_enqueue_script (), wp_enqueue_style (), wp_deregister_script (), wp_deregister_style () ...

I tuoi problemi con il codice sopra potrebbero non avere il parametro di priorità (non testato)? Codice WP


Grazie Syslogic! Ho provato anche Widget Logic, pensando di potermi agganciare al suo filtro widget_content. Sfortunatamente sfortunatamente. Utilizza ob_start per bufferizzare l'output del widget in modo da poterlo manipolare prima che venga stampato sullo schermo, ma ciò sta ancora accadendo troppo tardi per far sparire qualsiasi cosa nella testa. A meno che tu non conosca una soluzione alternativa?
Mark Jeldi,

Forse una combinazione della soluzione di Bainternet che sembra perfetta con la logica dei widget? In questo modo puoi definire quale widget caricare dove - e anche cosa deve essere caricato. Aggiungere le proprie istruzioni condizionali alle funzioni.php di un tema potrebbe aiutare a migliorare ulteriormente.
Martin Zeitler,

-1

Puoi semplicemente usare wp_enqueue_script o wp_enqueue_style nel metodo widget (funzione) nella tua classe Widget personalizzata e caricherà gli script solo se il widget è attivo. Vedi i dettagli e l'esempio qui: https://wpshed.com/wordpress/load-scripts-styles-widget-active/


Le risposte ai soli link sono semplicemente sbagliate poiché i link si rompono con il tempo. Dovresti almeno riassumere ciò che è nel link. In ogni caso, è sbagliato. L'OP ha bisogno degli script nell'intestazione della pagina.
Mark Kaplun l'

function widget( $args, $instance ) { wp_enqueue_script( 'wpshed-front-end', plugin_dir_url( __FILE__ ) . 'wpshed-front-end.js', array( 'jquery' ), '1.0.0', false ); }Il "falso" in e si riferisce al caricamento dello script nell'intestazione o nel piè di pagina. Per riassumere di nuovo, usa wp_enqueue_script o wp_enqueue_style nel metodo widget (funzione) . Ecco come lo fanno gli sviluppatori di WordPress.com/org.
iStefan,

Il commento avrebbe dovuto essere una modifica alla risposta;) ma quando il widget è "visualizzato" hai già fatto la parte principale della pagina e quindi non puoi accodare JS in esso.
Mark Kaplun,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.