L'azione save_post del custom post type non si attiva

10 dic 2012, 18:33:04
Visualizzazioni: 20.9K
Voti: 5

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.

5
Commenti

Funziona se rimuovi i test per il post type e le capacità? Potrebbe esserci un errore logico.

fuxia fuxia
10 dic 2012 18:35:37

Ho provato a commentarli, ma ancora non funziona.

JamieCassidy JamieCassidy
10 dic 2012 18:43:12

prova a usare il primo esempio dal codex1

M-R M-R
10 dic 2012 18:55:34

Ho provato ma ancora non funziona. Sembra che l'azione save_post venga eseguita quando crei un nuovo post dalla barra laterale, ma non viene eseguita quando premi pubblica. Ho provato diversi hook come publish_post e edit_post ma nessuno di questi funziona.

JamieCassidy JamieCassidy
11 dic 2012 11:06:27

Una semplice stampa della variabile globale $_POST e il metodo die(); all'inizio della funzione dovrebbe mostrarti cosa c'è nell'array $_POST per assicurarti che WordPress l'abbia preso correttamente, assicurati anche che l'id del meta sia correttamente inserito nel valore "name" del campo input, se tutto questo è corretto. Dovresti riuscire a trovare rapidamente l'errore.

Stanley Aloh Stanley Aloh
4 dic 2020 12:21:05
Tutte le risposte alla domanda 6
1
15

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

17 mar 2013 00:03:11
Commenti

Questo non funziona se stai cliccando "Anteprima modifiche".

Sam Rueby Sam Rueby
18 gen 2018 23:58:30
3

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.

11 dic 2012 11:38:40
Commenti

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

fuxia fuxia
11 dic 2012 11:53:00

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.

Caleuanhopkins Caleuanhopkins
11 dic 2012 12:04:21

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.

JamieCassidy JamieCassidy
11 dic 2012 14:00:14
0

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.

10 gen 2013 17:53:51
0

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.

22 dic 2017 22:42:27
0

Penso che il var_dump in add_action('save_post', la funzione di callback non venga visualizzato!

Aggiungi

$fp = fopen('c:\data.txt', 'w');
fwrite($fp, print_r($post_id, true));
fclose($fp);

e controlla se 'data.txt' esiste, sì è vero con save_post.

:)

14 ott 2018 22:00:06
0

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...

13 nov 2018 10:51:12