2011-03-25 17 views
5

He desarrollado un plugin de WordPress que necesita realizar un procesamiento adicional cuando se guarda una publicación de un tipo de publicación personalizado.Problema con WordPress "save_post" Acción

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

Lo he implementado y parecía funcionar perfectamente, pero hay un problema menor que me gustaría resolver. Parece que "save_post" también se activa al cargar la página "Crear publicación" por primera vez (es decir, antes de que se ingresen las entradas del usuario y antes de que se presione el botón enviar nuevo/cambios).

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

Aquí es una versión simplificada de mi manejador "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 en realidad se está guardando el puesto?

+1

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

+1

@helgatheviking Permite que otros ganchos realicen su procesamiento con el '$ post_id' correcto. Mi gancho no está fallando, solo quiere controlar cuándo llevar a cabo el procesamiento. El '$ post_id' se pasa de cada gancho a cada gancho por devolución. –

+0

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

Respuesta

17

Tuve el mismo problema y eché un vistazo a la sección correspondiente de post.php. Resulta que se llama a save_post 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 utilicé:

add_action('post_updated', 'some_function'); 

Espero que esto también funcione para usted.

+0

Gracias, esto está muy cerca ahora. ¿Es posible evitar que se dispare cuando la publicación se mueve a la papelera? –

+0

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

+0

+1 Esto realmente me molestaba porque parecía estar creando un conjunto de valores por defecto para todos mis campos, con todas las casillas desactivadas . –

2

Este gancho se ejecuta cada vez que se crea o actualiza una publicación o una publicación, que podría ser de un formulario de importación, edición/publicación, xmlrpc o publicar por correo electrónico. Así que supongo que también se ejecuta cuando se guarda una revisión posterior. Si yo fuera usted, verificaría si se configuró el postID (es el único argumento que debería tener la función hook) y si es una revisión wp_is_post_revision().

+0

'$ post_id' contiene un ID válido y' wp_is_post_revision() 'no parece ser de ayuda. El gancho se ejecuta tan pronto como se selecciona "Agregar nuevo" en la barra lateral de administración. He actualizado mi pregunta original con un código de demostración para ayudar a explicar el problema. Gracias. –

3

El uso del enlace 'post_updated' tiende a ser problemático, particularmente cuando se usan tipos de publicaciones personalizadas. En su lugar, he utilizado 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"; 
    } 

que no quería realizar ninguna acción cuando los artículos fueron enviados a la basura, ya sea.

0

Es posible que desee comprobar si los datos se publican o no.

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