Añadir un valor meta al contenido del post en WordPress durante save_post

8 ene 2011, 05:12:02
Vistas: 1.8K
Votos: 2

El problema parece bastante directo: Cuando se dispara la acción save_post, me gustaría añadir el valor de una clave meta al final del post_content si no se encuentra ya dentro del post mismo.

He intentado hacer una llamada a wp_update_post() desde dentro de una función vinculada a save_post, pero como muchos de ustedes objetarán inmediatamente, wp_update_post() contiene do_action('save_post') y por lo tanto crea un bucle infinito.

¿Qué otra forma (usando la API) existe para actualizar el contenido de un post basado en sus valores personalizados una vez que el post ha sido guardado/editado sin invocar un bucle infinito aterrador?

2
Comentarios

¿Has intentado engancharte al filtro wp_insert_post_data? (A pesar del nombre, se ejecuta tanto durante inserciones como actualizaciones.)

BoltClock BoltClock
8 ene 2011 05:25:22

@BoltClock Esa era la ruta que había empezado a explorar justo después de publicar esta pregunta - me he topado con un ejemplo funcional que sin duda podría mejorarse. Lo compartiré abajo.

Sampson Sampson
8 ene 2011 07:17:32
Todas las respuestas a la pregunta 1
2

La solución inicial que he encontrado es conectar un filtro a una acción como wp_insert_post_data y extraer otra información de la publicación del objeto global $post.

// Conectamos nuestro filtro a la acción wp_insert_post_data
add_filter( 'wp_insert_post_data', 'my_appender' );
function my_appender( $content ) {
  // Hacer que el $post global esté disponible en el ámbito
  global $post;
  // Obtener el valor meta de la clave meta 'key_name'
  $meta_value = get_post_meta( $post->ID, 'key_name', TRUE );
  // Si el valor no está en el contenido, añadirlo al final
  if ( stristr( $content['post_content'], $meta_value ) === FALSE )
    $content['post_content'] .= $meta_value;
  // Devolver el contenido filtrado
  return $content;
}

Estoy seguro de que esto podría mejorarse.

Referencias

  1. add_filter() - "Los filtros son los hooks que WordPress lanza..."
  2. wp_insert_post_data - "Un hook de filtro llamado por la función wp_insert_post..."
  3. global keyword - "El ámbito de una variable es el contexto dentro del cual se define..."
  4. get_post_meta() - "Esta función devuelve los valores de los campos personalizados..."
  5. stristr() - "Encuentra la primera ocurrencia de una cadena (sin distinguir mayúsculas y minúsculas)..."
8 ene 2011 07:25:44
Comentarios

Me parece razonable. Supongo que cómo implementes la verificación dependería de qué es exactamente ese valor de post meta.

BoltClock BoltClock
8 ene 2011 07:40:33

@BoltClock Correcto. He mantenido este ejemplo deliberadamente bastante simple. Mi versión de producción tiene todos los controles y balances necesarios implementados.

Sampson Sampson
8 ene 2011 07:42:58