L'azione save_post del custom post type non si attiva
Mi scuso se questa domanda ha già una risposta. Ho cercato ma non ho trovato soluzioni al mio problema, quindi ho deciso di pubblicare la mia domanda.
Sto sviluppando un plugin per un cliente che raccoglie feedback dei clienti su un progetto recentemente completato.
L'amministratore utilizzerebbe il sistema per inviare un "prompt" al cliente chiedendo il suo feedback con un link a un modulo sul sito.
Ho creato un custom post type chiamato "customer_prompts" che ha solo un campo titolo e alcuni campi personalizzati che vengono memorizzati in una tabella del database personalizzata, non in post meta.
Di seguito il mio codice per l'azione save_post. Sembra che quando clicco su pubblica, non attivi l'azione save_post e salvi solo il valore del titolo in wp_posts.
add_action('save_post', 'save_prompt');
function save_prompt($post_id){
$post = get_post($post_id);
// Se è un autosalvataggio, non fare nulla
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
// Verifica il tipo di post e i permessi
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);
// Se l'inserimento è riuscito, invia l'email
if($insert) {
mail($customer_feedback_email, 'hello', 'hello');
}
}
Qualsiasi aiuto sarebbe molto apprezzato poiché non riesco a capire cosa stia succedendo.
Grazie,
Jamie.

L'azione "save_post" viene chiamata solo quando effettivamente cambiamo qualcosa nel modulo della pagina dell'articolo. Se premiamo semplicemente il pulsante di aggiornamento, senza modificare nulla, l'azione "save_post" non viene chiamata.
Questo è importante se stiamo modificando un custom post type dove abbiamo meta box personalizzati. Se ci affidiamo all'azione "save_post" e modifichiamo solo i nostri meta box personalizzati, non accadrà nulla.
La soluzione è utilizzare l'hook di azione "pre_post_update", invece di "save_post"
http://wordpress.org/support/topic/save_post-not-working-getting-called#post-2335557

modifica Hai provato a inserire print_r('hello world'); die();
dopo function save_prompt($post_id){
per assicurarti che la funzione venga effettivamente rilevata dall'hook dell'azione? /modifica
Potrebbero esserci diversi problemi in gioco:
1: Il tuo global wpdb
deve essere all'inizio della tua funzione, prima di tutte le istruzioni condizionali if.
2: Le tue variabili $_POST
dovrebbero avere controlli condizionali come if(isset($_POST['food'))
per verificare se i dati inviati vengono effettivamente impostati prima di raggiungere la tua funzione, altrimenti potrebbero causare un errore fatale, impedendo l'inserimento dei dati nel DB.
3: Prova ad aggiungere global $post
all'inizio della funzione, così potrai accedere alle variabili del post come $post->post_type
come oggetto attraverso la variabile $post
.
4: Aggiungi $wpdb->print_errors; die();
dopo $insert = $wpdb->insert($table_name, $values);
nel caso in cui la tua query al DB sia errata.
Speriamo che una di queste soluzioni risolva il tuo problema.

L'importazione di una variabile globale nello scope della funzione deve avvenire prima del suo utilizzo, ma non necessariamente all'inizio della funzione.

Tuttavia, per le best practices, mi sono imbattuto in diversi casi in cui le globali hanno fallito perché non erano posizionate all'inizio della funzione.

Ho provato a fare echo di qualcosa proprio all'inizio della funzione che appariva in cima alla pagina dopo aver cliccato "Aggiungi nuovo" nella sidebar, ma una volta cliccato pubblica questo scompare come se la funzione non venisse eseguita al click su pubblica.
Ho provato tutti gli altri tuoi suggerimenti ma senza successo. Penso possa essere un caso in cui la funzione non viene proprio eseguita ma non riesco a capire il motivo.

Innanzitutto, suggerirei di configurare il tuo sito WordPress per facilitare il debug http://codex.wordpress.org/Debugging_in_WordPress
In questo modo, è più facile vedere le cose ;)
Per quanto riguarda l'hook di azione, credo che tu debba collegarlo così:
add_action('save_post', 'save_prompt', 10, 2);
function save_prompt( $post_id, $post ){
//fai quello che vuoi
}
l'hook save_post
passa 2 argomenti.

Mi è successo. Si è scoperto che avevo impostato un page-template (un valore post-meta per _wp_page_template
) su un template che non esisteva più, dopo aver cambiato tema. Questo frammento di codice 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', __( 'Template di pagina non valido.' ) );
}
...
interrompe prima di eseguire save_post
.

Ho avuto esattamente lo stesso problema e ho pensato di aggiungere altre potenziali risposte, per aiutare a far risparmiare tempo a qualcuno. Era un problema molto semplice che mi ci sono voluti giorni per identificare (sono un po' più calvo al momento - e mi sento un po' stupido)...
Si è scoperto che un form di metabox che veniva generato conteneva un campo "action" che sovrascriveva il campo "action" del form generato da WordPress - il form veniva utilizzato solo su un custom post e quindi l'azione sbagliata veniva passata a WordPress durante il POST a 'wp-admin/post.php' e finiva per essere gestito dal gestore predefinito (alla fine dell'istruzione switch).
Un altro effetto collaterale era che durante l'aggiornamento o la pubblicazione, WordPress reindirizzava all'indice dei post integrato, invece di tornare direttamente al post modificato.
La soluzione è stata rimuovere l'elemento form nascosto 'action' per il metabox.
Spero che questo aiuti qualcuno là fuori...
