web-dev-qa-db-ja.com

特定の投稿タイプでのゴミ箱削除アクションを防止する

編集する

私が開発しているプラ​​グインでは、フロントエンドとバックエンドの両方で顧客への支払い、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' ) );
    }
}
5
Ahmed Fouad

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:HE​​REmap_meta_capフィルターの良い説明と、JUSTIN TADLOCK HERE とTOSCHO HEREによる便利な例です。 He​​re 私は私が書いたのを忘れていた古い例を見つけました、与えられたページとユーザーロールのゴミ箱/削除を避けるために私達はまた調整できることを。こちらregister_post_typeアプローチに関してSeamus Leahyによる 回答 にリンクしているTheDeadMedicによる回答。 He​​re はこのサイトの他の例です。それが役に立てば幸い!

9
birgire

削除を防ぐためのより良い方法はすべてのロールに対して ケーパビリティ を無効にすることです。 あなたの投稿タイプを登録する 'payment'と 'transaction'もあなたの投稿タイプと同じ名前でcapability_typeを定義します。これはあなたにread_paymentedit_paymentおよびdelete_paymentの能力を与えます(トランザクションについても同じです)。

このようにして、ロールに対するこの機能を拒否することができます。

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

管理者はあなたのサイト上でコードを編集できるので、バックエンドでコード編集をブロックしてftpとデータベースへのアクセスを制限しない限り、彼らはまだ削除を回避することができるでしょう。また、 この議論を読んで すべての利用可能な役割を取得することについて。

5
cjbj

私はこのコードを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;
        }
    }
}
0
Venkatesh Munna