Comment empêcher la suppression d'un article?


8

Pour les problèmes d'audit, je veux seulement qu'un article puisse être mis à la corbeille, mais pas supprimé - pour tous les utilisateurs.

J'ai donc un plugin comme

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

Mais il semble que toutes les actions de suppression ne soient pas ajax, il affichera donc un écran noir avec retour d'une page d'erreur avec le résultat "0"

En ce qui concerne les fonctionnalités, le code ci-dessus est correct, mais existe-t-il une meilleure façon?

Réponses:


9

Ne laissez pas l'action mourir, faites simplement une redirection (vers l'endroit où vous le souhaitez):

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

Qui vieux, je sais, mais comment cela fonctionne-t-il avec les appels AJAX et les requêtes XML-RPC? Je ne pense pas que dans ces cas, la redirection soit la bonne solution.
Andrea Sciamanna

5

J'utiliserais le crochet before_delete_postcomme dernière couche de protection contre la suppression (en utilisant la solution de @ tf, et qui est la bonne réponse).

Et supprimez d'abord les options "Supprimer" de la vue. Ce qui suit masque les actions groupées et le bouton Vider la corbeille , et supprime l' action de ligne Supprimer définitivement .

avant

Avec ce code:

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; 
}

Voici le résultat:

après

Note d'intérêt

Il n'y a pas de crochet cpt_row_actions. Les crochets page_row_actionset post_row_actionssont appliqués si le type de message est hiérarchique ou non , respectivement.


Mkay. +1 à vous et à @tf. Je ne pouvais pas voter contre son one-liner avant, car des informations supplémentaires en attente, je n'aurais pu évaluer sa qualité qu'en poursuivant les recherches sur le sujet. Encore une autre réponse bien mise en contexte.
Johannes Pille
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.