Ich habe einen benutzerdefinierten Beitragstyp (CPT) namens event
. Ich habe eine Meta-Box für den Typ mit mehreren Feldern. Ich möchte einige Felder validieren, bevor ich ein Ereignis veröffentliche. Wenn beispielsweise das Datum eines Ereignisses nicht angegeben ist, möchte ich eine informative Fehlermeldung anzeigen, das Ereignis für die zukünftige Bearbeitung speichern, aber verhindern, dass dieses Ereignis veröffentlicht wird. Ist der Status "Ausstehend" für einen CPT-Beitrag ohne alle erforderlichen Informationen der richtige Weg, um ihn zu behandeln?
Was ist die beste Vorgehensweise, um die Validierung von CPT-Feldern durchzuführen und zu verhindern, dass ein Beitrag veröffentlicht wird? Speichern Sie ihn jedoch für die zukünftige Bearbeitung.
Vielen Dank, Dasha
Antworten:
Sie können verhindern, dass der Beitrag alle zusammen mit kleineren JQuery-Hacks speichert, und die Felder überprüfen, bevor Sie auf der Client- oder Serverseite mit Ajax speichern:
Zuerst fügen wir unser JavaScript hinzu, um das Submit / Publish-Ereignis zu erfassen und verwenden es, um unsere eigene Ajax-Funktion vor dem eigentlichen Submit zu senden:
dann erstellen wir die Funktion für die eigentliche Validierung:
Sie können es jederzeit ein wenig ändern, um die Validierung nur für Ihren Beitragstyp durchzuführen, indem Sie eine bedingte Prüfung hinzufügen, um
my_publish_admin_hook
für Ihren Beitragstyp zu funktionieren und auf der Clientseite zu validieren, aber ich bevorzuge auf der Serverseite.quelle
pre_submit_validation
passt.my_publish_admin_hook
Block fängt die Client-Seite nach der Übermittlung abpre_submit_validation
, führt dann jedoch einen AJAX-Aufruf an den Server durch (Pre-Official-Submit-In ), der die serverseitige Validierung durchführt.Die Methode besteht aus zwei Schritten: Erstens einer Funktion zum Speichern Ihrer benutzerdefinierten Metabox-Felddaten (verknüpft mit save_post) und zweitens einer Funktion zum Lesen dieser neuen post_meta (die Sie gerade gespeichert haben), zum Überprüfen und Ändern des Ergebnisses von Speichern nach Bedarf (auch mit save_post verbunden, jedoch nach dem ersten). Wenn die Validierungsfunktion fehlschlägt, ändert die Validierungsfunktion den post_status direkt wieder in "ausstehend", wodurch effektiv verhindert wird, dass der Post veröffentlicht wird.
Da die Funktion save_post häufig aufgerufen wird, muss jede Funktion nur dann ausgeführt werden, wenn der Benutzer sie veröffentlichen möchte, und nur für Ihren benutzerdefinierten Beitragstyp (mycustomtype).
Normalerweise füge ich auch einige benutzerdefinierte Benachrichtigungsnachrichten hinzu, damit der Benutzer weiß, warum sein Beitrag nicht veröffentlicht wurde, aber diese wurden hier etwas kompliziert ...
Ich habe diesen genauen Code nicht getestet, aber es ist eine vereinfachte Version dessen, was ich in umfangreichen benutzerdefinierten Post-Type-Setups getan habe.
Fügen Sie für mehrere Metabox-Felder einfach weitere Abschlussmarkierungen hinzu, rufen Sie mehr post_meta ab und führen Sie weitere Tests durch.
quelle
Sie müssen Ihren Metafeldwert auf Ajax überprüfen / validieren, dh wenn der Benutzer auf die Schaltfläche "Veröffentlichen / Aktualisieren" klickt. Hier validiere ich ein Woocommerce-Produkt mit dem Metafeld "product_number" für einen leeren Wert.
Fügen Sie danach die Ajax-Handler-Funktion hinzu.
quelle
Ich wollte nur hinzufügen, dass Sie zum Lesen der Post-Variablen mithilfe der Bainternet-Lösung die Zeichenfolge
$_POST['form_data']
mithilfe der PHP-parse_str
Funktion analysieren müssen (nur um Zeit für die Recherche zu sparen).Dann können Sie mit nur auf jede Variable zugreifen
$varname
. Wenn Sie beispielsweise ein Metafeld mit dem Namen "my_meta" haben, können Sie folgendermaßen darauf zugreifen:quelle