¿Cómo puedo editar los datos de una entrada antes de que se guarde?

9 dic 2011, 02:41:12
Vistas: 62.1K
Votos: 29

Tengo un plugin y me gustaría poder procesar el contenido de la entrada a través de algunos filtros antes de que se guarde en la base de datos. Mirando la API del plugin, veo dos hooks que parecen que podrían ser útiles:

save_post
wp_insert_post

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

Me gustaría hacer algo como esto:

add_action('whatever_hook_name','my_function');

function my_function($post_content){
    // Devuelve el contenido con una marca de tiempo añadida
    return $post_content.' <br> Esta entrada fue guardada el '.time();
}

Voy a hacer algo más útil que añadir una marca de tiempo, específicamente ejecutar algunos filtros regex, pero este es el tipo general de filtro/acción que estoy tratando de añadir.

Actualización

Por favor, ten en cuenta que quiero interceptar los datos cuando se están guardando en la base de datos - no cuando se están mostrando en la entrada (por ejemplo: No añadiendo un filtro a the_content)

1
Comentarios

Nota: Tienes un mal diseño :-) 1. cada vez que se guarde una publicación, esta cadena se agregará. (si no eliminas la anterior, obtendrás muchos "Esta publicación fue...") 2. datos como este deberían almacenarse como un meta valor de la publicación :-) Por cierto: save_post se llama después de que los datos se han guardado, por lo tanto después de que se guardó en la base de datos (no es lo que quieres).

jave.web jave.web
20 ene 2017 19:56:29
Todas las respuestas a la pregunta 5
6
44

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 ) {
    // Cambiar el título del post
    $data['post_title'] .= '_sufijo';
    return $data;
}
9 dic 2011 16:31:46
Comentarios

me puso en el camino correcto, gracias. Creo que en realidad necesitas usar add_action en lugar de add_filter. Además, tu wpse35931_filter_post_data y filter_handler son incongruentes...

cwd cwd
9 dic 2011 16:38:37

Definitivamente es un filtro. Aunque los filtros y las acciones se basan en la misma funcionalidad que permite cierto cruce. Sin embargo, si usas esto como una acción, no podrás devolver los datos, lo que eliminaría todo el propósito. Quieres FILTRAR los datos y luego devolverlos.

Jake Jake
13 may 2016 18:52:49

wp_insert_post_data funciona, pero es un poco excesivo para lo que OP (y quizás otros) quieren lograr. Una opción más simple en esta situación es content_save_pre como recomendó @drzaus.

rinogo rinogo
17 nov 2016 18:05:36

Documentación para desarrolladores del filtro wp_insert_post_data: https://developer.wordpress.org/reference/hooks/wp_insert_post_data/

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

¿Se llama a este hook cuando: a) llamas manualmente a wp_insert_post() en, por ejemplo, functions.php de tu tema para insertar/actualizar un post O b) cada vez que un post se guarda por cualquier medio posible (ej. a través del backend, a través del frontend, de otra manera...)?

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

¿Es posible cambiar el segundo argumento $postarr? ¿O sea los metadatos del post antes de guardarlos?

Daniel Jeney Daniel Jeney
9 mar 2022 16:46:58
Mostrar los 1 comentarios restantes
0
11

Utiliza el filtro content_save_pre de la misma manera que the_content — la diferencia es que opera cuando un post es guardado, en lugar de cuando se muestra.

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

11 dic 2014 23:42:58
2

También puedes verificar el hook pre_post_update

add_action('pre_post_update', 'funcion_antes_de_guardar_datos');

function funcion_antes_de_guardar_datos($post_id) {

}
17 abr 2018 21:02:58
Comentarios

¿Funciona para la creación de entradas?

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

Según https://developer.wordpress.org/reference/hooks/pre_post_update/, pre_post_update solo se llama en actualizaciones, no en creaciones.

betweenbrain betweenbrain
30 ene 2022 20:26:01
0

Añade el siguiente código al 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);
 }
30 may 2016 15:01:50
1
-1

Si solo deseas agregar algo similar al final de todas las publicaciones, entonces te sugiero que utilices el filtro the_content.

function append_to_content( $content ) {
    global $post;
    return $content.'<br />Esta publicación fue guardada el '.$post->post_date;
}
add_filter( 'the_content', 'append_to_content' );
9 dic 2011 05:50:16
Comentarios

Gracias, pero en realidad quiero editar los datos antes de que se guarden en la base de datos.

cwd cwd
9 dic 2011 16:25:44