Por que publicar_ {custom-post-type} dispara na atualização?

2

Estou tentando disparar duas ações diferentes para publicar e atualizar. Nenhum dos dois deve disparar ao mesmo tempo.

O problema é que publish_pm_task está sendo acionado na atualização e save_post nunca está sendo demitido? Vê alguma coisa errada com isso?

<?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');

}
    
por developdaly 25.02.2013 / 18:14

1 resposta

7

Primeiro de tudo você tem que entender que quando nós atualizamos um post, wp_update_post function é chamada. Mas, devido a um projeto não ótimo do núcleo do WP, a economia real é processada pela função wp_insert_post . Veja em linha 3006 .

Ok, depois vamos ver o que está dentro da função wp_insert_post . Como você pode ver, na linha 2950 ,% A açãosave_post é chamada toda vez que a função é chamada, sempre que foi chamada diretamente ou pela função wp_update_post . Isso significa que não é adequado determinar se a postagem foi inserida / publicada ou atualizada.

Para encontrar uma melhor ação, vamos dar uma olhada na função wp_transition_post_status , que é quase imediatamente antes de save_post action, veja em linha 2942 . Esta função faz três ações transition_post_status , {$old_status}_to_{$new_status} e {$new_status}_{$post->post_type} , veja em linha 3273 . Aqui temos uma boa ação transition_post_status , que transmite status de post antigo e novo. É isso o que precisamos. Portanto, se o novo status for publish e o status antigo não for publish , a postagem será publicada. E se o novo status for publish e o status antigo for new , a postagem será inserida. E, finalmente, se o novo status for igual ao status antigo, a postagem foi atualizada.

Aqui está seu snippet:

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 .: leia o código do núcleo do WordPress, cada vez que você tiver dúvidas, ele vai te ajudar muito!

    
por Eugene Manuilov 25.02.2013 / 19:26