¿Cómo puedo editar los datos de la publicación antes de guardarlos?

19

Tengo un complemento y me gustaría poder ejecutar el contenido de la publicación a través de algunos filtros antes de guardarlo en la base de datos. Al mirar la api del complemento , veo que dos ganchos que parecen ser útiles:

save_post
wp_insert_post

El único problema es que parece save_postque no necesita devolver una variable, por lo que no sé cómo filtrar el contenido y wp_insert_postparece documentado.

Me gustaría hacer algo como esto:

add_action('whatever_hook_name','my_function');

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

Voy a hacer algo más útil que agregar una marca de tiempo, es decir, ejecutar algunos filtros de expresiones regulares, pero este es el tipo general de filtro / acción que estoy tratando de agregar.

Actualizar

Tenga en cuenta que quiero interceptar los datos para guardarlos en la base de datos, no cuando se muestran en la publicación (por ejemplo: no agregando un filtro a the_content)

cwd
fuente
Nota: Tiene un diseño incorrecto :-) 1. cada vez que se guarda una publicación, se agrega esta cadena. (si no elimina el anterior, obtendrá una gran cantidad de " This post was..." s 2. datos como este debe almacenarse como un metavalor de la publicación :-) BTW: save_postse llama después de guardar los datos, por lo tanto, después fue guardado en la base de datos (no es lo que quieres).
jave.web

Respuestas:

29

El filtro wp_insert_post_data puede hacer eso:

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
fuente
2
me hizo ir en la dirección correcta, gracias. Creo que en realidad necesitas usar en add_actionlugar de add_filter. también tu wpse35931_filter_post_datay filter_handlereres incongruente ...
cwd
1
Definitivamente es un filtro. Aunque los filtros y las acciones se basan en la misma funcionalidad que permite algunos cruces. Sin embargo, si usa esto como una acción, no podrá devolver los datos que eliminarían todo el punto. Desea filtrar los datos y luego devolverlos.
Jake
2
wp_insert_post_datafunciona, pero está un poco abrumado por lo que OP (y quizás otros) quieren lograr. Una opción más simple en esta situación es la content_save_prerecomendada por @drzaus.
rinogo
1
wp_insert_post_data
Documentos del
¿Se llama a este gancho cada vez que a) llama manualmente wp_insert_post () en, por ejemplo, funciones.php de su tema para insertar / actualizar una publicación O b) cada vez que una publicación se guarda por cualquier medio posible (por ejemplo, a través del backend, a través de la interfaz , de alguna otra manera ...)?
Vadim H
2

También puedes verificar el gancho pre_post_update

add_action('pre_post_update', 'before_data_is_saved_function');

function before_data_is_saved_function($post_id) {

}
usuario28231
fuente
1

Agregue el código siguiente para el tema activo para reemplazar <shell>con [shell]antes de guardar:

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

Si solo desea agregar algo similar al final de todas las publicaciones, le sugiero que use el 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' );
Joshua Abenazer
fuente
Gracias, pero realmente quiero editar los datos antes de guardarlos en la base de datos.
cwd