Come posso modificare i dati di un post prima che venga salvato?

9 dic 2011, 02:41:12
Visualizzazioni: 62.1K
Voti: 29

Ho un plugin e vorrei poter eseguire il contenuto del post attraverso alcuni filtri prima che venga salvato nel database. Guardando le API del plugin, vedo due hook che sembrano poter essere utili:

save_post
wp_insert_post

Il problema è che sembra che save_post non necessiti di restituire una variabile, quindi non so come filtrare il contenuto, e wp_insert_post sembra documentato.

Vorrei fare qualcosa del genere:

add_action('whatever_hook_name','my_function');

function my_function($post_content){
    return $post_content.' <br> Questo post è stato salvato il '.time();
}

Ho intenzione di fare qualcosa di più utile che aggiungere un timestamp, nello specifico eseguire alcuni filtri regex, ma questo è il tipo generale di filtro/azione che sto cercando di aggiungere.

Aggiornamento

Si noti che voglio intercettare i dati mentre stanno per essere salvati nel database - non quando vengono visualizzati nel post (ad esempio: Non aggiungendo un filtro a the_content)

1
Commenti

Nota: Hai un design sbagliato :-) 1. ogni volta che il post viene salvato, questa stringa verrà aggiunta. (se non elimini quella precedente, otterrai molti "Questo post è stato...") 2. dati come questo dovrebbero essere memorizzati come meta valore del post :-) BTW: save_post viene chiamato dopo che i dati sono stati salvati, quindi dopo che è stato salvato nel database (non quello che vuoi).

jave.web jave.web
20 gen 2017 19:56:29
Tutte le risposte alla domanda 5
6
44

Il filtro wp_insert_post_data può fare questo:

add_filter( 'wp_insert_post_data' , 'filter_post_data' , '99', 2 );

function filter_post_data( $data , $postarr ) {
    // Modifica il titolo del post
    $data['post_title'] .= '_suffisso';
    return $data;
}
9 dic 2011 16:31:46
Commenti

mi ha indirizzato nella direzione giusta, grazie. penso però che in realtà tu debba usare add_action invece di add_filter. inoltre i tuoi wpse35931_filter_post_data e filter_handler sono incongruenti...

cwd cwd
9 dic 2011 16:38:37

È sicuramente un filter. Anche se filter e action sono basati sulla stessa funzionalità che permette un certo interscambio. Tuttavia, se usi questo come action, non sarai in grado di restituire i dati, il che eliminerebbe lo scopo principale. Vuoi FILTRARE i dati e poi restituirli.

Jake Jake
13 mag 2016 18:52:49

wp_insert_post_data funziona, ma è un po' eccessivo per quello che OP (e forse altri) vogliono ottenere. Un'opzione più semplice in questo caso è content_save_pre come consigliato da @drzaus.

rinogo rinogo
17 nov 2016 18:05:36

Documentazione per sviluppatori sul filtro wp_insert_post_data: https://developer.wordpress.org/reference/hooks/wp_insert_post_data/

jave.web jave.web
20 gen 2017 19:58:33

Questo hook viene chiamato quando: a) si chiama manualmente wp_insert_post() in, ad esempio, functions.php del tuo tema per inserire/aggiornare un post OPPURE b) ogni volta che un post viene salvato con qualsiasi mezzo possibile (es. tramite backend, tramite frontend, o in altro modo...)?

Vadim H Vadim H
25 lug 2018 11:27:16

È possibile modificare il secondo argomento $postarr? Quindi i metadati del post prima di salvarli?

Daniel Jeney Daniel Jeney
9 mar 2022 16:46:58
Mostra i restanti 1 commenti
0
11

Utilizza il filtro content_save_pre esattamente come the_content -- la differenza è che opera quando un articolo viene salvato, anziché quando viene visualizzato.

http://codex.wordpress.org/Plugin_API/Filter_Reference/content_save_pre

11 dic 2014 23:42:58
2

Puoi anche verificare l'hook pre_post_update

add_action('pre_post_update', 'before_data_is_saved_function');

function before_data_is_saved_function($post_id) {

}
17 apr 2018 21:02:58
Commenti

Funziona per la creazione di post?

Jian Chen Jian Chen
14 mag 2020 05:35:28

Secondo https://developer.wordpress.org/reference/hooks/pre_post_update/, pre_post_update viene chiamato solo durante l'aggiornamento, non durante la creazione.

betweenbrain betweenbrain
30 gen 2022 20:26:01
0

Aggiungi il seguente codice al tema attivo per sostituire <shell> con [shell] prima del salvataggio:

 add_filter('content_save_pre', 'my_sanitize_content', 10, 1);
 function my_sanitize_content($value) {
   return str_replace('<shell>', '[shell]', $value);
 }
30 mag 2016 15:01:50
1
-1

Se vuoi semplicemente aggiungere qualcosa di simile alla fine di tutti i post, allora ti suggerisco di utilizzare il filtro the_content.

function append_to_content( $content ) {
    global $post;
    return $content.'<br />Questo post è stato salvato il '.$post->post_date;
}
add_filter( 'the_content', 'append_to_content' );
9 dic 2011 05:50:16
Commenti

Grazie, ma in realtà vorrei modificare i dati prima che vengano salvati nel database.

cwd cwd
9 dic 2011 16:25:44