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.
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' ) );
}
}
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!
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.
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;
}
}
}