Ich muss ein benutzerdefiniertes Post-Meta-Feld für meinen benutzerdefinierten Post-Typ "Diashow" erstellen (dieser Post-Typ ist bereits erstellt). Jede Metabox enthält den Inhalt jeder Folienfolie und speichert ihn in den entsprechenden benutzerdefinierten Feldern. Jede Metabox sollte folgende Felder enthalten:
- Titel (Textfeld)
- Bild (entweder ein Textfeld für die Bild-URL oder idealerweise eine Dropdown-Liste mit Miniaturansichten der an den Beitrag angehängten Bilder)
- Code einbetten (Textbereich)
- Beschreibung (wysiwyg)
- Folie ausblenden (Kontrollkästchen, um eine Folie vorübergehend auszublenden, ohne sie zu löschen)
- Folie löschen (Schaltfläche zum Löschen des Inhalts der Post-Meta-Felder, die von dieser Folie ausgefüllt wurden)
Ich hätte auch gerne irgendwo eine Schaltfläche, mit der ich eine Folie hinzufügen kann. Wenn ich darauf klicke, wird eine weitere benutzerdefinierte Metabox "Folie" hinzugefügt, die ein Duplikat der ersten ist, aber jedem benutzerdefinierten Post-Metafeld eine inkrementelle Nummer hinzufügt. Ich habe derzeit nur 15 Metaboxen und die Diashow-Vorlage ist so eingerichtet, dass nur 5 Folien angezeigt werden, wenn nur 5 der Metaboxen ausgefüllt sind.
Schließlich möchte ich die Folien nachbestellen können, entweder per "Drag and Drop" oder über ein anderes Textfeld, in das ich die Bestellnummer eingeben kann.
Ich habe es mit dem "More Fields" -Plugin und ein paar Code-Hilfen von Rarst fast dort bekommen, wo ich es brauche. Mit dem Plugin "Weitere Felder" habe ich in jeder Metabox folgende Felder:
- Titel (Textfeld)
- Bild (Eine Dropdown-Liste der an den Beitrag angehängten Bilder)
- Code einbetten (Textbereich)
- Beschreibung (wysiwyg)
- Folie ausblenden (Kontrollkästchen, um eine Folie vorübergehend auszublenden, ohne sie zu löschen)
Hier ist ein Screenshot davon, wie ich es über das Plugin "More Fields" eingerichtet habe:
Das Problem dabei ist, dass eine erstellte Folie nicht gelöscht werden kann, da "Weitere Felder" <?php delete_post_meta($post_id, $key, $value); ?>
nirgendwo verwendet wird. Das andere Problem mit dem Plugin ist, dass es zu unzuverlässig ist und häufig mit Updates bricht.
Ich konnte eine ähnliche Lösung mit meinen eigenen benutzerdefinierten Metaboxen implementieren, die Folgendes umfassen:
- Titel (Textfeld)
- Bild (Textfeld für die img URL)
- Code einbetten (Textbereich)
- Beschreibung (Textbereich)
- Folie ausblenden (Kontrollkästchen, um eine Folie vorübergehend auszublenden, ohne sie zu löschen)
Mit dieser Implementierung kann ich nicht scheinen, die mehrfachen TinyMCE-Felder zum Arbeiten oder das Bild-Dropdown-Feld zu erhalten. Der TinyMCE Code scheint zu funktionieren , bis ich den Code hinzufügen , die inkrementellen Kopien des ersten metabox schaffen , an welchem Punkt ich diesen Fehler direkt über dem Feld, wo die TinyMCE Tasten sein sollen: Warning: array_push() [function.array-push]: First argument should be an array...
.
Außerdem verlasse ich mich im Moment darauf, dass meine Autoren wissen, ob sie für jede Folie ein Video oder ein Bild einfügen können, und das ist in Ordnung, aber es ist möglicherweise besser, ein Optionsfeld zu haben, mit dem sie auswählen können, welche Folie die Folie ist (wahrscheinlich standardmäßig) Bild), das an eine bedingte Anzeigeanweisung in der Diashow-Vorlage gebunden ist.
Ich verwalte das Hochladen von Bildern über das integrierte Feld "Ausgewähltes Bild" in der Seitenleiste, obwohl mir eine benutzerdefinierte Metabox nichts ausmacht, in der oben im Schreibfeld einfach "Bilder hochladen" steht.
Letztendlich suche ich eine Diashow wie diese: http://www.nytimes.com/slideshow/2010/08/10/science/20100810angier-1.html . Ich möchte, dass ich anstelle eines Bildes auch ein Video als Inhalt in der Folie haben kann. Ich benötige ein intuitives und einfach zu bedienendes Admin-Panel für meine Autoren (sie sind nicht sehr technisch versiert und arbeiten nicht zuverlässig mit HTML und / oder Shortcodes). Für den Fall, dass es aus dem Beispiel nicht klar wird, sollte jede Folie einen neuen Seitenaufruf generieren.
Die Drag'n'Drop-Neuordnung hat keine hohe Priorität, aber es wäre cool. Ich habe ein Plugin gefunden, das das wirklich gut macht: SlideDeck . Leider entspricht das Plugin nicht meinen Wünschen, aber die Art und Weise, wie die Folien bestellt werden, ist ziemlich raffiniert. Es ist eine separate Metabox in der Seitenleiste, mit der Sie die Folien in die von Ihnen gewünschte Reihenfolge ziehen können. Auf diese Weise können Sie auch Folien hinzufügen, indem Sie auf die Schaltfläche "Folie hinzufügen" klicken und dem Schreibfeld eine weitere Folien-Metabox hinzufügen. Hier ist ein Screenshot:
Sie können auch weitere Screenshots davon im WordPress-Repository in Aktion sehen .
Hier ist mein gesamter Code:
Die Funktionen zum Einrichten meines Diashow-Beitragstyps und der Diashow-Paginierung: http://loak.pastebin.com/g63Gf186
Der ursprüngliche Code von DeluxeBloggingTips.com (DBT), auf dem meine Metaboxen basieren: http://loak.pastebin.com/u9YTQrxf
Die Version des DBT-Codes, den ich geändert habe, um inkrementelle Versionen derselben Metabox zu erhalten: http://loak.pastebin.com/WtxGdPrN
Eine modifizierte Version des DBT-Codes, den Chris Burbridge erstellt hat, um mehrere Instanzen von TinyMCE zu ermöglichen: http://loak.pastebin.com/Mqb3pKhx Mit diesem Code funktionieren die TinyMCEs.
Meine Änderung von Burbridges Code, der versucht, meine Inkrementierung zu integrieren, und ein Feld, in dem Sie das Bild aus einer Dropdown-Liste aller an den Beitrag angehängten Bilder auswählen können: http://loak.pastebin.com/xSuenJTK Bei diesem Versuch wird der TinyMCE ist kaputt und das Dropdown funktioniert nicht.
Dies spielt wahrscheinlich keine Rolle, aber für den Fall, dass Sie sich fragen, hier ist der Code, den ich verwende, um den Einbettungscode aus dem benutzerdefinierten Post-Meta zu ziehen, seine Größe zu ändern und ihn in den Beitrag einzufügen: http://loak.pastebin.com / n7pAzEAw
Dies ist eine bearbeitete Version der ursprünglichen Frage, die den aktuellen Status des Projekts widerspiegelt und die in den Kommentaren gestellten Fragen beantwortet. Vielen Dank an Chris_O , der das Kopfgeld dafür gezahlt hat . Vielen Dank auch an Rarst und Justin, die mir im ThemeHybrid.com-Forum dabei geholfen haben . Ich habe Stunden und Stunden damit verbracht und stecke fest (ich habe ein paar Stunden alleine mit dieser Frage verbracht). Jede Hilfe wäre sehr dankbar.
Antworten:
Wie es aussieht, ist es am sichersten und einfachsten, das Plugin More Fields speziell für Ihre Verwendung zu verwenden. Die beiden größten Funktionen, die Ihre Gabel benötigt, sind ein Feld "Factory" und eine Drag-and-Drop-Schnittstelle.
Mehrere Felder
Mein Vorschlag wäre, sich die WordPress Widget-Klasse anzusehen und sie als Modell für Ihre Feldfactory zu verwenden - im Grunde genommen sollten Sie sich die Möglichkeit ausleihen, mehrere Instanzen eines Felds zu erstellen, sobald Sie das Framework dafür erstellt haben.
Dies ist der Kern der Funktionsweise mehrerer Widgets in einer Seitenleiste:
WP_Widget
Klasse erweitern.delete
Befehl entfernen und seine Position explizit über die Drag-and-Drop-Oberfläche von Appearance festlegenZiehen und Ablegen
Ich schlage noch einmal vor, das WordPress-Widget-System als Inspirationsquelle heranzuziehen. Wir haben dort bereits eine ziemlich intuitive Drag-and-Drop-Oberfläche eingerichtet, sodass es ziemlich einfach wäre, einen Großteil desselben Codes an einer anderen Stelle neu zu verwenden. Wenn Sie wirklich ausgefallen sein möchten, können Sie Ihr eigenes Drag-and-Drop-System in einem separaten benutzerdefinierten Metafeld implementieren.
Jede Folie würde also durch eine benutzerdefinierte Meta-Box definiert, die mit dem Beitrag verknüpft ist. Die Reihenfolge der Folien wird durch ein separates benutzerdefiniertes Meta-Feld festgelegt, das auch mit dem Beitrag verknüpft ist. Ich würde empfehlen, Folienaktualisierungen über AJAX einzureichen, damit Sie die Metabox für die Folienreihenfolge basierend auf den Informationen dynamisch aktualisieren können (dies verhindert, dass Sie manuell auf "Aktualisieren" klicken und warten müssen, bis die Seite neu geladen wird, bevor Sie Objekte verschieben).
Die Benutzeroberfläche von jQuery verfügt über eine großartige " ziehbare " Oberfläche, die Sie in dieser benutzerdefinierten Meta-Box problemlos für Ihre Zwecke bearbeiten können. Der schwierige Teil ist nicht das Erstellen der Benutzeroberfläche, sondern die konsistente und genaue Kommunikation zwischen der Meta-Box und der Sammlung von Folien-Meta-Boxen an anderer Stelle auf der Seite.
In Summe
Was ich von Ihrem Beitrag erfuhr, ist, dass Sie eine etwas praktikable Lösung haben:
Ich gehe so vor, indem ich den benutzerdefinierten Metaerstellungsprozess auf eine Klasse abstrahiere, die ich immer wieder verwenden kann, um neue benutzerdefinierte Metafelder zu erstellen. Dann würde ich die Klasse erweitern, um zwei Arten von Meta-Boxen zu initialisieren: eine für Folien, eine für die Folienstruktur. In die Meta-Box der Folienstruktur würde auch die Fähigkeit eingebaut, dynamisch neue Meta-Boxen für Folien zu erstellen (die Meta-Boxen für Folien würden ihre eigene Aktion "Löschen" enthalten).
Die gesamte Präsentation nicht durch den Schieber Meta - Boxen gespeichert werden, sondern durch die Meta - Schiebestruktur Feld in ein Feld benutzerdefinierten Meta für die Post - die benutzerdefinierte Meta ein verzweigtes Array sein würde, wobei jeder der Schieber als Arrays in ihm vertreten - in bestellen . Wenn Sie die Reihenfolge der Diashow im Struktur-Meta-Feld anpassen, wird das Array neu organisiert und das Post-Meta erneut gespeichert. Auf diese Weise kann ich nur 1 Metawert auslesen, wenn ich auf die Diashow zugreifen möchte.
Zwischen SlideDeck, More Fields und dem benutzerdefinierten Code, den Sie bisher zusammengestellt haben, haben Sie bereits den größten Teil Ihrer Lösung in der Hand ... Sie müssen nur dafür sorgen, dass alles gleichzeitig funktioniert. Ich würde mich darauf konzentrieren, die Root-Implementierung zuerst herunterzufahren, bevor ich die JavaScript-Verzierungen hinzufüge - das dynamische Erstellen, Ändern, Speichern und Löschen von Folien ist wichtiger als ein Rich-Text-Editor, IMO. Lass das zuerst raus. Dann schalten Sie das Bestellsystem aus. Dann können Sie sich darauf konzentrieren, dass mehrere Instanzen von TinyMCE auf der Seite funktionieren.
quelle
Ich habe genau das gefunden, wonach Sie suchen -> http://pippinsplugins.com/drag-and-drop-order-for-plugin-options/
quelle