Comment puis-je modifier les données de publication avant qu'elles ne soient enregistrées?

19

J'ai un plugin et je voudrais être en mesure d'exécuter le contenu du post via certains filtres avant qu'il ne soit enregistré dans la base de données. En regardant l' api du plugin , je vois que deux crochets qui semblent être utiles:

save_post
wp_insert_post

Le seul problème est qu'il save_postn'a pas besoin de renvoyer de variable, donc je ne sais pas comment filtrer le contenu et wp_insert_postsemble documenté.

Je voudrais faire quelque chose comme ça:

add_action('whatever_hook_name','my_function');

function my_function($post_content){
    return $post_content.' <br> This post was saved on '.time();
}

Je vais faire quelque chose de plus utile que d'ajouter un horodatage, à savoir exécuter des filtres regex, mais c'est le type général de filtre / action que j'essaie d'ajouter.

Mise à jour

Veuillez noter que je souhaite intercepter les données sur le chemin de leur enregistrement dans la base de données - pas quand elles sont affichées dans la publication (par exemple: pas en ajoutant un filtre à the_content)

cwd
la source
Remarque: vous avez une mauvaise conception :-) 1. chaque fois que le message serait enregistré, cette chaîne serait ajoutée. (si vous ne supprimez pas le précédent, vous obtenez de "est beaucoup This post was...« s 2. données telles celle - ci doit être stocké en tant que valeur de méta du poste :-) BTW: save_postest appelée après les données ont été enregistrées, donc après ce a été enregistré dans la base de données (pas ce que vous voulez).
jave.web

Réponses:

29

Le filtre wp_insert_post_data peut le faire:

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

function filter_post_data( $data , $postarr ) {
    // Change post title
    $data['post_title'] .= '_suffix';
    return $data;
}
Anh Tran
la source
2
m'a fait avancer dans la bonne direction, merci. je pense que vous devez réellement utiliser add_actionau lieu de add_filter. aussi votre wpse35931_filter_post_dataet filter_handlersont incongruents ...
cwd
1
C'est définitivement un filtre. Bien que les filtres et les actions soient basés sur la même fonctionnalité qui permet un certain croisement. Si vous utilisez cela comme une action, cependant, vous ne pourrez pas renvoyer les données qui supprimeraient le point entier. Vous souhaitez FILTRER les données, puis les renvoyer.
Jake
2
wp_insert_post_datafonctionne, mais est un peu surpuissant pour ce que OP (et peut-être d'autres) veulent accomplir. Une option plus simple dans cette situation est content_save_prerecommandée par @drzaus.
rinogo
1
wp_insert_post_data
Documents du
Ce hook est-il appelé chaque fois que vous a) appelez manuellement wp_insert_post () dans, par exemple, functions.php de votre thème pour insérer / mettre à jour une publication OU b) chaque fois qu'une publication est enregistrée par tous les moyens possibles (par exemple via le backend, via le frontend , d'une manière ou d'une autre ...)?
Vadim H
2

Vous pouvez également vérifier le crochet pre_post_update

add_action('pre_post_update', 'before_data_is_saved_function');

function before_data_is_saved_function($post_id) {

}
user28231
la source
1

Ajoutez le code suivant au thème actif pour remplacer <shell>avec [shell]avant d' enregistrer:

 add_filter('content_save_pre', 'my_sanitize_content', 10, 1);
 function my_sanitize_content($value) {
   return str_replace('<shell>', '[shell]', $value);
 }
Suyash Jain
la source
0

Si vous souhaitez simplement ajouter quelque chose de similaire à la fin de tous les messages, je vous suggère d'utiliser le the_contentfiltre.

function append_to_content( $content ) {
    global $post;
    return $content.'<br />This post was saved on '.$post->post_date;
}
add_filter( 'the_content', 'append_to_content' );
Joshua Abenazer
la source
Merci, mais je souhaite en fait modifier les données avant de les enregistrer dans la base de données.
cwd