Vô hiệu hóa plugin cho một nhóm người dùng cụ thể


7

Tôi muốn hủy kích hoạt một plugin cho một người dùng cụ thể. Tôi đang sử dụng đoạn mã sau trong wp-content/plugin-mutệp plugin:

add_filter( 'option_active_plugins', 'bo_disable_apm_plugin' );


    function bo_disable_apm_plugin( $plugins ) {

    global $current_user;

    // Not use advanced page manager for media manager
    if ( is_admin() && in_array( 'media_manager', $current_user->roles ) ) {
      $key = array_search( 'advanced-page-manager/advanced_page_manager.php' , $plugins );
      if ( false !== $key ) {
        unset( $plugins[$key] );
      }
    }
    return $plugins;
}

Tất nhiên, nó không hoạt động. Tôi không hiểu đường đi option_active_plugins. Bằng cách kết xuất dữ liệu, tôi tìm ra mã được thực thi 7 lần.

Ở vòng lặp đầu tiên, người dùng không biết, vì vậy điều kiện không được đáp ứng. Các plugin vẫn được kích hoạt.

Tôi đã thêm một mã phức tạp hơn với ba điều kiện: bỏ đặt plugin nếu người dùng không được đặt, do đó, plugin bị bất hoạt mỗi lần trên vòng lặp đầu tiên. NẾU người dùng được đặt (các vòng tiếp theo), hãy kiểm tra anh ta để đặt / hủy cài đặt plugin cho phù hợp. Cũng không làm việc.

Tôi đã không quản lý để tìm đúng công thức, vì vậy có lẽ tôi đã sai ở đâu đó và nó không thể được thực hiện. Mỗi lần, plugin được kích hoạt hoặc hủy kích hoạt cho tất cả người dùng. Có vẻ như lần lặp đầu tiên là lần lặp lại.

Có cách nào để hủy kích hoạt plugin cho người dùng / nhóm cụ thể không?


Lần đầu tiên tùy chọn được gọi là các plugin hoạt động được tải (chỉ một require_once) vì vậy ngay cả khi các cuộc gọi sau đó, plugin được lọc ra khỏi các tùy chọn, tệp plugin đã được yêu cầu và không tồn tại cách để loại bỏ nó. Vì vậy, có, lần đầu tiên là duy nhất tính. Vấn đề là trong đăng nhập người dùng WordPress được xử lý khá sau khi các plugin được tải và đây là lý do tại sao mã của bạn bị lỗi. Bạn có 2 tùy chọn: buộc người dùng đăng nhập sớm hơn; hoặc loại bỏ các tính năng bổ sung plugin, tức là tôi đoán plugin thêm một số hook, đợi cho đến khi wp_loadedgỡ bỏ tất cả chúng. Plugin sẽ hoạt động nhưng "tắt tiếng".
gmazzap

Cảm ơn bạn đã phản hồi của bạn. Tôi đã hy vọng tránh 'không tìm kiếm' tất cả các tính năng từ plugin (trong trường hợp chúng bổ sung thêm trong bản cập nhật), nhưng ... Bạn có đề xuất cách "buộc đăng nhập sớm hơn" không? Điều đó thậm chí có thể?
Simon

Có lẽ bạn nên đặt bình luận của bạn như một câu trả lời, bạn đã trả lời nó (tiêu cực, nhưng chưa).
Simon

1
Nếu tôi có thời gian hôm nay tôi sẽ trả lời đúng, chỉ ra cách giải quyết vấn đề.
gmazzap

Rất thích có những hiểu biết của bạn.
Simon

Câu trả lời:


5

Tôi nghĩ rằng câu trả lời cho hành động Vô hiệu hóa plugin / plugin này thông qua chủ đề là tốt cho kiến ​​thức cơ bản về cách vô hiệu hóa plugin khỏi mã.

Thích ứng kiến ​​thức đó với nhu cầu của bạn sẽ để lại cho chúng tôi điều này:

add_action('admin_init', 'my_filter_the_plugins');    
function my_filter_the_plugins()
{
    global $current_user;
    if (in_array('media_manager', $current_user->roles)) {
        deactivate_plugins( // deactivate for media_manager
            array(
                '/advanced-page-manager/advanced_page_manager.php'
            ),
            true, // silent mode (no deactivation hooks fired)
            false // network wide
        );
    } else { // activate for those than can use it
        activate_plugins(
            array(
                '/advanced-page-manager/advanced_page_manager.php'
            ),
            '', // redirect url, does not matter (default is '')
            false, // network wise
            true // silent mode (no activation hooks fired)
        );
    }
}

Về cơ bản điều này xảy ra:

Đối với media_managernhóm người dùng, my_filter_the_pluginsvô hiệu hóa ( âm thầm ) advanced-page-managerplugin. Sau đó, chúng tôi cần kích hoạt lại plugin ( âm thầm , một lần nữa) cho những người không có trong media_managernhóm người dùng.


Cảm ơn rât nhiều. Tôi không biết về chức năng tắt plugin. Hãy để tôi kiểm tra điều đó sớm và quay lại đây để trả lời câu hỏi và báo cáo kết quả.
Simon

@Simon Tôi đã kiểm tra mã trên một trang web mà tôi đang làm việc. Đã làm cho tôi.
aifrim

1
Làm thế nào bạn đi với @Simon này? Đừng quên quay lại và cho chúng tôi biết bạn đã đi như thế nào - và chấp nhận câu trả lời này (sử dụng dấu kiểm bên trái) nếu nó giúp bạn. Hiện tại, nó đang xuất hiện trong danh sách 'câu hỏi chưa được trả lời' của chúng tôi :)
Tim Malone

@ AndyMacaulay-Brook bạn đã đọc những bình luận chưa? Nó kích hoạt và hủy kích hoạt chúng một cách im lặng và không kích hoạt các móc kích hoạt & hủy kích hoạt.
aifrim

Doh - xấu của tôi - đã xóa bình luận vì lợi ích của những người không gây hiểu lầm
Andy Macaulay-Brook

0

Về cơ bản, bạn chỉ có thể hủy kích hoạt toàn bộ plugin dựa trên thông tin bạn có tại thời điểm "khởi động" wordpress, về cơ bản là URL và cookie. Bất kỳ kiểm tra nào phức tạp hơn thì có lẽ sẽ phải đợi cho đến khi khởi động xong để có thể được thực thi, tại thời điểm plugin đã được tải và đã quá muộn để "hủy kích hoạt" nó.

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.