it-swarm.com.de

Bedingtes Einreihen des Skripts/Stylesheets eines Widgets in HEAD (nur wenn auf Seite vorhanden!)

Ich habe versucht, Skripte und Stile für ein WordPress-Widget unter den folgenden Bedingungen zu laden ...

  1. Die Skripte MÜSSEN in das HEAD geladen werden (sonst brechen sie).
  2. Die Skripte dürfen NUR geladen werden, wenn das Widget tatsächlich angezeigt wird (sie sind ziemlich schwer).

Ich habe viel gesucht, und dies scheint ein häufiges (ungelöstes) Problem zu sein ... aber ich hoffe, dass jemand hier eine Problemumgehung erfolgreich implementiert hat.

Dies ist das Beste, was ich bisher habe ...

Das folgende einfache Widget druckt Text in die Seitenleiste. Es lädt erfolgreich jQuery bedingt (wenn das Widget tatsächlich angezeigt wird) ... allerdings immer nur in der Fußzeile! (Hinweis: es funktioniert möglicherweise auch nur unter WordPress 3.3 , obwohl dieser Hack möglicherweise Abwärtskompatibilität bietet).

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

Sobald WordPress mit der Bearbeitung von Widgets beginnt, ist es anscheinend zu spät, um die Warteschlange zu öffnen (oder sogar die Registrierung von zuvor eingereihten Elementen aufzuheben).

Irgendwelche Ideen wäre sehr dankbar!

Kennzeichen.

12
Mark Jeldi

Wordpress als Nice-Funktion is_active_widget, den Sie in Ihrem __construct verwenden können, und testen Sie, ob das Widget auf der aktuellen Seite vorhanden ist, und fügen Sie Ihre Skripte/Stile basierend auf dem folgenden Beispiel hinzu:

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

Alternativ können Sie das Plug-In "Widget Logic" verwenden. Es verwendet bedingte Anweisungen für das Laden des Widgets.

Das ist ganz anders herum gedacht - aber das Ergebnis sollte wie erwartet sein.

wp_print_scripts & wp_print_styles sind möglicherweise die richtigen Hooks. Fügen Sie diesen Hooks einfach Aktionen mit der Priorität 100 hinzu, um die allerletzten in der Warteschlange zu sein. wp_enqueue_script (), wp_enqueue_style (), wp_deregister_script (), wp_deregister_style () ...

Ihren Problemen mit dem obigen Code fehlt möglicherweise der Prioritätsparameter (nicht getestet)? WP codex

0
Martin Zeitler