Ich möchte meinen beiden Seitenleisten, die ich habe, programmgesteuert Widgets hinzufügen. Ich konnte keinen offiziellen Weg finden, es zu tun?
Ich fing an, in der Datenbank zu suchen. Ich habe festgestellt, dass es die Option "sidebars_widgets" ist, mit der Widgets in die Seitenleisten eingefügt werden. Wenn Sie sich die Optionen ansehen, wird dem Widget-Namen eine Nummer wie folgt hinzugefügt: widget_name-6. Woher kommt diese Nummer?
Irgendeine Idee, wie man das behebt?
Antworten:
Als ich mit dieser Antwort anfing, sollte es nur eine kleine Notiz sein. Nun, ich habe versagt. Es tut uns leid! Bleib bei mir, es gibt eine gute Sache, die tief in mir verborgen ist ...
Wie werden WordPress-Widgets gespeichert?
Die Liste der Widgets wird in einer Option mit dem Namen gespeichert
'sidebars_widgets'
. Avar_export()
kann so etwas wie das Folgende geben:Ignorieren
'wp_inactive_widgets'
und'array_version'
. Wir müssen uns nicht darum kümmern.Die anderen Schlüssel sind Bezeichner für registrierte Seitenleisten. In diesem Fall wurden die Seitenleisten möglicherweise mit diesem Code registriert:
Standardmäßig sind die Seitenleisten nach der Registrierung leer. Na sicher.
Für jede registrierte Widgetklasse wird eine separate Option erstellt, die alle erforderlichen Optionen enthält. Der Option wird die Zeichenfolge vorangestellt
widget_
. Um die Optionen für alle aktiven RSS-Widgets zu erhalten, müssen wir uns Folgendes ansehen:Mögliche Ausgabe:
Beachten Sie die Nummer 2 . Die Argumente für mehrere Instanzen werden in dieser einen Option nach Zahlen sortiert gespeichert.
Um zu sehen, welche Widget-Klassen WordPress bereits bekannt sind, gehen Sie zu
wp-admin/options.php
und scrollen Sie nach unten, bis Sie so etwas sehen:Ja, serialisierte Daten. Nein, die kannst du hier nicht lesen. Mach dir keine Sorgen, du musst nicht.
Ein Demo-Widget
Um das Innenleben besser zu veranschaulichen, habe ich ein sehr einfaches Demo-Widget geschrieben:
Beachten Sie den Konstruktor:
't5_demo_widget'
ist die$id_base
, die Kennung für dieses Widget. Wie Sie im Screenshot sehen können, werden die Argumente in der Option gespeichertwidget_t5_demo_widget
. Alle Ihre benutzerdefinierten Widgets werden so behandelt. Sie müssen den Namen nicht erraten. Und da Sie Ihre Widgets (wahrscheinlich) geschrieben haben, kennen Sie alle Argumente aus den$instance
Parametern Ihrer Klasse .Themengrundlagen
Zuerst müssen Sie einige Seitenleisten und das benutzerdefinierte Widget registrieren. Die richtige Maßnahme dafür ist leicht zu merken:
'widgets_init'
. Legen Sie alles in einen Container - eine Klasse oder eine Funktion. Der Einfachheit halber verwende ich eine Funktion namenst5_default_widget_demo()
.Der gesamte folgende Code geht in das
functions.php
. Die KlasseT5_Demo_Widget
sollte bereits geladen sein. Ich habe es einfach in die gleiche Datei gelegt ...So weit, so einfach. Unser Theme ist nun Widget-fähig, das Demo-Widget ist bekannt. Nun der Spaß.
Sie möchten die Benutzereinstellungen wirklich nicht zerstören. Wenn sich bereits Inhalte in den Seitenleisten befinden, sollte Ihr Code nicht darüber laufen. Deshalb hören wir in diesem Fall auf.
Okay, angenommen die Seitenleisten sind leer ... wir brauchen einen Zähler:
Widgets sind nummeriert . Diese Zahlen sind zweite Kennungen für WordPress.
Lassen Sie uns das Array ändern:
Wir brauchen auch einen Zähler (dazu später mehr):
Und hier ist, wie wir den Zähler, die Namen der Seitenleiste und die Widget-Argumente verwenden (nun, wir haben nur ein Argument:)
text
.Beachten Sie, wie die Widget-ID erstellt wird: das
id_base
, ein Minus-
und der Zähler. Der Inhalt des Widgets wird in einer anderen Variablen gespeichert$demo_widget_content
. Hier ist der Zähler, in dem der Schlüssel und die Widget-Argumente in einem Array gespeichert sind.Wir erhöhen den Zähler um eins, wenn wir fertig sind, um Kollisionen zu vermeiden.
Das war einfach. Jetzt ein RSS-Widget. Mehr Felder, mehr Spaß!
Folgendes ist neu:
update_option()
Dadurch wird das RSS-Widget-Argument in einer separaten Option gespeichert. WordPress findet diese später automatisch.Wir haben die Argumente für das Demo-Widget nicht gespeichert, weil wir unserer zweiten Seitenleiste jetzt eine zweite Instanz hinzufügen ...
… Und speichern Sie alle Argumente für die
t5_demo_widget
in einem Ansturm. Dieselbe Option muss nicht zweimal aktualisiert werden.Nun, genug Widgets für heute, speichern wir auch die
sidebars_widgets
:Jetzt weiß WordPress, dass es einige registrierte Widgets gibt und wo die Argumente für jedes Widget gespeichert sind. A
var_export()
auf den sidebar_widgets sieht so aus:Der komplette Code nochmal:
Wenn Sie
wp-admin/widgets.php
jetzt gehen, sehen Sie drei voreingestellte Widgets:Und das ist es. Verwenden …
… Um die Widgets auszudrucken.
Es gibt eine kleine Panne: Sie müssen das Frontend für die Erstregistrierung zweimal laden. Wenn hier jemand helfen kann, bin ich sehr dankbar.
quelle
widget_t5_demo_widget
sich hier aufupdate_option( 'widget_t5_demo_widget', $demo_widget_content );
:?Vielen Dank, dass Sie Ihre Lösung geteilt haben. Ich habe das, was in dieser Frage beschrieben wurde, verwendet, um einen Code zu erstellen, mit dem Seitenleisten sehr einfach initialisiert werden können. Es ist sehr flexibel, Sie können so viele Widgets erstellen, wie Sie möchten, ohne den Code ändern zu müssen. Verwenden Sie einfach die Filter-Hooks und übergeben Sie Argumente in einem Array. Hier ist der kommentierte Code:
Dies ist eine Hilfsfunktion, die prüft, ob die Seitenleiste bereits Inhalt enthält:
Jetzt müssen wir eine Funktion erstellen, die mit der Aktion 'sidebar_init' verknüpft ist.
Und jetzt die Widget-Initialisierung:
Die letzte Aktion besteht darin, die Widgets in jeder Seitenleiste zu erstellen:
Diese Funktion wird verwendet, um zu verfolgen, wie viele Instanzen eines bestimmten Widgets bereits definiert wurden:
Das Letzte, was wir tun müssen, ist, Werte zuzuweisen. Nutzen Sie diese Filterfunktionen:
Und:
Im Idealfall würden Sie initialize_sidebars in einer Setup-Funktion aufrufen, die beim Aktivieren des Plugins oder des Themas wie folgt aufgerufen wird:
Plugin Aktivierung:
Um die Verwendung dieses Konglomerats von Funktionen zusammenzufassen:
Erstellen Sie eine Funktion, die die Seitenleisten initialisiert, die mit dem Filter 'alter_initialization_sidebars' verknüpft sind.
Erstellen Sie für jede soeben hinzugefügte Seitenleiste eine Funktion, die mit dem Filter "alter_initialization_widgets_ $ sidebarname" verknüpft ist. Ersetzen Sie $ sidebarname durch den Namen jeder Seitenleiste, die Sie in Schritt 1 erstellt haben.
Sie können diesen unkommentierten Code auch einfach in Ihre Funktionsdatei kopieren und sofort mit der Erstellung Ihrer Filterfunktionen beginnen: Code auf Pastie (ohne Initialisierungsfilterfunktionen)
quelle
Zunächst einmal vielen Dank an @toscho für die ausführliche Antwort.
Dies ist ein einfaches Beispiel für diejenigen, die nach einer einfachen Lösung und Standard-Widget-Optionen suchen:
Hinweis 1: Sie können
sidebar-id
zum Widgets-Menü wechseln und die gewünschte Seitenleiste anzeigen. Das erste<div id="widgets-holder-wrap">
‚s<div>
Kind hat dassidebar-id
.Hinweis 2: Sie können das
widget_name
Menü "Gehe zu Widgets" aufrufen und das gewünschte Widget überprüfen. Du wirst so etwas sehen<div id="widget-6_widget_name-__i__" class="widget ui-draggable">
.Ich wünschte, es hilft.
quelle
Das ist wie man es macht:
(ACHTUNG, dies könnte alle vorherigen Widgets ENTFERNEN, wenn Sie die ursprünglichen Widgets nicht wieder in das
widgets
Array eingefügt haben .)Die -Nummer kann verwendet werden, wenn Sie dem Widget später Optionen wie folgt hinzufügen möchten:
quelle
$widgets = get_option( 'sidebars_widgets' );