Obtenga valores de campos personalizados en el filtro en wp_insert_post_data

4 minutos de lectura

Hola a todosgracias por leer.


Ambiente :

WordPress + Complemento de campos personalizados avanzados


Problema :

He buscado durante horas y parece que no puedo encontrar la sintaxis correcta para hacer lo siguiente:

Al publicar una nueva publicación, obtenga un valor de campo personalizado para reemplazar automáticamente el título de la publicación por ese valor. Ejemplo: creo una publicación y configuro ’10 a.m.’ en mi campo personalizado ‘hora’. El título de la publicación se reemplaza automáticamente por ’10 am’.


Ejemplo:

Así que estoy agregando un filtro con lo siguiente:

add_filter('wp_insert_post_data', 'change_title') ;

function change_title($data)

{

    $time = XXX ; // How should I get this custom field value ?

    $new_title="Topic created at".$time ;

    $data['post_title'] = $time ;

    return $data;

}

Debe ser muy simple, pero he probado todas las funciones disponibles tanto en WP como en la documentación del complemento. Sería muy agradecido si alguien que pasa por aqui me dio la solucion.

Gracias por adelantado !

Ajuste a la respuesta aceptada de Riadh (se agregaría como un comentario pero aún no tengo suficiente representante):

Como se documenta en el Códice de WordPress wp_update_post incluye el save_post gancho llamando así wp_update_post() dentro de save_post gancho crea un bucle infinito. Para evitar esto, desengancha y vuelve a enganchar tu función así:

add_action('save_post', 'change_title');

function change_title($post_id) {
    $time = get_field('time',$post_id);
    $post_title="Topic created at ". $time;

    // unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'change_title');

    // update the post, which calls save_post again
    wp_update_post(array('ID' => $post_id, 'post_title' => $post_title));

    // re-hook this function
    add_action('save_post', 'change_title');
}    

avatar de usuario
Riadh C.

De hecho, puede acceder a la variable global $_POST para el valor de su campo, pero supongo que puede hacerlo de una manera más limpia usando la acción save_post para actualizar el título de su publicación, por ejemplo:

add_action('save_post', 'change_title');

function change_title($post_id) {
    $time = get_field('time',$post_id);
    $post_title="Topic created at ". $time;

    // unhook this function so it doesn't loop infinitely
    remove_action('save_post', 'change_title');

    // update the post, which calls save_post again
    wp_update_post(array('ID' => $post_id, 'post_title' => $post_title));

    // re-hook this function
    add_action('save_post', 'change_title');
}  

asumiendo que su nombre de campo ACF es “tiempo”.

Editar: actualizó la respuesta según la respuesta de Mark Chitty.

  • Funciona muy bien, muchas gracias! Que yo sepa, si entiendo correctamente su sugerencia, actualicemos la publicación después de que se creó mientras que en la mía estaba tratando de obtener un campo personalizado mientras la publicación aún no se había creado, ¿correcto?

    – maleykith

    12 de febrero de 2014 a las 3:19


  • Esto causará un bucle infinito.

    –Stanley Wang

    14/01/2016 a las 15:52

Puedes probar esto

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

function change_title($data , $postarr){

    $custom_field = 'custom_filed_name';
    $post_id = $postarr['ID'];
    $time = get_post_meta( $post_id, $custom_field, true );

    // Now you have the value, do whatever you want
}

  • Esto no obtiene el campo personalizado para publicaciones recién creadas. Solo funciona cuando se actualiza una publicación existente.

    – tercero

    13 de diciembre de 2015 a las 5:58

  • Sí, no lo hará, save_post es el gancho apropiado para hacer eso 🙂

    – El Alfa

    13 de diciembre de 2015 a las 18:22


avatar de usuario
árbolfiddy

Campos personalizados avanzados crea una “clave de campo” para cada campo personalizado que se crea. Pude hacer referencia a este valor clave al intentar acceder a los campos personalizados. El valor de la clave de campo se puede encontrar al ver la fuente de la página al ver el tipo de publicación dentro de la sección de administración de WordPress.

Buscar data-field-key. Verá un valor similar a data-field-key="field_5847b00820f13" en la fuente de la página. Utilice este valor cuando acceda al valor en el $postarr argumento en el wp_insert_post_data filtrar. Los campos personalizados estarán en una matriz anidada denominada fields dentro de $postarr argumento.

Alternativamente, el valor de la clave de campo se puede ubicar navegando a la opción Campos personalizados avanzados / Exportar desde la sección de administración. Una vez que esté en la página de exportación de Campos personalizados avanzados, seleccione la opción Exportar a PHP y verá el valor en el código PHP resultante.

En el siguiente ejemplo, estoy concatenando dos campos personalizados avanzados y actualizando el post_title en el $data matriz devuelta por la función.

El resultado es que el post_title El valor se guardará en la base de datos a través de la lógica de publicación de guardado incorporada de WordPress.

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

function slb_set_title ($data, $postarr){
  if($data['post_type']==='slb_subscriber'){
    $data['post_title'] = $postarr['fields']['field_5847b00820f13'] .' '.       
    $postarr['fields']['field_5847b03f20f14'];
  }
return $data;
}

¿Ha sido útil esta solución?