Mein eigentliches Problem ist etwas komplex, deshalb werde ich hier versuchen, es zu abstrahieren und einfach zu halten.
Ich arbeite an einer benutzerdefinierten App, die auf WordPress basiert. Ich habe einen benutzerdefinierten Beitragstyp registriert. Nennen wir ihn "Personen", in denen ich Informationen über ... Personen speichere.
Das CPT unterstützt nur Standardfelder für Post-Titel und Post-Inhalte. Es gibt jedoch einige Metaboxen zum Speichern von Personeninformationen (denken Sie an meine App als Adressbuch).
Es gibt also eine Metabox zum Speichern persönlicher Informationen, eine zum Speichern von Informationen in sozialen Netzwerken und eine zum Speichern von arbeitsbezogenen Informationen, dh wenn diese Person für mich ein Kunde, ein Lieferant ist, wenn wir Gutschriften oder Belastungen haben ...
Ich habe hier vereinfacht, aber es gibt eine konsistente Anzahl von Metaboxen, sagen wir 12.
Mein Problem ist, dass einige Personen, für die ich Informationen speichern möchte, nur zufällige Kontakte sind und ich nur persönliche Informationen speichern möchte, andere Freunde sind und ich persönliche Informationen und Informationen über soziale Netzwerke speichern möchte, andere Kunden oder Lieferanten sind und ich möchte arbeitsbezogene Informationen speichern.
Wenn ich beim Bearbeiten eines Beitrags (über das Menü mit den Bildschirmoptionen ) eine nicht benötigte Metabox ausblende oder schließe, muss ich sie beim Öffnen eines anderen Beitrags dort, wo ich sie benötige, anzeigen oder erneut öffnen. Das weil Metaboxen Position / status / um auf einzelne Benutzer als Benutzer - Metadaten gespeichert werden .
Wenn Sie sich vorstellen, dass ich in einigen Posts 2 Metaboxen benötige, in einigen 10 und in einigen 5, verstehen Sie, dass dies ärgerlich ist, weil das Anzeigen / Öffnen aller Elemente den Bearbeitungsbildschirm niedrig zugänglich macht (die Bildlaufleiste scheint endlos zu sein), und manchmal sind es die Informationen, nach denen ich suche am Ende der Seite nach einer Reihe von Metaboxen ohne Info ...
Frage:
Ist es möglich, die Position / den Status / die Bestellung von Metaboxen pro Post für einen bestimmten Post-Typ zu speichern?
PS: Ich weiß, dass einige js / jQuery das Problem lösen können, aber wenn möglich, würde ich Javascript-Lösungen vermeiden.
'get_user_option_*_post'
damit WP benutzerdefinierte Daten erkennt. Ich denke nur, dass ich nicht zu sehr mag, ist die Verwendung vonwp_get_referer
wirklich auf$_SERVER
var, die nicht wirklich zuverlässig ist, aber ich denke, ich habe eine Idee, um das "Hauptproblem" zu überwinden;)wp_get_referer()
Methode zu, deshalb habe ich sie als nicht elegante PHP-Lösung bezeichnet ;-) Ich habe zuerst darüber nachgedacht, die aktuelle Post-ID für jeden Benutzer zu speichern, aber das funktioniert nicht, wenn ein Benutzer zwei oder mehr bearbeitet Beiträge im Browser.Wie Birgire in seiner Antwort hervorhob , verwendet WordPress AJAX, um den Status von Metaboxen zu aktualisieren, und die in der AJAX-Anfrage übergebenen Daten enthalten keine Post-ID. Dies macht es schwierig, den Box-Status pro Post zu aktualisieren.
Nachdem ich die von WordPress verwendete AJAX-Aktion gefunden hatte
'closed-postboxes'
, suchte ich im Ordner admin js nach dieser Zeichenfolge, um herauszufinden, wie WordPress die AJAX-Anfrage stellt.Ich fand es
postbox.js
in Zeile 118 .Es sieht so aus:
Im Wesentlichen betrachtet WordPress DOM-Elemente mit den Klassen "Postfach" und "Geschlossen" und erstellt eine durch Kommas getrennte Liste ihrer IDs. Gleiches gilt für versteckte DOM-Elemente mit der Klasse 'postbox'.
Mein Gedanke war also: Ich kann eine gefälschte Metabox erstellen , die die richtigen Klassen hat und versteckt ist, indem ich ihre ID so einstelle, dass sie die Post-ID enthält, und auf diese Weise kann ich sie in einer AJAX-Anfrage abrufen.
Folgendes habe ich getan:
Auf diese Weise habe ich eine Metabox erstellt, die immer geschlossen und immer ausgeblendet ist, sodass WordPress seine ID in
$_POST
der AJAX-Anfrage als var einsendet. Sobald die gefälschte Box-ID die Post-ID auf vorhersehbare Weise enthält, kann ich den Post erkennen.Danach habe ich mir angesehen, wie WordPress die AJAX-Aufgabe ausführt.
In
admin-ajax.php
Zeile 72 hakt WordPress'wp_ajax_closed-postboxes'
mit Priorität 1.Um vor WordPress zu handeln, könnte ich dieselbe Aktion mit Priorität 0 verknüpfen.
Das Speichern von Daten in einem Post-Meta ermöglichte das Filtern
get_user_option_closedpostboxes_mycpt
undget_user_option_metaboxhidden_mycpt
(beide Varianten desget_user_option_{$option}
Filters) das Erzwingen von WordPress-Ladeoptionen aus dem Post-Meta:und
quelle