編集する
私が開発しているプラグインでは、フロントエンドとバックエンドの両方で顧客への支払い、IPN、およびトランザクションを保存する必要があります。しかし、私は管理者が悪い意味を持っているサイトから取引や財務データを削除するために彼の行動の力を使用することを心配しています。
管理者があまりにも制限をかけすぎないようにするだけでなく、顧客情報と財務データも優先されるように、管理者が支払いや財務データを削除できないようにするにはどうすればよいですか。私がそれを実行するためのより良い方法は何であるかを尋ねていませんか?しかし、私はこのアクションを実行するために実装された方法に関する今後の苦情を避けようとしているので、WordPressコミュニティにとって(管理者として、顧客として)より良い方法は何かを尋ねます。
私が現在持っているもの
/**
* 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' ) );
}
}
map_meta_cap
クラスのmap_meta_cap()
メソッド(PHP 5.4+)内の has_cap()
関数内に適用されるWP_User
フィルタを使用するもう1つの方法があります。
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 );
ここではdelete_postメタ機能と、payment
およびtransaction
カスタム投稿タイプをターゲットにしています。
map_meta_cap
メタ機能をターゲットとするために、register_post_type
設定で、delete_post
引数をtrueに設定する必要がないことを理解し、 get_post_type_capabilities()
関数を介して読み飛ばす必要があります。
ps:HERE はmap_meta_cap
フィルターの良い説明と、JUSTIN TADLOCK HERE とTOSCHO HEREによる便利な例です。 Here 私は私が書いたのを忘れていた古い例を見つけました、与えられたページとユーザーロールのゴミ箱/削除を避けるために私達はまた調整できることを。こちらregister_post_type
アプローチに関してSeamus Leahyによる 回答 にリンクしているTheDeadMedicによる回答。 Here はこのサイトの他の例です。それが役に立てば幸い!
削除を防ぐためのより良い方法はすべてのロールに対して ケーパビリティ を無効にすることです。 あなたの投稿タイプを登録する 'payment'と 'transaction'もあなたの投稿タイプと同じ名前でcapability_type
を定義します。これはあなたにread_payment
、edit_payment
およびdelete_payment
の能力を与えます(トランザクションについても同じです)。
このようにして、ロールに対するこの機能を拒否することができます。
$wp_roles->remove_cap( 'editor', 'delete_payment' );
$wp_roles->remove_cap( 'admin', 'delete_payment' );
管理者はあなたのサイト上でコードを編集できるので、バックエンドでコード編集をブロックしてftpとデータベースへのアクセスを制限しない限り、彼らはまだ削除を回避することができるでしょう。また、 この議論を読んで すべての利用可能な役割を取得することについて。
私はこのコードをWebサイトで使用しました。一括編集ドロップダウンでも編集、ゴミ箱、表示ボタンを非表示にできます
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;
}
}
}