Como posso editar dados de postagem antes de serem salvos?


19

Eu tenho um plug-in e gostaria de poder executar o conteúdo da postagem através de alguns filtros antes de ser salvo no banco de dados. Observando a API do plug - in , vejo que dois ganchos que podem parecer úteis:

save_post
wp_insert_post

O único problema é que parece save_postque não precisa retornar uma variável e, portanto, não sei como filtrar o conteúdo e wp_insert_postparece documentado.

Eu gostaria de fazer algo assim:

add_action('whatever_hook_name','my_function');

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

Vou fazer algo mais útil do que acrescentar um carimbo de data / hora, ou seja, executar alguns filtros regex, mas esse é o tipo geral de filtro / ação que estou tentando adicionar.

Atualizar

Observe que desejo interceptar os dados para salvá-los no banco de dados - não quando estiverem sendo exibidos na postagem (por exemplo: não adicionando um filtro a the_content)


Nota: Você tem um design incorreto :-) 1. sempre que a postagem fosse salva, essa sequência seria anexada. (se você não excluir o anterior, você recebe um lote de " This post was..."s 2. Os dados tais um presente devem ser armazenados como um valor meta do post :-) BTW: save_posté chamado após dados foi salvo, portanto, depois que foi salvo no banco de dados (não o que você deseja).
precisa saber é o seguinte

Respostas:


29

O filtro wp_insert_post_data pode fazer isso:

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;
}

2
me fez seguir na direção certa, obrigado. Eu acho que você realmente precisa usar add_actionembora em vez de add_filter. também o seu wpse35931_filter_post_datae filter_handlersão incongruentes ...
cwd

1
É definitivamente um filtro. Embora os filtros e ações sejam baseados na mesma funcionalidade que permite algum crossover. Se você usar isso como uma ação, no entanto, não poderá retornar os dados que removeriam o ponto inteiro. Você deseja filtrar os dados e depois devolvê-los.
Jake

2
wp_insert_post_datafunciona, mas está um pouco sobrecarregado com o que o OP (e talvez outros) deseja realizar. Uma opção mais simples nessa situação é a content_save_prerecomendada por @drzaus.
Rinogo 17/11

1
Documentos do desenvolvedor para o wp_insert_post_datafiltro: developer.wordpress.org/reference/hooks/wp_insert_post_data
jave.web

Esse gancho é chamado sempre que você a) chama manualmente wp_insert_post () em, por exemplo, functions.php do seu tema para inserir / atualizar uma postagem OU b) sempre que uma postagem é salva por qualquer meio possível (por exemplo, através de back-end, através de front-end) , de alguma forma mais ...)?
Vadim H


2

Você também pode verificar o gancho pre_post_update

add_action('pre_post_update', 'before_data_is_saved_function');

function before_data_is_saved_function($post_id) {

}

1

Adicione o seguinte código para o tema ativo para substituir <shell>com [shell]antes de salvar:

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

0

Se você quiser adicionar algo semelhante no final de todas as postagens, sugiro que você use o the_contentfiltro.

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' );

Obrigado, mas eu realmente quero editar os dados antes de serem salvos no banco de dados.
Cwd
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.