web-dev-qa-db-fra.com

Empêcher l'action Corbeille/Supprimer sur des types de publication spécifiques

Modifier:

Dans un plug-in que je développe, je dois stocker des paiements, des IPN et des transactions pour les clients dans les systèmes frontend et backend. Cependant, je crains que l'administrateur utilise son pouvoir d'action pour supprimer les transactions ou les données financières du site, ce qui a des conséquences néfastes.

Question

Comment puis-je empêcher l'administrateur de supprimer les paiements/données financières de manière à ne pas trop restreindre les administrateurs, mais également à donner la priorité aux informations clients et aux données financières? Je ne demande pas quel est le meilleur moyen pour moi de le faire? Mais plutôt de demander quel est le meilleur moyen pour la communauté WordPress (en tant qu’administration, en tant que client), car j’essaie d’éviter de futures plaintes concernant la manière mise en œuvre de cette action.

Ce que j'ai actuellement

/**
 * Constructor
 */
public function __construct() {

    // Do not allow payments and transactions to be trashed
    add_action( 'wp_trash_post',                            array( $this, 'disable_trash' ) );
    add_action( 'before_delete_post',                       array( $this, 'disable_trash' ) );
}

/**
 * Disable trash
 */
public function disable_trash( $post_id ) {
    global $post_type;

    if ( in_array( $post_type, array( 'payment', 'transaction' ) ) ) {
        wp_die( __( 'You are not allowed to trash payments or transactions.', 'xxx' ) );
    }
}
5
Ahmed Fouad

Voici une autre approche utilisant le filtre map_meta_cap qui est appliqué dans la fonction map_meta_cap() dans la méthode has_cap() de la classe WP_User ( PHP 5.4+ ):

add_filter( 'map_meta_cap', function ( $caps, $cap, $user_id, $args )
{
    // Nothing to do
    if( 'delete_post' !== $cap || empty( $args[0] ) )
        return $caps;

    // Target the payment and transaction post types
    if( in_array( get_post_type( $args[0] ), [ 'payment', 'transaction' ], true ) )
        $caps[] = 'do_not_allow';       

    return $caps;    
}, 10, 4 );

où nous ciblons la capacité delete_post meta et les types de publication personnalisés payment et transaction.

Autant que je sache et parcourant la fonction get_post_type_capabilities() , nous n'avons pas besoin que l'argument map_meta_cap soit défini sur true, dans les paramètres register_post_type, pour cibler la méta-capacité delete_post.

ps: Voici quelques bonnes descriptions du filtre map_meta_cap et des exemples utiles de Justin Tadlock ici et Toscho ici.Ici J'ai trouvé un vieil exemple que j'avais oublié d'écrire et que nous pouvions également ajuster pour éviter la corbeille/supprimer sur certaines pages et certains rôles d'utilisateur. Voici une réponse de TheDeadMedic qui renvoie à une answer de Seamus Leahy concernant l’approche register_post_type. Ici sont quelques exemples sur ce site. J'espère que ça aide!

9
birgire

Un meilleur moyen d'empêcher la suppression serait de désactiver cette capacité pour tous les rôles. Lorsque vous enregistrez vos types de message 'paiement' et 'transaction' définissez également un capability_type portant le même nom que votre type de message. Cela vous donnera les capacités read_payment, edit_payment et delete_payment (idem pour transaction).

Vous pouvez ensuite refuser cette capacité sur les rôles de cette manière:

$wp_roles->remove_cap( 'editor', 'delete_payment' );
$wp_roles->remove_cap( 'admin', 'delete_payment' );

Attention, étant donné que les administrateurs peuvent modifier le code sur votre site, ils pourront toujours contourner la suppression, sauf si vous bloquez la modification du code dans le backend et restreignez l'accès à la base de données et au ftp. Aussi lisez cette discussion pour obtenir tous les rôles disponibles.

5
cjbj

J'ai utilisé ce code dans un site Web, où nous pouvons masquer les boutons de modification, de corbeille, de vue même en bloc,

if(!current_user_can('administrator')) //not an admin
{
    add_filter( 'post_row_actions', 'remove_row_actions', 10, 1 );
    function remove_row_actions( $actions )
    {
        if( get_post_type() === 'post' ) {
            unset( $actions['edit'] );
            unset( $actions['view'] );
            unset( $actions['trash'] );
            unset( $actions['inline hide-if-no-js'] );
        }
        return $actions;
    }
}

if(!current_user_can('administrator'))//not and admin
{
    global $pagenow;
    if ( 'post.php' == $pagenow || 'post-new.php' == $pagenow ) {
        add_action( 'admin_head', 'wpse_125800_custom_publish_box' );
        function wpse_125800_custom_publish_box() {
            $style = '';
            $style .= '<style type="text/css">';
            $style .= '#delete-action, .bulkactions';
            $style .= '{display: none; }';
            $style .= '</style>';

            echo $style;
        }
    }
}
0
Venkatesh Munna