In Teil 1 und Teil 2 unserer Tutorial-Serie für benutzerdefinierte Meta-Box-Vorlagen haben wir gelernt, wie Sie ein Feld-Array erstellen, das durchlaufen werden kann, und eine benutzerdefinierte Meta-Box mit Ihren Standardfeldern erstellen. Lassen Sie uns jetzt ein wenig JavaScript für ein paar ausgefallene, aber äußerst nützliche Felder hinzufügen.
Für jedes der in diesem Tutorial behandelten Felder sind jQuery und die jQuery-Benutzeroberfläche erforderlich. Glücklicherweise macht es WordPress sehr einfach, diese mit zu verwenden wp_enqueue_script
, und ab 3.3 sind alle Interaktionen und Widgets der jQuery-Benutzeroberfläche mit WordPress gebündelt.
Da wir gerade an einer Seite arbeiten, die jQuery bereits in eine Warteschlange stellt, können wir dies überspringen, müssen jedoch die jQuery-Benutzeroberfläche Datepicker verwenden. Wir müssen auch ein eigenes Stylesheet erstellen, da das erforderliche CSS noch nicht in WordPress gebündelt ist - obwohl das funktioniert.
if (is_admin ()) wp_enqueue_script ('jquery-ui-datepicker'); wp_enqueue_style ('jquery-ui-custom', get_template_directory_uri (). '/ css / jquery-ui-custom.css');
Wir müssen diese nur in den Admin laden und nicht in das Front-End der Site, also wickeln Sie die Funktionen in eine Bedingung. Die erste Funktion ruft den Datepicker auf und lädt auch den jQuery-UI-Core. Die zweite Funktion ruft unser jquery-ui-custom.css-Stylesheet aus dem CSS-Ordner des Themas auf. Für das im Download am Anfang dieses Tutorials enthaltene Beispiel-Stylesheet sind keine Bilder erforderlich. Sie können auch ein eigenes jQuery-UI-Design erstellen.
Schauen wir uns nun das Array-Element an, das wir zu unserem hinzufügen müssen $ custom_meta_fields
Array haben wir in Teil 1 begonnen.
array ('label' => 'Date', 'desc' => 'Eine Beschreibung für das Feld.', 'id' => $ prefix.'date ',' type '=>' date ')
Dieses Array ist fast identisch mit unserem Textelement. Es hat ein Hauptetikett, eine Beschreibung, eine eindeutige ID und der Datumstyp ist definiert. Wir gehen in unserem Beispiel hier nur auf eine grundlegende Implementierung der Datumsauswahl ein. Wenn Sie jedoch die Verwendung der Datumsauswahl stärker hervorheben möchten, können Sie dem Array auch weitere Informationen hinzufügen, z. B. das bevorzugte Format, die Lokalisierung und Datumsbereich, um nur einige zu nennen. Dann könnten Sie diese Informationen in dem folgenden Skriptaufruf verwenden, den Sie dem Kopf der Seite hinzufügen müssen:
add_action ('admin_head', 'add_custom_scripts'); Funktion add_custom_scripts () global $ custom_meta_fields, $ post; $ output = ''Dieses Bit muss außerhalb von hinzugefügt werden
$ custom_meta_fields
Array und außerhalb dershow_custom_meta_box
Callback-Funktion zum Initialisieren der Datumsauswahl für alle Felder mit der Klasse "Datumsauswahl".// Datumsfall 'Datum': Echo '
'. $ field [' desc '].''; brechen;Dieser Code wird nach der letzten Unterbrechung in unserer Meta-Box hinzugefügt.
Manchmal müssen Sie eine Zahl sammeln, die in einem exakten Bereich festgelegt ist oder ein Vielfaches von 5 sein muss. Der Schieberegler für die jQuery-Benutzeroberfläche eignet sich hervorragend dafür, da Sie ihn einfach per Drag-and-Drop auf die gewünschte Zahl ziehen können.
wp_enqueue_script ('jquery-ui-slider');
Stellen Sie sicher, dass Sie die js-Datei aufrufen, indem Sie dies Ihren in is_admin () eingeschlossenen Enqueues hinzufügen.
array ('label' => 'Slider', 'desc' => 'Eine Beschreibung für das Feld.', 'id' => $ prefix.slider ',' type '=>' slider ',' min '= > '0', 'max' => '100', 'step' => '5')
Wieder fügen wir dies unserem hinzu $ custom_meta_fields
Array und es gibt ein paar spezielle Ergänzungen.
if ($ field ['type'] == 'slider') $ value = get_post_meta ($ post-> ID, $ field ['id'], true); if ($ value == ") $ value = $ field ['min']; $ output. = 'jQuery (" #'. $ field ['id'] .'- slider "). slider (value: ' . $ value. ', min:'. $ field ['min']. ', max:'. $ field ['max']. ', Schritt:'. $ field ['step']. ', Folie: function (event, ui) jQuery ("# '. $ field [' id '].'") .val (ui.value);); ';
Fügen Sie dieses Bit der Schleife in der Schleife hinzu add_custom_scripts
Funktion, die wir im letzten Feldtyp erstellt haben. Dadurch wird die benutzerdefinierte jQuery hinzugefügt, die zum Einrichten des Schiebereglers erforderlich ist.
// Slider-Fall 'Slider': $ value = $ meta! = "? $ meta: '0'; echo '
'. $ field [' desc '].''; brechen;
Wieder verwenden wir nur ein Textfeld, um den Wert des Schiebereglers zu erhalten.
Seit der Einführung von Post-Thumbnails ist das Festlegen eines Bildes mit einem benutzerdefinierten Meta-Feld nicht viel, aber wir tun ab und zu eine Zeit, zu der Sie ein anderes Bild als das Post-Thumbnail setzen müssen, insbesondere wenn Sie ein Miniaturbild erstellen Plugin, das berücksichtigt, dass das Design des Benutzers Post-Thumbnails möglicherweise nicht unterstützt.
In diesem Feld können Sie ein Bild hochladen oder aus dem Medienupload auswählen, eine Vorschau des Bildes anzeigen und die ID für maximale Nutzungsoptionen speichern.
Um unseren Button zum Auslösen des Medien-Uploaders zu erhalten, müssen wir mit etwas Javascript einbinden.
jQuery (Funktion (jQuery) jQuery ('. custom_upload_image_button'). click (function () formfield = jQuery (this) .siblings ('. custom_upload_image'); preview = jQuery (this) .siblings ('. custom_preview_image') tb_show (", 'media-upload.php? type = image & TB_iframe = true'); window.send_to_editor = function (html) imgurl = jQuery ('img', html) .attr ('src'); classes = jQuery ('img', html) .attr ('class'); id = classes.replace (/(.*?) wp-image- /, "); formfield.val (id); preview.attr ('src') , imgurl); tb_remove (); return false;); jQuery ('. custom_clear_image_button'). click (function () var defaultImage = jQuery (this) .parent (). siblings ('. custom_default_image'). text (); jQuery (this) .parent (). Geschwister ('. custom_upload_image'). val ("); jQuery (this) .parent (). Geschwister ('. custom_preview_image'). attr ('src', defaultImage) ; falsch zurückgeben; ); );
Fügen Sie diese in eine benutzerdefinierte js-Datei ein und legen Sie sie in Ihre in is_admin () eingeschlossenen Enqueues ein.
wp_enqueue_script ('custom-js', get_template_directory_uri (). '/ js / custom-js.js');
Die erste Funktion findet die Schaltfläche, die wir in Kürze mit der Klasse "custom_upload_image_button" erstellen werden, und führt beim Klicken einige verschiedene Elemente aus.
Die zweite Funktion teilt dem Link mit, den wir als "custom_clear_image_button" klassifizieren, um sowohl den Wert des Formularfelds zu löschen als auch die Vorschau auf unser Standardbild zurückzusetzen.
array ('name' => 'Image', 'desc' => 'Eine Beschreibung für das Feld.', 'id' => $ prefix.'image ',' type '=>' image ')
Wir brauchen nur die Basisinformationen für dieses Feld.
// Bildfall 'image': $ image = get_template_directory_uri (). '/ images / image.png'; Echo ''. $ image.''; if ($ meta) $ image = wp_get_attachment_image_src ($ meta, 'medium'); $ image = $ image [0]; Echo '
Entferne Bild
'. $ field [' desc '].''; brechen;
Wir haben hier ein paar Dinge, aber mit der Art, wie wir das Javascript geschrieben haben, sollte dies ziemlich gut funktionieren, egal wie viele Bildfelder Sie hinzufügen.
Wenn Sie wirklich mit der Verwendung von benutzerdefinierten Metafeldern zum Speichern verschiedener Datentypen für einen Beitrag beginnen, müssen Sie eventuell mehrere Instanzen desselben Felds benötigen. Mit etwas Javascript können Sie ein Feld beliebig oft duplizieren und sogar per Drag & Drop sortieren. Es gibt viele Möglichkeiten, wie wir diese Funktionalität nutzen können, aber in unserem Beispiel verwenden wir nur eine grundlegende Texteingabe.
jQuery ('. repeatable-add'). click (function () field = jQuery (this) .closest ('td'). find ('. custom_repeatable li: last'). clone (true); fieldLocation = jQuery ( this) .closest ('td'). find ('. custom_repeatable li: last'); jQuery ('input', Feld) .val ("). attr ('name', function (index, name) return name .replace (/ (\ d +) /, function (fullMatch, n) return Number (n) + 1;);;) field.insertAfter (fieldLocation, jQuery (this) .closest ('td')) gibt false zurück ;); jQuery ('. repeatable-remove'). click (function () jQuery (this) .parent (). remove (); false zurückgeben;); jQuery ('. custom_repeatable'). sortable ( Deckkraft: 0,6, umkehren: wahr, Cursor: 'verschieben', Handle: '.sort');
Sie können dieses Javascript zu den benutzerdefinierten Js hinzufügen, die Sie im letzten Schritt bereits erstellt haben.
Die erste Funktion sucht nach der Schaltfläche "Hinzufügen" und fügt am Ende der Feldliste eine neue leere Feldzeile hinzu. Dies ist generisch eingerichtet, so dass Sie beliebig viele dieser wiederholbaren Felder verwenden können.
Mit der nächsten Funktion können Sie mit jeder Entfernen-Schaltfläche diese Zeile entfernen, wenn Sie darauf klicken.
Schließlich legen wir die Listen als sortierbar fest und definieren einen Ziehpunkt, damit Sie die Zeilen ziehen und ablegen können. Es ist nicht erforderlich, die sortierbare Interaktion für die jQuery-Benutzeroberfläche in die Warteschlange aufzunehmen, da sie bereits auf der Bearbeitungspostseite verwendet wird.
array ('label' => 'Repeatable', 'desc' => 'Eine Beschreibung für das Feld.', 'id' => $ prefix.'repeatable ',' type '=>' wiederholbar ')
Für dieses Beispiel gibt es in diesem Feld nichts Besonderes. Allerdings könnten Sie hier ziemlich verrückt werden und Optionen hinzufügen, welche Felder in der wiederholbaren Liste verwendet werden.
// wiederholbarer Fall 'wiederholbar': Echo '+
Dieses Feld erfordert eine Schleife, wenn ein Meta-Wert gespeichert ist, und keine Schleife, wenn dies nicht der Fall ist.
.$ i
Ganzzahl, um sicherzustellen, dass dem Namensfeld eine neue Nummer hinzugefügt wird.Wenn Sie bisher alle drei Teile dieser Serie mitverfolgt haben, sollte Ihre letzte Box wie die hier abgebildete aussehen:
Wir haben wirklich nur die Oberfläche dessen gekratzt, was mit dieser Methode zum Erstellen einer wiederverwendbaren benutzerdefinierten Meta-Box-Vorlage erreicht werden kann. Je mehr Sie zu Ihrer Vorlage hinzufügen, desto einfacher ist es, sie in das Projekt aufzunehmen, an dem Sie gerade arbeiten, um die Codierungszeit zu verkürzen und den Prozess mit sauberem, konsistenten Code zu optimieren.