Sorry wenn dies hier schon beantwortet ist. Ich sah mich um und konnte keine Antworten auf meine Frage finden, also dachte ich, ich würde meine eigenen posten.
Ich erstelle ein Plugin für einen Kunden, das Kundenfeedback zu einem kürzlich abgeschlossenen Projekt sammelt.
Der Administrator würde das System verwenden, um dem Kunden eine "Eingabeaufforderung" zu senden, in der er ihn um sein Feedback mit einem Link zu einem Formular auf der Website bittet.
Ich habe einen benutzerdefinierten Beitragstyp mit dem Namen "customer_prompts" erstellt, der nur ein Titelfeld und einige benutzerdefinierte Felder enthält, die in einer benutzerdefinierten Datenbanktabelle gespeichert sind, keine Post-Meta-Felder.
Unten ist mein Code für die Aktion save_post. Es scheint, dass wenn ich auf "Veröffentlichen" klicke, die Aktion "save_post" nicht ausgelöst wird und nur der Titelwert in wp_posts gespeichert wird.
add_action('save_post', 'save_Prompt');
function save_Prompt($post_id){
$post = get_post($post_id);
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( 'customer_Prompt' == $_POST['post_type'] )
{
if ( !current_user_can( 'edit_page', $post_id ) )
return;
}
else
{
if ( !current_user_can( 'edit_post', $post_id ) )
return;
}
global $wpdb;
$Prompt_id = com_create_guid();
$customer_feedback_name = $_POST['_sdg_customer_feedback_name'];
$customer_feedback_email = $_POST['_sdg_customer_feedback_email'];
$salesperson = $_POST['_sdg_salesperson'];
$values = array(
'id' => $Prompt_id,
'sdg_customer_name' => $customer_feedback_name,
'sdg_customer_email' => $customer_feedback_email,
'sdg_salesperson' => $salesperson,
'sdg_post_id' => $post->id
);
$insert = $wpdb->insert($table_name, $values);
if($insert) {
mail($customer_feedback_email, 'hello', 'hello');
}
}
Jede Hilfe wäre sehr dankbar, da ich nicht herausfinden kann, was hier vor sich geht.
Danke, Jamie.
Die Aktion "save_post" wird nur aufgerufen, wenn wir tatsächlich etwas in der Postseitenform geändert haben. Wenn wir nur die Update-Taste drücken, ohne etwas zu ändern, wird die Aktion "save_post" nicht aufgerufen.
Dies ist wichtig, wenn wir einen benutzerdefinierten Beitragstyp bearbeiten, für den benutzerdefinierte Metafelder vorhanden waren. Wenn wir uns auf die Aktion "save_post" verlassen und nur die Inhalte in unseren benutzerdefinierten Meta-Boxen ändern, passiert nichts.
Die Lösung besteht darin, den Aktions-Hook "pre_post_update" anstelle von "save_post" zu verwenden.
http://wordpress.org/support/topic/save_post-not-working-getting-called#post-2335557
edit Haben Sie versucht, print_r('hello world'); die();
nach function save_Prompt($post_id){
zu setzen, um sicherzustellen, dass die Funktion tatsächlich vom Aktions-Hook erfasst wird?/bearbeiten
Einige Probleme könnten im Spiel sein:
1: Ihr global wpdb
muss ganz oben in Ihrer Funktion stehen, vor all Ihren if-bedingten Anweisungen.
2: Ihre $_POST
-Variablen sollten Bedingungen von if(isset($_POST['food'))
aufweisen, um zu überprüfen, ob die zu sendenden Daten tatsächlich gesetzt sind, bevor Sie Ihre Funktion erreichen. Andernfalls wird möglicherweise ein schwerwiegender Fehler verursacht, sodass die Daten nicht in die Datenbank eingegeben werden.
3: Probieren Sie global $post
oben in der Funktion aus. Anschließend können Sie die Variablen des Posts wie $post->post_type
über die Variable $post
als Objekt aufrufen.
4: Fügen Sie $wpdb->print_errors; die();
nach $insert = $wpdb->insert($table_name, $values);
hinzu, falls Ihre DB-Abfrage nicht korrekt ist.
Hoffentlich sollte einer von denen Ihr Problem beheben.
ich denke, der var_dump in add_action ('save_post', Callback-Funktion wird nicht angezeigt!
hinzufügen
$fp = fopen('c:\data.txt', 'w');
fwrite($fp, print_r($post_id, true));
fclose($fp);
und überprüfe ob 'data.txt' existiert, ja es ist wahr durch save_post.
:)
Das ist mir passiert. Es stellte sich heraus, dass ich ein Seitenvorlagen-Set (ein Post-Meta-Wert für _wp_page_template
) für eine Vorlage hatte, die es nach einem Themenwechsel nicht mehr gab. Dieses Stück Code in wp-includes/post.php
:
if ( ! empty( $postarr['page_template'] ) ) {
$post->page_template = $postarr['page_template'];
$page_templates = wp_get_theme()->get_page_templates( $post );
if ( 'default' != $postarr['page_template'] && ! isset( $page_templates[ $postarr['page_template'] ] ) ) {
if ( $wp_error ) {
return new WP_Error( 'invalid_page_template', __( 'Invalid page template.' ) );
}
...
bricht ab, bevor save_post
ausgelöst wird.
Ich hatte genau dieses Problem und dachte, ich würde die möglichen Antworten ergänzen, um jemandem Zeit zu sparen. Es war ein sehr einfaches Problem, das mich Tage gekostet hat, um es zu identifizieren (ich bin im Moment ein bisschen nervös - und fühle mich ein bisschen albern) ...
Es stellte sich heraus, dass ein Metabox-Formular, das generiert wurde, ein "Aktions" -Feld enthielt, das das "Aktions" -Feld des in WordPress generierten Formulars überschrieb. Das Formular wurde nur für einen benutzerdefinierten Beitrag verwendet und daher wurde die falsche Aktion übergeben zu WordPress auf POST zu ' wp-admin/post.php ' und es endete durch den Standard-Handler (am Ende der switch-Anweisung) behandelt.
Ein weiterer Nebeneffekt war, dass WordPress beim Aktualisieren oder Veröffentlichen zum integrierten Post-Index umgeleitet wurde, anstatt direkt zum bearbeiteten Post.
Die Lösung bestand darin, das verborgene Formularelement 'action' für die Metabox zu entfernen.
Ich hoffe das hilft jemandem da draußen ...
Zunächst einmal würde ich vorschlagen, Ihre WordPress-Site so einzurichten, dass sie leicht zu debuggen ist. Http://codex.wordpress.org/Debugging_in_WordPress
Auf diese Weise ist es einfach zu see stuff;)
Ich glaube, Sie müssen es für Action Hook wie folgt einbinden:
add_action('save_post', 'save_Prompt', 10, 2);
function save_Prompt( $post_id, $post ){
//do whatever
}
der Hook save_post
übergibt 2 Argumente.