Làm cách nào để ngăn chặn một plugin được tải khi thực hiện WP-CLI?


12

Tôi hiện đang sử dụng mã này trong tập tin bổ trợ chính. Nhưng plugin đó không phải của riêng tôi nên tôi muốn có thể nâng cấp nó bình thường mà không cần thêm mã này.

if ( defined( 'WP_CLI' ) && WP_CLI ) {
    exit;
}

Tôi cần phải làm điều này bởi vì plugin này tạo ra lỗi và ngăn wp-cli thực thi chính xác vì vậy tôi không thể vô hiệu hóa plugin với wp-cli, thực hiện các tác vụ của mình và kích hoạt lại nó.

Có cách nào tôi có thể làm một cái gì đó như if x then do not load plugin file xtừ trong một plugin mu không?

Câu trả lời:


12

Một trong những điều đầu tiên WordPress làm để tải plugin là lấy các plugin đang hoạt động như được lưu trong cơ sở dữ liệu:

$active_plugins = (array) get_option( 'active_plugins', array() );

Vì nó sử dụng nên get_option()chúng tôi có thể sử dụng option_active_pluginsbộ lọc để sửa đổi danh sách các plugin đang hoạt động.

function wpse_301282_disable_plugin( $active_plugins ) {
    if ( defined( 'WP_CLI' ) && WP_CLI ) {
        $key = array_search( 'gravityforms/gravityforms.php', $active_plugins );

        if ( $key ) {
            unset( $active_plugins[$key] );
        }
    }

    return $active_plugins;
}
add_filter( 'option_active_plugins', 'wpse_301282_disable_plugin' );

Chỉ cần thay thế gravityforms/gravityforms.phpbằng thư mục và tên tệp của plugin bạn muốn tắt.

Vấn đề ở đây là chúng tôi đang cố gắng ảnh hưởng đến việc tải plugin, vì vậy chúng tôi không thể làm điều đó từ bên trong một plugin, vì đã quá muộn. Trong chủ đề cũng sẽ là quá muộn.

Rất may, WordPress có "Phải sử dụng plugin", đây là những plugin bạn có thể thêm được tải trước đó và riêng biệt với các plugin thông thường và không xuất hiện trong danh sách plugin thông thường.

Tất cả những gì bạn cần làm để thêm mã này vào Plugin Phải sử dụng là tạo một wp-content/mu-pluginsthư mục (nếu nó chưa tồn tại) và tạo một tệp PHP (nó có thể được gọi là bất cứ thứ gì) với mã đó trong đó. Bạn không cần một tiêu đề plugin hoặc bất cứ điều gì khác.

Bây giờ mã đó sẽ được tải trước tất cả các plugin khác khi WordPress tải. Vì bộ lọc của chúng tôi đã sẵn sàng, khi WordPress có danh sách các plugin đang hoạt động để tải plugin bạn muốn tắt sẽ bị lọc khỏi danh sách đó nếu WP-CLI hoạt động.


Có cùng ý tưởng nhưng điều này không hiệu quả. Ít nhất là không trong môi trường địa phương của tôi. Có thể get_option()quay lại sớm khi giá trị được lưu trong quá độ / tương tự và bộ lọc này bị bỏ qua? (Không hoạt động trong hầu hết các trường hợp, chỉ trong màn hình plugin quản trị viên mới thực sự được thực thi)
kero

Hừm. Nhìn vào nguồn và theo như tôi có thể nói lý do duy nhất option_bộ lọc sẽ không được áp dụng là nếu nó không có giá trị và trả về mặc định.
Jacob Peattie

Đó thực sự là trường hợp (không có plugin hoạt động). Tôi không nên giữ môi trường kiểm tra của mình quá sạch sẽ ..
kero

1
Tôi chấp nhận điều này bởi vì trong trường hợp của tôi đó là những gì tôi cần. Mặc dù nói chung, --skip-plugin=xtùy chọn của wp-cli có thể là một cách tốt hơn để làm điều đó.
NextGenTheme

15

Bạn có thể sử dụng skip-pluginstùy chọn trong WP-CLI để không tải từng plugin khi sử dụng WP-CLI.

Bạn có thể sử dụng nó trong lệnh như thế này:

wp user list --skip-plugins=my-plugin

Hoặc bạn có thể thêm nó vào wp-cli.ymltập tin của bạn :

skip-plugins:
- my-plugin

-1

Chỉ cần đặt lại tên thư mục plugin sẽ vô hiệu hóa nó. Đôi khi tôi làm điều đó để tạm thời vô hiệu hóa một plugin [linux]:

mv my-plugin-dir renamed-my-plugin-dir

OP muốn bỏ qua plugin chỉ khi sử dụng WP-CLI, không phải cho bất kỳ hoạt động nào khác có thể xảy ra cùng một lúc
Mark Kaplun
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.