Problema con la acción “save_post” de WordPress

4 minutos de lectura

avatar de usuario
lea hayes

Desarrollé un complemento de WordPress que necesita realizar un procesamiento adicional cuando se guarda una publicación de un tipo de publicación personalizada.

La solución más lógica era utilizar la acción “save_post”. Al ser invocado, el controlador de acciones crea o actualiza un registro de la base de datos en una tabla personalizada (dependiendo de si se hace clic en “Crear publicación” o “Actualizar publicación”).

He implementado esto y parece estar funcionando perfectamente, pero hay un problema menor que me gustaría resolver. Parece que “save_post” también se activa cuando se carga la página “Crear publicación” por primera vez (es decir, antes de ingresar cualquier entrada del usuario y antes de presionar el botón enviar nuevos/cambios).

Esto significa que la tabla de la base de datos personalizada se llena con una fila en blanco para cada nueva publicación que se guarda. También significa que hay una fila en blanco por cada vez que se carga la página Agregar publicación.

Aquí hay una versión simplificada de mi controlador “save_post”:

function do_save_post($post_id) {
    if (get_post_type($post_id) !== 'mycustomtype')
        return $post_id;

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
        return $post_id;

    if (!current_user_can('edit_mycustomtype'))
        return $post_id;

    echo 'This happens when selecting "Add New" from admin sidebar.';
    echo 'Even though post has not been saved or updated.';
    echo 'This should only happen when button on right of editor is clicked.';
}

¿Cómo puedo detectar si la publicación realmente se está guardando?

  • ¿Cuál es el punto de devolver $post_id cuando falla?

    – helgathevikingo

    8 de enero de 2012 a las 13:53

  • @helgatheviking Permite que otros ganchos realicen su procesamiento con el correcto $post_id. Mi gancho no está fallando, solo quiere controlar cuándo realizar el procesamiento. los $post_id se pasa de cada gancho a cada gancho por retorno.

    – Lea Hayes

    8 de enero de 2012 a las 14:15

  • @lea_hayes gracias por la respuesta! No sabía que el $post_id se pasaba de gancho a gancho. No he notado ningún problema con el bloqueo del código si no lo devuelvo.

    – helgathevikingo

    8 de enero de 2012 a las 14:26

Tuve el mismo problema y eché un vistazo a la sección correspondiente de post.php. Resulta que save_post se llama cada vez que se ejecuta post.php, por lo que lo ejecutará en la creación de publicaciones, listas, etc.

En WP 3.1, “post_updated” se llama solo en un evento de guardar/crear en post.php. Así que usé:

add_action('post_updated', 'some_function');

Espero que esto funcione para usted también.

  • Gracias, esto está tan cerca ahora. ¿Es posible evitar que se active cuando la publicación se mueve a la papelera?

    – Lea Hayes

    2 de mayo de 2011 a las 11:24

  • Esto fue fácil para mí en realidad, todo lo que tengo que hacer es if (!isset($_POST['my-extra-data'])) return $post_id;

    – Lea Hayes

    2 de mayo de 2011 a las 11:29

  • +1 Esto realmente me estaba molestando porque parecía estar creando un conjunto de valores predeterminados para todos mis campos, con todas las casillas de verificación desactivadas.

    – Marcus Downing

    16 mayo 2011 a las 14:01

  • Funciona solo en caso de actualización de la publicación. No después de crear la publicación.

    – Fusión

    10 de abril de 2019 a las 16:39

Usar el gancho ‘post_updated’ tiende a ser problemático, particularmente cuando se usan tipos de publicaciones personalizadas. En cambio, usé esto como mi solución:

   function do_save_post($post_id){
        $post = get_post($post_id);
        if($post->post_status == 'trash' or $post->post_status == 'auto-draft'){
                return $post_id;
        }
        echo "do stuff";
    }

Tampoco quería realizar ninguna acción cuando los elementos se enviaban a la papelera.

Este enlace se ejecuta cada vez que se crea o actualiza una publicación o página, lo que podría ser desde una importación, un formulario de edición de publicación/página, xmlrpc o una publicación por correo electrónico. Así que supongo que también se ejecuta cuando se guarda una revisión posterior. Si estuviera en su lugar, verificaría si el postID está configurado (es el único argumento que debe obtener la función de gancho) y si es una revisión wp_is_post_revision().

  • $post_id contiene una identificación válida y wp_is_post_revision() no parece ser de ayuda. El enlace se ejecuta tan pronto como se selecciona “Agregar nuevo” en la barra lateral de administración. He actualizado mi pregunta original con código de demostración para ayudar a elaborar el problema. Gracias.

    – Lea Hayes

    25 de marzo de 2011 a las 17:04

Es posible que desee verificar si los datos realmente se están publicando o no.

if(isset($_POST['post_title'])){
    //do stuff
}

¿Ha sido útil esta solución?