Hilfe beim Erstellen einer Diashow Benutzerdefinierter Beitragstyp mit benutzerdefinierten Meta-Boxen?

16

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:

Alt-Text

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:

Alt-Text

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.

matt
quelle
Können Sie ein simles Bild zeichnen, das das ganze Bild zeigt, wie eine Skizze oder so? Ich denke, das ist hilfreich, um Ihre Bedürfnisse besser zu verstehen.
Hakre
Ich habe unten einige Beispiele hinzugefügt. Wenn dies nicht klar genug ist, lassen Sie es mich wissen.
Matt
Ist es noch nicht klar?
Matt
Jemand? Ist das Ding an?
Matt
@Hakre, bist du da?
Matt

Antworten:

6

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:

  • Sie definieren den Code für jedes Widget einmal, indem Sie die WP_WidgetKlasse erweitern.
  • Anschließend können Sie so viele Kopien des Widgets erstellen, wie Sie möchten
    • Die Besonderheiten jedes Widgets werden als serialisierte Daten in der Optionstabelle gespeichert
  • Sie können jedes Widget anpassen, mit einem einfachen deleteBefehl entfernen und seine Position explizit über die Drag-and-Drop-Oberfläche von Appearance festlegen

Ziehen 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:

  • Sie haben Ihrem benutzerdefinierten Beitragstyp über das Widget "Weitere Felder" 15 benutzerdefinierte Felder hinzugefügt, möchten jedoch Felder dynamisch hinzufügen / entfernen, anstatt mit einer festgelegten Nummer zu arbeiten
  • Sie möchten eine Möglichkeit, die Reihenfolge dieser benutzerdefinierten Felder anzupassen, damit die Folien in der richtigen Reihenfolge geladen werden

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.

EAMann
quelle
Danke für die Hilfe! Im Moment ist dies ein wenig von meinen Fähigkeiten abweichend, wird aber als guter Leitfaden für den Lernprozess dienen. Ich kenne "Klassen" und merke, dass ich im Metabox-Code bereits eine Klasse verwende, diese aber immer noch nicht verstehe. Eine andere Sache, die ich "kenne", aber nicht vollständig verstehe, ist die Verwendung von Arrays.
Matt
Ihr Ratschlag, die Grundlagen zuerst zu verbessern, ist sinnvoll, aber ich bin mit einigen realen Einschränkungen konfrontiert, die es erforderlich machen, dass ich diese so schnell wie möglich in die Produktionsumgebung einsetze. Einer der wichtigsten Faktoren ist der Wysiwyg-Editor, da viele der Autoren sehr wenig technisch sind . Es macht mir nichts aus, das Projekt inkrementell zu gestalten und dabei auf Krücken zu setzen, aber dieser Ansatz muss offensichtlich skalierbar sein. Das heißt, es scheint mir, dass die Verwendung des Plugins "more fields" als vorübergehende Lösung dienen könnte, bis ich dies herausfinde. Ich bin mir jedoch nicht sicher, ob dies mit ...
matt
Ihr Ansatz, die gesamte Diashow in einem benutzerdefinierten Feld zu speichern. Denken Sie wirklich, dass es besser ist, alles auf einem Gebiet zu platzieren? Das mag sich ignorant anhören, aber es scheint mir, dass es viel mehr Raum für Fehler gibt, wenn wp die gesamte Diashow jedes Mal neu schreiben muss, wenn eine kleine Änderung vorgenommen wird.
Matt
Das Speichern der gesamten Show in einem Metafeld vermeidet und führt zu Problemen: Es spart Zeit auf der Präsentationssite, da Sie nicht gezwungen sind, mehrere Felder auszuwählen, zu lesen und in einer Schleife durchzugehen. Wenn jedoch eine Folie beschädigt wird und in die Datenbank geschrieben wird, wird die gesamte Bildschirmpräsentation unterbrochen. Auf jeden Fall ein Kompromiss, aber ich entscheide mich immer für Geschwindigkeit und einfache Entwicklung.
EAMann,
Wollen Sie damit sagen, dass dies im Front-End der Site Zeit spart? Warum sollte das so sein, wenn immer nur eine Folie angezeigt wird?
Matt