WordPress 2.8 Widget-API:
Widgets objekt-orientiert entwickeln

Mit WordPress 2.8 wurde eine neue Widget-API eingeführt. Durch die neue Schnittstelle wurde die Widgetentwicklung objekt-orientiert und viel einfacher.

Bis einschließlich Version 2.7 war die Entwicklung von Widgets eingeschränkt oder kompliziert: Je nachdem ob nur eine Instanz des Widgets gebraucht wird oder ob es mehrmals aktiviert werden sollte. WordPress 2.8 räumt damit auf. Es gibt gar nicht mehr die Möglichkeit ein Widget nur einmal zu aktivieren.

Um ein Widget zu schreiben, muss eine Klasse mit vier vorgegebenen Methoden von WP_Widget abgeleitet werden.

class Mein_Neues_Widget extends WP_Widget {
  function Mein_Neues_Widget() {
  }

  function widget($args, $instance) {
  }

  function update($new_instance, $old_instance) {
  }

  function form($instance) {
  }
}

Jede Methode übernimmt eine Aufgabe. Der Konstruktor (in diesem Fall die Methode Mein_Neues_Widget muss den Konstruktor der Basisklasse WP_Widget aufrufen. Bei dem Aufruf müssen aber Parameter übergeben werden, die erst definiert werden müssen. Der komplette Konstruktor kann wie folgt aussehen:

function Mein_Neues_Widget() {
  $widget_ops = array(
    'classname' => 'Mein_Neues_Widget',
    'description' => 'Hier die Beschreibung für die Widgetseite im wp-admin eintragen'
  );
  $this->WP_Widget('Mein_Neues_Widget','Name des Widgets im wp-admin',$widget_ops);
}

Die Widget-Methode wird von WordPress aufgerufen, sobald das Widget im Blog angezeigt wird. Der Parameter $args ist das bereits von früher bekannte Array mit den Elementen before_widget, before_title, after_title und after_widget damit alle Widgets gleich aussehen und die Struktur vom Theme vorgegeben werden kann. Der zweite Parameter $instance enthält alle Einstellungen, die für diese Widget-Instanz im wp-admin durch den Administrator vorgegeben wurden.

Durch die beiden Methoden form und update kann für jede Instanz im wp-admin ein Konfigurationsfenster angezeigt werden und die Einstellungen gespeichert werden. In form wird das Formular ausgegeben und update sorgt für die Speicherung. Es gibt ein paar Funktionen in WordPress, die dafür sorgen, dass die Input-Felder korrekt den verschiedenen Widgets zugeordnet werden können. Ein Beispiel für ein Feld mit dem Namen title sieht wie folgt aus:

function update($new_instance, $old_instance) {
  $instance = $old_instance;
  $instance['title'] = strip_tags($new_instance['title']);
  return $instance;
}

function form($instance) {
  $instance = wp_parse_args($instance, array(
    'title'=>'Standardtitel'
  ));
  $title = strip_tags($instance['title']);
  echo '<p><label for="'.$this->get_field_id('title').'">Title:
    <input class="widefat" id="'.$this->get_field_id('title').'"
    name="'.$this->get_field_name('title').'" type="text"
    value="'.attribute_escape($title).'" />';
    </label></p>';
}

Die Update-Methode hat zwei Parameter. Im ersten Array sind die gerade vom Benutzer neueingegeben Werte und im zweiten Array die alten, bereits gespeicherten Werte. Die Methode muss ein Array zurückgeben, dadurch ist es möglich zu überprüfen, ob die neuen Werte überhaupt einen Sinn ergeben und die Speicherung ggf. zu unterbinden. Wenn überhaupt keine Prüfung stattfinden soll, kann auch einfach die $new_instance-Variable zurückgegeben werden.
In der form-Methode wird zuerst die Funktion wp_parse_args aufgerufen um Standardwerte, falls das Widget gerade zum ersten Mal hinzugefügt wurde, festzulegen. Die beiden Methoden der Basisklasse WP_Widget $this->get_field_id und $this->get_field_name geben eine ID und einen Namen für input-Felder zurück. Wenn diese Funktionen, vor allem die get_field_name, verwendet wird, wird sichergestellt, dass WordPress die Werte korrekt übernehmen kann.
Das Feld title übernimmt übrigens eine besondere Rolle. WordPress zeigt den eingegeben Wert im wp-admin auch im zugeklappten Zustand des Widgets an.

Die Klasse ist nun komplett definiert. Jetzt muss WordPress nur noch gesagt werden, dass diese Klasse auch initialisiert werden soll. Ein eleganter Weg dazu ist die Action widgets_init kombiniert mit einer anonymen Funktion:

add_action('widgets_init', create_function('', 'return register_widget("Mein_Neues_Widget");'));

Hinterlasse eine Antwort

Pflichtfelder sind mit * markiert.

*