mar
19
2012

Problemas con autoguardado de posts con campos personalizados

Cuando creamos un Custom Post Types en WordPress, o bien cuando mediante un plugin añadimos campos personalizados a los posts, utilizamos la acción add_meta_boxes para que al editar o crear nuevos posts nos aparezca un nuevo campo en el formulario y podamos gestionarlo como queramos (podemos añadir campos de texto, listas desplegables etc…)

A continuación podemos usar la acción save_post y publish_post para personalizar la forma en la que guardamos estos campos personalizados.

Hay que tener en cuenta que si tenemos activado el autoguardado de versiones en Worpress y nuestras funciones personalizadas reciben los parámetros vía POST, estos parámetros personalizados NO viaján en el autoguardado y actualizarlos en base de datos sin la correspondiente comprobación puede ser fatal.

Por ejemplo, imaginando que creamos un campo personalizado de tipo checkbox que almacenamos en base de datos con un meta_value con valor “on” cuando está activado y con valor “off” cuando está desactivado. Si el codigo de nuestro save_post es el siguiente:


add_action('save_post', 'my_save_post');

function my_save_post() {
    global $wpdb, $post;
    $post_id=($post_id)?$post_id:$_POST['post_ID'];
    if (!$post_id) return $post;
    $fieldName = 'nombredemicheck';
    if(isset($_POST[$fieldName])) update_post_meta($post_id, $fieldName, $_POST[$fieldName]);
    else update_post_meta($post_id,$fieldName,'off');
}

Este código nos podría dar problemas, ya que en el autoguardado $_POST[$fieldName] no está definido, con lo cual nos iriamos por el lado del update_post_meta($post_id,$fieldName,’off’) lo que implica que cada vez que se haga un autoguardado, estaremos implícitamente actualiazando el valor del check para ese post a ‘off’, o sea desactivándolo aunque estuviera activo.
Para evitar esto basta con comprobar si estamos haciendo un autoguardado, y en caso de que así sea, hacer las acciones necesarias, o en nuestro caso no hacer nada con los campos personalizados:

add_action('save_post', 'my_save_post');

function my_save_post() {
    global $wpdb, $post;
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
           return;
    $post_id=($post_id)?$post_id:$_POST['post_ID'];
    if (!$post_id) return $post;
    $fieldName = 'nombredemicheck';
    if(isset($_POST[$fieldName])) update_post_meta($post_id, $fieldName, $_POST[$fieldName]);
    else update_post_meta($post_id,$fieldName,'off');
}

Deja tu comentario

Publicidad