Ich habe zwei benutzerdefinierte Metafelder, die ich für jeden Beitrag aktiviert habe, scottb_customHeader und scottb_customTitle
Diese funktionieren einwandfrei, solange ich die vollständige Bearbeitungsfunktion zum Bearbeiten von Posts verwende. Wenn ich jedoch auf "Schnellbearbeitung" und dann auf "Aktualisieren" klicke, werden meine benutzerdefinierten Metawerte für den Beitrag gelöscht. Was muss ich tun, um das Problem zu beheben?
Code ist unten ...
add_action('save_post', 'custom_add_save');
function custom_add_save($postID){
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return $postID;
}
else
{
// called after a post or page is saved
if($parent_id = wp_is_post_revision($postID))
{
$postID = $parent_id;
}
if ($_POST['scottb_customHeader'])
{
update_custom_meta($postID, $_POST['scottb_customHeader'], '_scottb_customHeader');
}
else
{
update_custom_meta($postID, '', '_scottb_customHeader');
}
if ($_POST['scottb_customTitle'])
{
update_custom_meta($postID, $_POST['scottb_customTitle'], '_scottb_customTitle');
}
else
{
update_custom_meta($postID, '', '_scottb_customTitle');
}
}
}
function update_custom_meta($postID, $newvalue, $field_name) {
// To create new meta
if(!get_post_meta($postID, $field_name)){
add_post_meta($postID, $field_name, $newvalue);
}else{
// or to update existing meta
update_post_meta($postID, $field_name, $newvalue);
}
}
theme-development
Scott B.
quelle
quelle
$_POST['scottb_customHeader']
ist immer leer und Sie löschen sie versehentlich. Siecustom_add_save
sollten wahrscheinlich nicht feuern, wenn Sie eine schnelle Bearbeitung durchführen?DOING_AJAX
definiert und wahr ist. Wenn dies der Fall ist, geben Sie die Post-ID wieDOING_AUTOSAVE
derzeit zurück.Antworten:
Fügen Sie dem Post-Edit-Formular zusammen mit Ihren benutzerdefinierten Feldern eine versteckte Flagge hinzu. Etwas wie
Wickeln Sie dann alle Ihre benutzerdefinierten save_post-Inhalte in eine Prüfung für dieses Flag ein. Dann müssen Sie auch nicht mehr nach der Konstante für die automatische Speicherung suchen. Wenn das Flag nicht vorhanden ist, handelt es sich entweder um eine schnelle Bearbeitung oder um eine automatische Speicherung.
quelle
Ich hatte das gleiche Problem. Fügen Sie einfach den folgenden Code am Anfang der
save_post
Rückruffunktion für Aktions-Hooks hinzu (die Funktion zum Speichern der benutzerdefinierten Daten).Was es tatsächlich tut: Es prüft, ob das schnelle Speichern
wp_nonce_field
vorhanden ist undreturn
ob dies der Fall ist. Es ist nicht erforderlich, ein zusätzliches ausgeblendetes Feld im Formular zu erstellen.quelle
Die Frage ist ziemlich alt, aber ich denke, dass das Problem immer noch besteht.
Um ehrlich zu sein, gibt es hier keine gute Antwort, weil es nichts mit Sicherheit zu tun hat. Sie speichern Daten in der Datenbank, ohne deren Quelle zu überprüfen ...
Sie sollten nonce verwenden, um die Datenquelle zu überprüfen. Dank dieser Funktion werden sie von QuickEdit nicht überschrieben (oder gelöscht). WordPress gibt Ihnen Utils dafür
Fügen Sie Ihrem Formular hinzu:
Und dann zu Beginn Ihrer Speicherfunktion:
Sie sollten dies für jeden benutzerdefinierten Beitrag tun.
quelle
Was passiert ist: Die neue Aktion für
'save_post'
ist nicht dafür ausgestattet, die neuen Daten zu verarbeiten, die Sie in Ihren benutzerdefinierten Feldern haben. Wenn der Sicherungsbeitrag ausgeführt wird, fehlen alle benutzerdefinierten $ _POST-Felddaten, und die Feldwerte werden gelöscht, sodass Sie nichts mehr haben.FIX:
Wo immer dies der
add_action('save_post','your_new_action');
Fall ist, können Sie dafür sorgen, dass es frühzeitig zurückkehrt, wenn Sie sich auf dem Bildschirm "Bearbeiten" befinden (wo die schnellen Änderungen erfolgen):Oder Sie können überprüfen, ob die Aktion $ _POST ein Inline-Save ist (der Aktionsname der Schnellbearbeitung), und danach nichts mehr ausführen, um Ihre benutzerdefinierten Feldwerte beizubehalten:
Ich muss vielleicht noch mehr ausarbeiten, wenn Sie nicht sicher sind, wo Sie diese Schnipsel ablegen sollen. Aber ich hoffe, es hilft jemandem mit ähnlichen Problemen.
quelle
Das Problem hierbei ist, dass WP sieht, dass Ihre Felder nicht festgelegt sind, und Sie WP anweisen, sie zu löschen. Löschen Sie es nicht, wenn das Feld nicht vorhanden ist. Löschen Sie es, wenn das Feld vorhanden, aber leer ist.
quelle
$meta_value (mixed) (required) The new value of the custom field. A passed array will be serialized into a string.(this should be raw as opposed to sanitized for database queries)
codex.wordpress.org/Function_Reference/update_post_metaupdate_metadata()
unter der Haube, die Funktion , dass Sorgen über Hygienisierung istsanitize_meta()
. Es ist ein Filter und könnte abgemeldet werden. Entweder versuchen Sie sicherzustellen, dass Sie Ihren eigenen Rückruf anhängen, oder Sie vertrauen ihm einfach nicht.var_dump( $GLOBALS['wp_filter']['sanitize_meta'] );
an der entsprechenden Stelle im Code nachsehen, was angehängt ist und was was tut.