Bisher haben wir die Ausgabe des Blocks in Javascript gerendert. Bei dynamischen Inhalten wie aktuellen Beiträgen oder dem Anzeigen eines Beitrags müssen wir jedoch die Ausgabe des Blocks in PHP rendern. In diesem Beitrag erfahren wir, wie und warum.
Warum müssen wir mit dynamischen Blöcken anders umgehen?
Einige Beispiele sind offensichtlich; Ein Block, der die neuesten Beiträge in einer Kategorie anzeigt, ist dynamisch, da sich die Beiträge im Laufe der Zeit ändern. Sie wählen die Posts im Block nicht aus; Stattdessen haben Sie wahrscheinlich Einstellungen zur Auswahl der Kategorie, welche Informationen für die einzelnen Beiträge angezeigt werden sollen, die Anzahl der Beiträge, die Anzahl der Spalten und so weiter. Jedes Mal, wenn WordPress einen Beitrag mit diesem Block lädt, muss es WordPress zu diesem Zeitpunkt nach den neuesten Beiträgen abfragen. Das Anzeigen desselben Beitrags im darauffolgenden Monat kann zu anderen Ergebnissen führen, obwohl der Beitrag mit dem Block selbst nicht aktualisiert wurde.
Aber die Notwendigkeit dynamischer Blöcke ist manchmal nicht so offensichtlich. Sie können sich vorstellen, dass ein Featured-Post-Block, in dem Sie einen bestimmten Post auswählen, um ihn anzuzeigen, nicht unbedingt dynamisch ist. Aber es könnte sein – und sollte es sein. Denken Sie daran, dass der Titel, der Auszug oder das Beitragsbild des ausgewählten Beitrags jederzeit aktualisiert werden kann – und dies sollte sich in den Blöcken widerspiegeln, die diesen Beitrag enthalten.
Um einen nicht dynamischen Block zum Anzeigen eines einzelnen Beitrags zu erstellen, müssen Sie die Beitrags-ID, ihre URL, die URL des vorgestellten Bilds, die Auszugszeichenfolge oder was auch immer Sie für die Vorschau des Beitrags benötigen, in den Attributen des Blocks speichern. Und hier liegt das Problem. Wenn Sie das hervorgehobene Bild des ausgewählten Beitrags aktualisieren, werden die Attribute des Beitrags mit dem hervorgehobenen Beitragsblock nicht automatisch aktualisiert. Es bleibt mit der URL des alten vorgestellten Bildes gespeichert. Nur wenn Sie den Beitrag mit dem Block bearbeiten und sicherstellen, dass die Attribute mit den aktualisierten Informationen erneut gespeichert werden, zeigt der Block die korrekten aktualisierten Informationen an.
Wann immer wir also mit dynamischen Inhalten zu tun haben – Beiträge, Kategorien oder alles, was sich im Laufe der Zeit ändern könnte – haben wir es mit dynamischen Blöcken zu tun. Und für dynamische Blöcke müssen wir PHP – serverseitigen Code – verwenden, um unseren Block zu rendern, um sicherzustellen, dass er bei jedem Rendern aktualisierte Informationen abruft.
Die geänderte Natur dynamischer Blöcke im Editor
Wenn Sie mit der Entwicklung dynamischer Blöcke beginnen, ändert sich die Art Ihres Blocks innerhalb des Editors. Die Funktion Ihres Blocks edit
muss oft auch dynamisch sein. Beispielsweise müssen Sie für einen hervorgehobenen Beitragsblock Beiträge abrufen, aus denen Sie auswählen können, oder für einen neuesten Nachrichtenblock müssen Sie eine Liste mit Kategorien abrufen, aus denen der Benutzer auswählen kann.
Es ist vollständig möglich, Informationen von WordPress aus dem Editor heraus anzufordern, indem AJAX-Anforderungen gestellt werden – entweder mithilfe von Paketen und Komponenten oder manuell mit der WordPress-REST-API. Unabhängig von der Methode, für die Sie sich entscheiden, muss Ihr Block den asynchronen Eingabestrom verarbeiten – den Zeitrahmen, während Sie auf eine Antwort warten.
Es gibt mehrere Methoden und Muster, um einen dynamischen Block für Gutenberg zu erstellen. Am häufigsten verwenden Sie ein Reaktionsmuster, das als Komponenten höherer Ordnung bezeichnet wird und für das WordPress zahlreiche Funktionen und Komponenten bereitstellt.
Im nächsten Tutorial-Teil sehen wir uns an, wie Posts und Kategorien in unserem Block abgerufen werden. Im Moment müssen wir lernen, wie wir PHP dazu bringen, unseren Block zu rendern.
Bereiten Sie unseren Block für das PHP-Rendering vor
Der Hauptteil, den wir in Javascript tun müssen, ist, die save
Funktion des Blocks return zu machen null
. Sie könnten die ursprüngliche Ausgabe beibehalten, aber sobald wir WordPress anweisen, PHP zum Rendern des Blocks zu verwenden, wird dies ignoriert. Um uns und anderen klar zu machen, dass die Ausgabe des Blocks nicht in Javascript behandelt wird, ändern wir die save
Funktion.
Vergessen Sie nicht, dass das Ändern der Speicherfunktion dazu führt, dass alle vorhandenen Blöcke kaputt gehen. Fügen Sie den Block erneut hinzu. Der Block sollte genauso funktionieren wie zuvor; mit den Einstellungen und Aktualisierung der Attribute. Es wird jetzt einfach nichts im Frontend ausgegeben. Der Kommentarblock wird vorhanden sein und alle Attribute in JSON speichern, aber kein sichtbares HTML wird gerendert.
Jedoch; Wenn eines Ihrer Attribute die source
Eigenschaft verwendet, müssen Sie dies ändern. Dies wird bei Blöcken, die mit PHP gerendert werden, nicht unterstützt, da sie direkt aus der Ausgabe des Speicherns geparst werden – worauf wir jetzt zurückkommen null
. Wir verwenden source auf dem zweiten RichText
in unserem Block – für den Absatz. An diesem Punkt speichert der Editor RichText
überhaupt nicht, was Sie hier eingeben.
Wenn Sie also auch noch source
das myRichText
Attribut verwenden, müssen wir die Eigenschaften source
und entfernen selector
, um sicherzustellen, dass die Attribute gespeichert und nicht von der save
Funktion geparst werden:
attributes: {
...
myRichText: {
type: 'string',
},
...
Danach ist unser Block bereit zum Rendern in PHP. Wir können die Javascript-Dateien belassen (vergessen Sie nicht, sie zu erstellen) und der Rest wird in PHP erledigt.
Rendern von Blöcken in PHP
Um WordPress anzuweisen, die Ausgabe des Blocks in PHP zu rendern, fügen wir der Funktion ein neues Argument hinzu register_block_type()
. Wir müssen den Schlüssel render_callback
mit einem Wert der Funktion, die er ausführen soll, zum Array hinzufügen.
Die PHP-Renderfunktion
Lassen Sie uns die Funktion awp_myfirstblock_render
weiter unten in functions.php
(oder wo auch immer Sie Ihren PHP-Code eingefügt haben) definieren. Unsere Funktion erhält zwei Parameter; wir rufen sie an $attr
und $content
.
function awp_myfirstblock_render($attr, $content) {
// return the block's output here
}
Der Parameter $attr
ist ein assoziatives Array mit allen gespeicherten Attributen. Der zweite Parameter, $content
, ist für Blöcke innerhalb unseres Blocks. Dies ist nur relevant für Blöcke, die verschachtelte Blöcke unterstützen – was zum Beispiel Columns oder Cover tun.
Die Funktion sollte nie echo
etwas aus. Alle Ausgaben müssen zurückgegeben werden, also müssen Sie eine Zeichenfolge erstellen und am Ende zurückgeben.
Bei Attributen ist es wichtig, sich daran zu erinnern, dass nur gespeicherte Attribute im ersten Parameter der Funktion erscheinen. Wenn ein Attribut nie tatsächlich geändert und gespeichert wurde – dh sich nur auf sein verlässt default
– wird das Attribut überhaupt nicht für unsere PHP-Funktion berücksichtigt.
Sie müssen dieses Problem entweder immer überprüfen if (isset($attr['...']))
oder auf die bevorzugte Weise behandeln: die Attribute in unserem register_block_type()
Aufruf definieren. Wir können einen weiteren Schlüssel bereitstellen, attributes
, und seinen Wert auf ein Array mit allen Attributen setzen, die wir aus unserem Block extrahieren möchten. Die Struktur sollte identisch mit der sein, die Sie in Javascript definiert haben, aber anstelle eines Javascript-Objekts benötigen Sie sie in einem PHP-Array. Es kann etwas umständlich sein, dieselben Attribute neu zu definieren, aber mit einem intelligenten Code-Editor sollte es ziemlich schnell gehen, sie in PHP zu kopieren, einzufügen und mehrzeilig zu bearbeiten.
Hinzufügen der Attribute für unsere Renderfunktion
Lassen Sie uns das neue attributes
Element hinzufügen register_block_type()
und genau dieselben Attribute einfügen, die wir in unserer Javascript-Datei definiert haben:
Denken Sie daran, dass der Parameter default
Ihrer Funktion immer alle Attribute enthalten sollte, wenn Sie a für alle Attribute definieren. $attr
Zum Beispiel textAlignment
existiert das obige Attribut nur in, $attr
wenn es geändert wurde – und Sie müssen überprüfen isset($attr['textAlignment'])
.
Leider gibt es im Moment zwei Dinge, die Sie mit PHP block render nicht in den Griff bekommen. Eines ist die className
Requisite – also müssen Sie die Wrapping-Klasse (wenn Sie es wollen) selbst bauen. Die andere ist die support
Eigenschaft für die Blockausrichtung. Momentan unterstützt WordPress diese Eigenschaft in dynamischen Blöcken nicht. Wir werden den Wert der gewählten Blockausrichtung nicht erhalten, es sei denn, wir ändern ihn in ein Attribut und handhaben ihn manuell in Javascript.
Die HTML-Ausgabe der Funktion liegt ganz bei Ihnen!
Anfordern von PHP-Rendering aus dem Editor heraus
Es ist möglich, das PHP-Rendering unseres Blocks im Editor anzufordern. Dies ist nützlich, wenn Sie die Ausgabe des Blocks im Editor in der Vorschau anzeigen möchten. Wir können dies mit einer Komponente tun, die ServerSideRender
aus dem wp.editor
Paket aufgerufen wird.
Als Requisiten ServerSideRender
müssen Sie alle Attribute definieren, die Sie weitergeben möchten. Als Minimum müssen Sie dem Prop den Namen des Blocks mitteilen block
, damit WordPress weiß, nach welcher Rendermethode gesucht werden muss. Diese steht Ihnen in props.name
der edit
Funktion zur Verfügung. Sie müssen auch alle Attribute angeben, die Sie in der Requisite benötigen attributes
. Wenn Sie möchten, können Sie hier auch benutzerdefinierte Variablen außerhalb von Attributen hinzufügen. Denken Sie daran, dass dies nur für den internen Editor und nicht für das Frontend funktioniert.
Sie können ServerSideRender
die Funktion des Blocks nicht verwenden save
. Ihre save
Funktion muss trotzdem zurückkehren null
.
Lassen Sie uns ServerSideRender
in unserem Block implementieren, um es in der Praxis zu sehen.
Verwenden von ServerSideRender für den Blockvorschau-/Bearbeitungsmodus
Wenn Sie dem vorherigen Schritt gefolgt sind, in dem wir einen Umschalter für den Vorschau-/Bearbeitungsmodus für unseren Block erstellt haben, können wir jetzt verwenden ServerSideRender
, um die Vorschau des Blocks von PHP aus zu rendern, wenn wir in den Vorschaumodus umschalten.
Zuerst müssen wir uns daran erinnern, ServerSideRender
oben zu destrukturieren:
const { ServerSideRender } = wp.editor;
Wenn Sie sich an den vorherigen Schritt erinnern, haben wir die Komponenten Disabled
und/oder verwendet Placeholder
, um die Vorschau zu halten. Das Problem bei der Verwendung Placeholder
besteht darin, dass wir unerwünschtes Styling auf unsere Ausgabe anwenden. Placeholder
Lassen Sie uns durch ersetzen ServerSideRender
. Sie können die Disabled
Komponente beibehalten, um sicherzustellen, dass kein Inhalt angeklickt oder gezogen werden kann.
Beim Code zum Rendern des Blocks, wenn das Attribut editMode
falsch ist, machen wir Folgendes:
Jetzt rendert unsere benutzerdefinierte Schaltfläche in der Symbolleiste die Ausgabe von PHP, wenn wir in den Vorschaumodus wechseln. Die Ausgabe sollte identisch sein, wenn der Beitrag im Frontend angezeigt wird. Dies ist eine gute Angewohnheit, um sicherzustellen, dass die Ausgabe in Editor und Frontend identisch ist.
Beispiel: Dynamischer Block, der einen ausgewählten Beitrag anzeigt
Die Ausgabe in Ihrer PHP-Renderfunktion kann beliebig sein und Sie haben vollen Zugriff auf alle WordPress-Funktionen. Nehmen Sie einen Block an, in dem eine Beitrags-ID in einem Attribut gespeichert wird. In der render_callback
PHP-Funktion können Sie den Beitrag aus der ID abfragen und dessen Informationen ausgeben. Es sollte ziemlich selbsterklärend sein, wie das geht, aber hier ist ein kurzes Beispiel.
NB: In diesem Beispiel fügen wir einfach eine Texteingabe zum Editor hinzu, um eine Beitrags-ID manuell einzugeben. Dies ist keine sehr intuitive und benutzerfreundliche Lösung für die Auswahl eines Beitrags – aber das lernen wir im nächsten Schritt. Der Fokus liegt hier auf dem PHP-Teil des Renderns des ausgewählten Beitrags.
Lassen Sie uns ein Attribut selectedPostId
vom Typ Zahl hinzufügen:
attributes: {
selectedPostId: {
type: 'number'
}
}
Und irgendwo innerhalb der edit
Funktion unseres Blocks fügen wir eine TextControl
Komponente hinzu. Es kann sein, wo immer Sie wollen – innerhalb des Blocks oder im Inspektor.
Beachten Sie, dass ich besonders darauf achte, sicherzustellen, dass die Eingabe das Attribut korrekt als Zahl speichert, indem ich es mit in eine ganze Zahl umwandele parseInt()
. Obwohl wir den Typ prop type
auf number
setzen, um eine Zahleneingabe zu rendern, wird der geänderte Wert immer noch als Zeichenfolge interpretiert. WordPress speichert Ihr Attribut nicht, wenn es das falsche Format hat.
Vergessen Sie nicht, das neue Attribut zu Ihrer ServerSideRender
Komponente hinzuzufügen, falls Sie eines haben:
Der PHP-Teil
Das sollte sich um den Javascript-Teil gekümmert haben. Kommen wir zu PHP. Zuerst müssen wir das neue Attribut selectedPostId
zum attributes
Array hinzufügen in register_block_type()
:
In der render_callback
Funktion können wir nun mit auf die Post-ID zugreifen $attr['selectedPostId']
. Wir können damit einen einfachen Vorgang ausführen get_post()
und die Daten der Post ausgeben; sein link und titel:
Dies ist ein sehr einfaches Beispiel, das als Sprungbrett für Sie gedacht ist, um fortgeschritteneren und benutzerdefinierten Code zu schreiben.
Nachdem wir nun wissen, wie man mit dem Rendern dynamischer Blöcke umgeht, besteht der nächste Schritt darin, zu lernen, wie man auch den Editor-Teil intuitiver gestaltet. Im nächsten Schritt konzentrieren wir uns darauf, wie man Beiträge aus dem Block-Editor heraus abfragt und dem Benutzer eine bessere Möglichkeit bietet, einen Beitrag auszuwählen.