(Meine erste WP-Frage, die jemals gestellt wurde! Sei sanft!)
Ich erstelle eine Site, die hauptsächlich aus Seiten besteht (dh statisch), und verwende WP als CMS. Am Ende mehrerer Seiten werden 1, 2 oder 3 "Promo-Boxen" angezeigt - im Grunde Schaltflächenbilder, die auf andere Teile der Website verweisen. Obwohl auf einer bestimmten Seite nur bis zu 3 Promo-Boxen angezeigt werden, stehen ~ 30 verschiedene zur Auswahl.
Wenn mein Kunde eine neue Seite erstellt, möchte ich, dass er Promo-Boxen aus einer Dropdown-Liste aller möglichen Promo-Boxen auswählen kann.
Mir scheint, das sollte so funktionieren:
- Erstellen Sie einen benutzerdefinierten Beitragstyp mit dem Namen "Promo-Box". (Obwohl es genauso gut ein Tag für reguläre Posts sein könnte.)
- Verwenden Sie ein Tool wie die benutzerdefinierte Feldvorlage, um ein Dropdown-Menü im Seiteneditor zu erstellen, in dem die Werte der Dropdown-Optionen dynamisch aus der Liste aller vorhandenen Promo-Box-Beiträge generiert werden. ( Dies ist der Teil, den ich nicht weiß. )
- Greifen Sie auf die resultierenden Metadaten (Post-Nummer ist wirklich alles, was ich brauche, dann kann ich alles andere bekommen) auf der Seitenvorlage zu.
Basierend auf den Antworten auf andere Fragen hier habe ich einen ersten Blick auf die benutzerdefinierten Felder WPAlchemy MetaBox, Posts-2-Posts und SLT geworfen, aber ich gebe zu, dass die Dokumentation für jedes dieser Felder etwas geekiger ist als ich, daher habe ich mich nicht damit befasst zu tief.
Rat? Ist eines der oben genannten Tools die richtige Lösung für mich und ich muss es nur herausfinden? Vermisse ich hier etwas?
quelle
Antworten:
Als Autor von WPAlchemy bin ich ein bisschen voreingenommen , aber Sie haben im Wesentlichen ein gutes Arbeitsmodell, dem Sie folgen können, je nachdem, welche Route Sie wählen.
Wenn Sie jedoch WPAlchemy verwenden, würden Sie im Grunde Folgendes tun (Schritt 2):
custom/meta.css
kann Stile enthalten, mit denen Sie Ihr Formular formatieren können, undcustom/meta.php
ist im Wesentlichen eine HTML-Datei mit dem FORMULAR-Inhalt des Meta-Felds, in diesem Fall Ihrem Dropdown-Menü. Um Ihr Dropdown-Menü zu generieren, führen Sie eine benutzerdefinierte WP-Abfrage durch, um alle Ihre benutzerdefinierten Beiträge abzurufen Typen. WPAlchemy verfügt über einige spezielle Hilfsfunktionen, die Sie beim Erstellen Ihrer Formularelemente unterstützen.Es gibt zusätzliche Dokumentationen , die Sie bei der Arbeit an der Vorlage unterstützen.
Das Hauptziel von WPAlchemy war es, die Kontrolle in den Händen des Entwicklers zu behalten, vom Styling (Look + Feel) bis zur Definition des Meta-Box-Inhalts.
Und ich und andere sind immer bereit, denen zu helfen, die Kommentare abgeben und Fragen stellen.
quelle
do_meta_boxes
mit einer bedingten Logik oder alternativ mitadd_meta_boxes_{%TYPE%}
..Hehe, du bist ein Neuling! Wir werden dich in Stücke reißen ...!
j / k :) Wir heißen alle Neulinge hier herzlich willkommen und freuen uns, Sie zu haben.
Dies ist das dritte Mal, dass ich diese Anforderung zweimal von Kunden und nicht noch einmal von Ihnen (und Ihrem Kunden) gehört habe. Das sagt mir, dass dies ein einigermaßen häufiger Bedarf ist.
Ihre Analyse hat mir gefallen, deshalb habe ich beschlossen, eine Klasse zu codieren, um Ihren zweiten Punkt anzusprechen. Ich habe es genannt,
LittlePromoBoxes
weil ich dieses Lied dank ihnen nie aus meinem Kopf bekommen kann . Grundsätzlich verwende ich die Klasse zum Einkapseln, um ansonsten mögliche Namenskonflikte mit den Funktionen zu vermeiden, die ich schreiben müsste.Sie können diese Klasse in die
functions.php
Datei Ihres Themas oder in eine PHP-Datei eines Plugins einfügen, das Sie möglicherweise schreiben (aber keine Sorge, sie sieht viel komplexer aus als sie ist).Die erste Funktion
on_load()
ist eine statische Funktion, die ich am Ende der Klassendeklaration aufrufe, um die drei (3) Hooks zu initialisieren, die Sie benötigen (statische Funktionen sind im Wesentlichen Funktionen, die sich auf die Klasse beziehen , nicht auf die Instanz) :Der
init
Haken zum Registrieren despromo-box
Beitragstyps,Der
add_meta_boxes_post
Hook, mit dem Sie die Metabox definieren können, undDer
wp_insert_post_data
Hook, mit dem Sie die ausgewählten Promo-Boxen erfassen und in der Datenbank speichern können.Jeder dieser Hooks verweist auf eine andere statische Funktion in der Klasse (dies waren die Funktionen, die ich durch Erstellen der Klasse gekapselt habe.)
Ich überspringe die Beschreibung der
action_init()
Funktion und meinermake_labels()
Hilfsfunktion, vorausgesetzt, Sie wissen, wie Sie einen Beitragstyp basierend auf Ihrer Frage registrieren.Die
action_add_meta_boxes_post()
Funktion registriert die Metabox mithilfe der WordPress-Kernfunktionadd_meta_box()
und ich habe ihre Parameter kommentiert, um zu erklären, warum ich das übergeben habe, was ich für jedes übergeben habe. Die Rückruffunktionthe_little_promo_boxes_metabox()
ist natürlich eine weitere statische Funktion der Klasse und zeigt tatsächlich den Inhalt in der Metabox an. Es verwendet hauptsächlich die WordPress-Kernfunktionwp_dropdown_pages()
, um eine Liste von Promo-Boxen anzuzeigen (beachten Sie, dass neben "Seite" auch andere Beitragstypen angezeigt werden, jedoch nur, wenn diese'hierarchical'=>true
in ihrer Beitragstypregistrierung markiert sind . Warum nur hierarchisch? Weil sie so sind schrieb es, deshalb! :)Da wir drei (3) Dropdowns anzeigen, müssen wir jedem eine eindeutige ID im HTML (
"promo_box_{$i}"
), aber denselben Namen mit eckigen Klammern ('promo_boxes[]'
) geben, damit PHP sie in einem Array innerhalb der$_POST
Variablen sammelt (auf die WordPress für uns zugreift; Sie werden sehen, wie in einer Minute) . Und natürlich müssen wir den ausgewählten Wert ((empty($promo_boxes[$i]) ? 0 : $promo_boxes[$i])
) festlegen, wenn tatsächlich einer der Werte zuvor ausgewählt wurde.Ich habe auch die WordPress-Kernfunktion verwendet, um
get_post_type_object()
zu zeigen, wie die Beschriftungen von einem Beitragstypget_post_meta()
abgerufen werden , und auch die WordPress-Kernfunktion , um ein Array von Promo-Box-IDs mithilfe des benutzerdefinierten Feldschlüssels '_promo_boxes' abzurufen, den ich Ihnen zeigen werde neben speichern (Anmerkung benutzte ich einen vorhergehenden Unterstrich im Namen ,'_promo_boxes'
die Wordpress zu verstecken aus dem Standard - benutzerdefinierten Feld UI verursacht , wenn der Benutzer die Post bearbeitet.) .Die letzte Funktion, die beschrieben werden muss, bevor Sie den Code sehen, ist
filter_wp_insert_post_data()
die, die die vorhandenen Post-Daten im ersten Parameter ($data
) und den Inhalt des$_POST
Arrays dank WordPress als zweitem Parameter ($postarr
) empfängt . Innerhalb dieser Funktion rufen wir die WordPress-Kernfunktion aufupdate_post_meta()
und extrahieren das Promo-Box-Array ($postarr['promo_boxes']
), um es im benutzerdefinierten Feldwert für den Schlüssel'_promo_boxes'
für den vom$_POST
Array angegebenen Beitrag (dh$postarr['ID']
) zu speichern .Das heißt, hier ist der Code für die
LittlePromoBoxes
Klasse:Es gibt noch zwei (2) statische Funktionen, die noch nicht erwähnt wurden:
get_promo_boxes()
undget_promo_box()
; Dies sind Hilfsfunktionen, mit denen Sie die Beiträgepost_type='promo-box'
anhand ihrer Ordnungszahlen 1..3 abrufen können. Um sie noch WordPress zu machen, wie hier, müssen Sie zwei Wrapper-Funktionen zurfunctions.php
Datei Ihres Themas hinzufügen (beachten Sie, dass Sie einen Beitrag als Parameter übergeben können, dies jedoch nicht müssen, es sei denn, Sie verwenden einen anderen Beitrag als den in The Loop ). ::Jetzt können Sie eine oder beide dieser Funktionen in Ihrer Themendatei
single.php
mit Code aufrufen , der möglicherweise so aussieht (dieser Code könnte in einer Schleife geschrieben worden sein, aber die meisten WordPress-Themen scheinen gerne Code zu duplizieren, damit sie ihn lesen können, anstatt Redundanz zu beseitigen Also, wenn in Rom ...):quelle