add_role () chỉ chạy một lần?


11

Tôi đã rất ngạc nhiên khi phát hiện ra rằng add_role () sửa đổi cơ sở dữ liệu và thất bại nếu vai trò đã tồn tại. Có hai hàm ý ở đây, một hàm ý nghiêm trọng hơn đầu tiên: 1) nếu bạn đang phát triển và cập nhật mã add_role, trước tiên bạn phải xóa_role () 2) một khi bạn có quyền, bạn không bao giờ phải chạy mã đó lần nữa.

Vì vậy, thông thường tôi đã đặt add_role () của mình trong hook hành động wp_loaded. Và vì tôi đang trong quá trình phát triển, tôi cũng đã thêm remove_role () trước add_role của mình để tôi có thể chắc chắn rằng nếu tôi sửa đổi danh sách mũ của mình, nó sẽ thực sự có hiệu lực.

Nhưng rõ ràng điều này hiện đang được chạy mỗi khi một trang của blog được truy cập. Được rồi, tôi có thể đặt nó trong một hành động chỉ dành cho quản trị viên hoặc tôi có thể tạo một trang plugin có thể trong Người dùng hoặc Công cụ nơi vai trò này có thể được tạo một lần. Tôi đoán tôi đang hy vọng có một giải pháp đơn giản hơn, thanh lịch hơn ngoài kia.

Tôi không tưởng tượng có một loại hành động run_once ở đó?

Hoặc là cách thực hành tốt nhất chỉ để thêm vai trò và sau đó sử dụng add_cap () một loạt các lần? Và thậm chí sau đó tôi tưởng tượng add_cap đang truy cập db.

Chỉ cần suy nghĩ theo cách tốt nhất để giảm truy cập db không cần thiết. Thực hành tốt nhất của bạn là gì?


Tuyệt vời! Cảm ơn câu hỏi này..Chỉ cần thêm remove_role()chức năng trước khi add_role()giúp tôi.
beyt Swarovski

Câu trả lời:


10

Các vai trò và khả năng của người dùng được lưu trong cơ sở dữ liệu vì vậy một khi bạn đã sử dụng add_role()nó được lưu và sau đó tải tiếp theo WordPress sẽ biết vai trò đó giống như các vai trò tích hợp.

Bây giờ nếu bạn nhìn vào hàm add_role()cụ thể hơn ở dòng 141, bạn sẽ thấy rằng nó chỉ lưu vai trò và khả năng trong cơ sở dữ liệu nếu var $use_dbđược đặt thành true (theo mặc định), vì vậy bạn chỉ cần thay đổi nó trước khi bạn gọi add_role()chức năng và vai trò sẽ không được lưu.

thử:

//globalize $wp_roles
global $wp_roles;
//set use_db to flase
$wp_roles->use_db = false;
//then add your role
$wp_roles->add_role( $role, $display_name, $capabilities );

Cập nhật:

Nếu trong môi trường thử nghiệm / phát triển thì tôi không thấy nhược điểm nào, nhưng nếu bạn đang ở trong môi trường sống thì bạn hãy tiết kiệm thời gian để tạo ra vai trò đó mỗi khi tải.

Đối với thực hành tốt nhất hãy chạy một lần, nếu trong một plugin bạn nên sử dụng register_activation_hookvà cho bất kỳ điều gì khác tôi sử dụng một hàm điều kiện tùy chỉnh được thực hiện đơn giản:

function run_once($key){
    $test_case = get_option('run_once');
    if (isset($test_case[$key]) && $test_case[$key]){
        return false;
    }else{
        $test_case[$key] = true;
        update_option('run_once',$test_case);
        return true;
    }
}

**usage:**
if (run_once('add_user_role')){
    //do you stuff and it will only run once
}

Tào lao. Tôi thậm chí còn biết về điều đó từ một số root trước đó về lớp WP_Roles. Bạn có thể nghĩ ra bất kỳ nhược điểm nào để KHÔNG sử dụng cơ sở dữ liệu cho các vai trò không? Và có một thực hành tốt nhất WP để làm một cái gì đó chỉ một lần?
Tom Auger

Cảm ơn đã cập nhật - Tôi thích sự đơn giản của giải pháp update_option
Tom Auger

Không thực sự thỏa mãn nhưng dường như đó là giải pháp tốt nhất 👍
Blackbam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.