¿Cómo evitar que se elimine una publicación?

8

Para el problema de auditoría, solo quiero que una publicación se pueda descartar, pero no eliminar, para todos los usuarios.

Entonces tengo un plugin como

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

Pero parece que no todas las acciones de eliminación son ajax, por lo que se mostrará una pantalla en negro con una página de error con el resultado "0"

En cuanto a las características, el código anterior está bien, pero ¿hay alguna forma mejor?

Yoga
fuente

Respuestas:

9

No dejes que la acción muera, solo haz una redirección (a donde quieras):

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
fuente
Muy antiguo, lo sé, pero ¿cómo funciona esto con llamadas AJAX y solicitudes XML-RPC? No creo que en estos casos, la redirección sea la solución correcta.
Andrea Sciamanna
5

Usaría el gancho before_delete_postcomo la última capa de protección contra la eliminación (usando la solución de @ tf, y cuál es la respuesta correcta).

Y primero elimine las opciones "Eliminar" de la vista. A continuación, se ocultan las acciones en bloque y el botón Vaciar papelera , y se elimina la acción Eliminar fila permanentemente .

antes de

Con 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 es el resultado:

después

Nota de interes

No hay ningún gancho cpt_row_actions. Los ganchos page_row_actionsy post_row_actionsse aplican si el tipo de publicación es jerárquico o no , respectivamente.

brasofilo
fuente
Mkay +1 tanto para usted como para @tf. No pude votar por su frase anterior porque, debido a la información adicional pendiente, solo podría haber evaluado su calidad mediante una investigación adicional sobre el tema. Otra respuesta completamente puesta en contexto.
Johannes Pille