Para problemas de auditoria, só quero que uma postagem seja descartada, 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, então será mostrado uma tela preta com o retorno de uma página de erro com resultado "0"
Recurso sábio o código acima é ok, mas há alguma maneira melhor?
Não deixe a ação morrer, apenas faça 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);
Eu usaria o gancho before_delete_post
como a última camada de proteção contra exclusão (usando a solução de @ tf e qual é a Resposta correta).
E primeiro remova as opções "Excluir" de vista. O seguinte oculta as ações Bulk Actions e Empty Trash e remove a ação Delete Permanently row.
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:
Não há gancho cpt_row_actions
. Os ganchos page_row_actions
e post_row_actions
são aplicados se o tipo de postagem for hierárquico ou não , respectivamente.