¿Por qué publish_ {custom-post-type} se activa al actualizar?

2

Estoy intentando lanzar dos acciones diferentes tanto en la publicación como en la actualización. Tampoco debe disparar al mismo tiempo.

El problema es que publish_pm_task se está activando en la actualización y save_post nunca se está activando. ¿Ves algo malo con esto?

<?php
// Updated task notification
add_action( 'save_post', 'pm_updated_task_notification' );

// New task notification
add_action( 'publish_pm_task', 'pm_new_task_notification' );

function pm_new_task_notification() {

    error_log('definitely a task');

}

function pm_updated_task_notification( $post_id ) {

    $slug = 'pm_task';

    /* check whether anything should be done */
    $_POST += array("{$slug}_edit_nonce" => '');
    if ($slug != $_POST['post_type']) {
        return;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    if (!wp_verify_nonce($_POST["{$slug}_edit_nonce"], plugin_basename(__FILE__))) {
        return;
    }

    error_log('updated a task');

}
    
pregunta developdaly 25.02.2013 - 18:14

1 respuesta

7

En primer lugar, debe comprender que cuando actualizamos una publicación, se llama a la función wp_update_post . Pero debido a un poco de diseño no óptimo del núcleo WP, el ahorro real se procesa mediante la función wp_insert_post . Véalo en trac en línea 3006 .

Bien, a continuación veamos qué hay dentro de la función wp_insert_post . Como puede ver, en línea 2950 ,% La acción save_post se llama cada vez que se llama a la función, siempre que se haya llamado directamente o mediante la función wp_update_post . Significa que no es apropiado determinar si la publicación ha sido insertada / publicada o actualizada.

Para encontrar una mejor acción, echemos un vistazo a la función wp_transition_post_status que se llama casi justo antes de la acción save_post , véala en línea 2942 . Esta función realiza tres acciones transition_post_status , {$old_status}_to_{$new_status} y {$new_status}_{$post->post_type} , véala en línea 3273 . Aquí tenemos una buena acción transition_post_status , que pasa los estados de publicación antiguos y nuevos. Esto es lo que necesitamos. Entonces, si el nuevo estado es publish y el estado antiguo no es publish , entonces la publicación se publica. Y si el nuevo estado es publish y el estado antiguo es new , entonces la publicación se ha insertado. Y, finalmente, si el nuevo estado es igual al estado anterior, la publicación se acaba de actualizar.

Aquí está tu fragmento:

add_action( 'transition_post_status', 'wpse_transition_post_status', 10, 3 );  

function wpse_transition_post_status( $new_status, $old_status, $post ) {
    if ( $new_status == 'publish' && $old_status == 'new' ) {
        // the post is inserted
    } else if ( $new_status == 'publish' && $old_status != 'publish' ) {
        // the post is published
    } else {
        // the post is updated
    }
}

P.S .: lea el código del núcleo de WordPress, ¡cada vez que tenga dudas, le ayudará mucho!

    
respondido por el Eugene Manuilov 25.02.2013 - 19:26

Lea otras preguntas en las etiquetas