Eseguire una funzione quando un articolo viene pubblicato

19 ott 2012, 01:14:54
Visualizzazioni: 21.3K
Voti: 5

Sto cercando di utilizzare questa funzione che ho creato quando un articolo viene pubblicato per la prima volta.

function a_new_post($post){
  $post_id = $post->ID;

  if ( !get_post_meta( $post_id, 'firstpublish', $single = true ) ) {
      // ...esegui il codice una volta
      update_post_meta( $post_id, 'firstpublish', true );
  }
}
add_action( 'draft_to_published', 'a_new_post' );

Non riesco a vedere nulla di sbagliato, ma quando provo a creare alcuni articoli di prova e controllo il database, il campo "firstpublished" non è stato creato.

Qualcuno vede qualcosa di sbagliato?

3
Commenti

non dovresti cambiare l'hook in publish_post. draft_to_publish non viene eseguito in tutti i casi

Mridul Aggarwal Mridul Aggarwal
19 ott 2012 10:40:35

Questa è la cosa più frustrante che abbia mai affrontato in WordPress. Non c'è assolutamente alcun modo per intercettare la pubblicazione e bloccare l'aggiornamento. Nessun modo, in nessun caso.

User User
1 mag 2014 23:53:02
Tutte le risposte alla domanda 2
0
18

L'azione corretta è 'draft_to_publish'.

Per essere sicuri di aver utilizzato lo stato corretto, prova a ottenere un elenco di tutti gli stati dei post registrati (inclusi gli stati personalizzati) con:

<pre><?php print '- ' . implode( "\n- ", array_keys( get_post_stati() ) );?></pre>

Su un'installazione standard dovresti ottenere:

  • publish
  • future
  • draft
  • pending
  • private
  • trash
  • auto-draft
  • inherit

Nota che publish_post viene chiamato ogni volta che modifichi un post pubblicato.

Nota anche che get_post_stati() è uno di quei nomi imprevedibili in WordPress: è semplicemente sbagliato. Il plurale del sostantivo status è statuses in inglese e statūs in latino. :D

Potresti anche agganciarti a 'transition_post_status', a seconda delle tue esigenze. Riceverai il nuovo e il vecchio stato come argomenti, il terzo argomento è l'oggetto post. Questo intercetterà anche future_to_publish, e anche i post che erano stati cestinati e poi ripubblicati (trash_to_publish).

Esempio:

add_action( 'transition_post_status', 'a_new_post', 10, 3 );

function a_new_post( $new_status, $old_status, $post )
{
    if ( 'publish' !== $new_status or 'publish' === $old_status )
        return;

    if ( 'post' !== $post->post_type )
        return; // limita il filtro a un tipo di post specifico

    // fai qualcosa di fantastico
}
19 ott 2012 12:25:18
0

Imposta il meta valore "Tempo del primo salvataggio" in modo facile da applicare la prima volta.

function a_new_post( $post_id, $post, $update ) {
    // Verifica se il meta valore 'firstpublish' non esiste già
    if ( !get_post_meta( $post_id, 'firstpublish', $single = true ) ) {
        // Aggiorna il meta valore 'firstpublish' a true
        update_post_meta( $post_id, 'firstpublish', true );
    }
}
// Aggiunge l'azione al hook 'save_post' con priorità 10 e 3 parametri accettati
add_action( 'save_post', 'a_new_post', 10, 3 );
6 mar 2018 14:31:52