it-swarm-vi.tech

Ngăn chặn rác/xóa hành động trên các loại bài cụ thể

Chỉnh sửa:

Trong một plugin tôi đang phát triển, tôi cần lưu trữ các khoản thanh toán, IPN và giao dịch cho khách hàng ở cả frontend và backend. Tuy nhiên, tôi lo ngại rằng quản trị viên sẽ sử dụng sức mạnh hành động của mình để xóa các giao dịch hoặc dữ liệu tài chính khỏi trang web có ý nghĩa xấu.

Câu hỏi

Làm cách nào tôi có thể ngăn quản trị viên xóa các khoản thanh toán/dữ liệu tài chính theo cách đảm bảo rằng tôi không cố gắng hạn chế quản trị viên quá nhiều, nhưng cũng lấy thông tin khách hàng và dữ liệu tài chính làm ưu tiên cao. Tôi không hỏi cách tốt hơn để tôi làm điều đó là gì? Nhưng thay vì hỏi cách nào tốt hơn cho cộng đồng WordPress (với tư cách là quản trị viên, với tư cách là khách hàng) khi tôi đang cố gắng tránh các khiếu nại trong tương lai về cách triển khai để thực hiện hành động này.

Những gì tôi hiện đang có

/**
 * 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

Đây là một cách tiếp cận khác sử dụng bộ lọc map_meta_cap được áp dụng trong hàm map_meta_cap() trong phương thức has_cap() của lớp 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 );

trong đó chúng tôi nhắm mục tiêu khả năng xóa_post meta và các loại bài đăng tùy chỉnh paymenttransaction.

Theo như tôi hiểu và lướt qua hàm get_post_type_capabilities() chúng ta không cần đối số map_meta_cap được đặt là đúng, trong cài đặt register_post_type, để nhắm mục tiêu khả năng meta delete_post.

ps: TẠI ĐÂY LÀ MỘT SỐ MÔ TẢ HAY VỀ BỘ LỌC map_meta_cap VÀ CÁC VÍ DỤ HỮU ÍCH CỦA JUSTIN TADLOCK TẠI ĐÂY VÀ TOSCHO TẠI ĐÂY.Tại đây Tôi tìm thấy một ví dụ cũ mà tôi đã quên tôi đã viết, rằng chúng tôi cũng có thể điều chỉnh để tránh rác/xóa trên một số trang và vai trò người dùng. Đây một câu trả lời của TheDeadMedic liên kết đến một câu trả lời của Seamus Leahy về cách tiếp cận register_post_type. Tại đây là một số ví dụ khác trên trang web này. Hy vọng nó giúp!

9
birgire

Một cách tốt hơn để ngăn chặn việc xóa sẽ là vô hiệu hóa khả năng đó cho tất cả các vai trò. Khi bạn đăng ký loại bài đăng của mình 'thanh toán' và 'giao dịch' cũng xác định capability_type có cùng tên với loại bài đăng của bạn. Điều này sẽ cung cấp cho bạn các khả năng read_payment, edit_paymentdelete_payment (tương tự cho giao dịch).

Sau đó, bạn có thể từ chối khả năng này trên các vai trò theo cách này:

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

Luôn luôn cẩn thận vì quản trị viên có thể chỉnh sửa mã trên trang web của bạn, họ vẫn có thể tránh được việc xóa, trừ khi bạn chặn chỉnh sửa mã trong phần phụ trợ và hạn chế quyền truy cập cơ sở dữ liệu và ftp. Ngoài ra đọc thảo luận này về việc nhận tất cả các vai trò có sẵn.

5
cjbj

Tôi đã sử dụng mã này trong một trang web, nơi chúng tôi có thể ẩn chỉnh sửa, rác, xem các nút ngay cả trong trình đơn thả xuống chỉnh sửa hàng loạt,

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