Como impedir que uma postagem seja excluída?

8

Para problemas de auditoria, quero apenas que uma postagem possa ser lixeira, mas não excluída - para todos os usuários.

Então, eu tenho um plugin como

add_action('before_delete_post', function($id) {
        wp_die(0);
    });

Mas parece que nem todas as ações de exclusão são ajax; portanto, será exibida uma tela preta com uma página de erro com o resultado "0"

Em termos de recursos, o código acima está ok, mas existe alguma maneira melhor?

Ioga
fonte

Respostas:

9

Não deixe a ação morrer, basta fazer um redirecionamento (para onde você quiser):

function wpse_92155_before_delete_post() {
    wp_redirect(admin_url('edit.php'));
    exit();
} // function wpse_92155_before_delete_post
add_action('before_delete_post', 'wpse_92155_before_delete_post', 1);
tfrommen
fonte
Qui velho, eu sei, mas como isso funciona com chamadas AJAX e solicitações XML-RPC? Não acho que, nesses casos, o redirecionamento seja a solução certa.
Andrea Sciamanna
5

Eu usaria o gancho before_delete_postcomo a última camada de proteção contra exclusão (usando a solução do @ tf e qual é a resposta correta).

E primeiro remova as opções "Excluir" da vista. A seguir, oculta o botão Ações em massa e o botão Esvaziar lixo , e remove a ação da linha Excluir permanentemente .

antes

Com este código:

add_action( 'admin_head-edit.php', 'hide_delete_css_wpse_92155' );
add_filter( 'post_row_actions', 'hide_row_action_wpse_92155', 10, 2 );
add_filter( 'page_row_actions', 'hide_row_action_wpse_92155', 10, 2 );

function hide_delete_css_wpse_92155()
{
    if( isset( $_REQUEST['post_status'] ) && 'trash' == $_REQUEST['post_status'] ) 
    {
        echo "<style>
            .alignleft.actions:first-child, #delete_all {
                display: none;
            }
            </style>";
    }
}

function hide_row_action_wpse_92155( $actions, $post ) 
{
    if( isset( $_REQUEST['post_status'] ) && 'trash' == $_REQUEST['post_status'] ) 
        unset( $actions['delete'] );

    return $actions; 
}

Este é o resultado:

depois de

Nota de interesse

Não há gancho cpt_row_actions. Os ganchos page_row_actionse post_row_actionssão aplicados se o tipo de postagem for hierárquico ou não , respectivamente.

brasofilo
fonte
Mkay. +1 para você e para @tf. Eu não pude aprovar seu discurso único antes, porque mais informações pendentes só poderiam ter avaliado sua qualidade através de mais pesquisas sobre o assunto. Ainda outra resposta completamente contextualizada.
Johannes Pille 25/03