Hàm is_plugin_active không tồn tại


15

Tôi đang sử dụng WordPress 3.0.5 và đã thử nghiệm với 3.1rc4. Trong tệp PHP chính của plugin của tôi, khi tôi cố gắng gọi is_plugin_active tôi nhận được Call to undefined function is_plugin_active(). Tôi có thể gọi add_action và add_filter. Tôi nên kiểm tra / thay đổi gì để khắc phục điều này?

Điều này đang xảy ra bên trong quản trị viên trên trang Plugins. Ở đầu tập tin plugin chính của tôi, tôi if (function_exists('is_plugin_active')) {luôn trả về false.

Tôi cũng không thể thấy các chức năng từ tệp plugin chính của mình trong các plugin khác (nếu điều đó có ích).


Tôi không chắc chắn từ mô tả của bạn - nếu đây là vấn đề với plugin được kích hoạt hoặc nếu bạn đang cố gắng làm gì đó khi kích hoạt hoặc trong các điều kiện cụ thể khác?
Rarst

Tôi đã thấy đó function_exists('is_plugin_active')là sai khi được gọi từ tệp plugin chính nếu bên ngoài một phương thức nhưng đúng khi được gọi bên trong phương thức được gọi cho activated_pluginhành động.
Carl

Trên trang nào bạn thấy lỗi? Trang của plugin (wp-admin / plugins.php)? Đây là trước hoặc sau khi bạn kích hoạt các plugin trong câu hỏi? Rarst có một điểm tốt. Bạn có biết tại thời điểm nào bạn đang gọi hàm với wordpress không?
Jonnybojangles

Tôi thấy lỗi trên wp-admin / plugins.php sau khi tôi kích hoạt plugin. Tôi có kiểm tra một số phương thức được nối vào như các hành động và nó hoạt động ở đó. Có vẻ như nó có một cái gì đó để làm với thứ tự bao gồm.
Carl

Các plugin được tải theo thứ tự bảng chữ cái, do đó, có thể đơn giản là plugin của bạn không được xử lý đủ sớm. Hãy thử đổi tên plugin của bạn để bắt đầu bằng chữ a (ví dụ: a_myplugin-name) để nó tải trước đó. Tuy nhiên, tùy chọn tốt nhất sẽ là gọi khối function_exists của bạn từ bên trong một hàm chạy sau khi các plugin được tải. Bạn có thể thấy thứ tự chạy thô trên codex WP: codex.wordpress.org/Plugin_API/Action_Reference
Phill Healey

Câu trả lời:


26

Đó là bởi vì tệp is_plugin_active () được xác định - wp-admin/includes/plugin.php- chỉ được tải trong quản trị viên, sau khi plugin của bạn được tải.

Do đó, bạn chỉ có thể gọi nó sau khi 'admin_init' đã kích hoạt:

function check_some_other_plugin() {
  if ( is_plugin_active('some-plugin.php') ) {
    ...
  }
}
add_action( 'admin_init', 'check_some_other_plugin' );

Nếu tôi đã ở trong quản trị viên, có điều gì đó có thể được định cấu hình sai sẽ không cho phép tôi truy cập vào điều này?
Carl

1
Xem câu trả lời cập nhật.
scribu

10

Bạn có thể gọi is_plugin_active () trong các mẫu và từ các trang người dùng, điều này có thể hữu ích cho các plugin liên quan (nghĩa là yêu cầu plugin 'xyz' để vận hành plugin mới của tôi). Bạn cần bao gồm thủ công tệp plugin.php như được ghi chú trong tài liệu is_plugin_active () trên Codex.

Dưới đây là một ví dụ chức năng tôi sử dụng trong các gói bổ trợ cao cấp của mình để đảm bảo plugin cơ sở miễn phí được kích hoạt trước khi gọi đối tượng bổ trợ. Nó yêu cầu một số hook & bộ lọc nhất định có sẵn trong plugin cơ sở nếu không nó sẽ bị sập.

include_once(ABSPATH.'wp-admin/includes/plugin.php');
if (!function_exists('is_plugin_active') || !is_plugin_active('store-locator-le/store-locator-le.php')) { 
   return;
}

Bên cạnh đó, nếu bạn gặp sự cố với is_plugin_active () từ bên trong đăng nhập quản trị viên đang hoạt động thì có thể là do bạn đang kiểm tra trước khi admin_init kích hoạt. admin_menu bắn trước admin_init và thực hiện các bài kiểm tra trong admin_menu đã "cắn" tôi trước đó. Tên "admin_init" có vẻ phản trực giác đối với tôi vì admin_menu đã chạy. Tôi nghĩ init là "điều đầu tiên phải chạy" ... có lẽ admin_kinda_init () sẽ tốt hơn. :)


Thêm include_once(ABSPATH.'wp-admin/includes/plugin.php');đã làm các mẹo cho tôi. Cảm ơn!
Dave

8

Cách giải quyết nhanh và bẩn sẽ là sao chép chức năng theo cách thủ công:

if ( ! function_exists( 'is_plugin_active' ) ) {
    function is_plugin_active( $plugin ) {
        return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
    }
}

Nó khá ngắn nên không quá khó để thực hiện theo mã của riêng bạn như một cách giải quyết.


4

Đơn giản và dễ dàng. Lấy từ WP

if ( ! function_exists( 'is_plugin_active' ) )
     require_once( ABSPATH . '/wp-admin/includes/plugin.php' );

và sau đó bất kỳ trường hợp nào của

 if ( is_plugin_active( 'feed-them-social/feed-them.php' ) ) {

   }

nhận chức năng kiểm tra. VÌ không còn lỗi nữa.


1
Nếu bạn đang sử dụng requireoncecó lẽ bạn không cần kiểm tra chức năng ...?
Phill Healey

Bạn làm điều đó để bạn có thể chắc chắn rằng plugin được xác định trước khi thử sử dụng nó, nếu không bạn có thể gặp rắc rối.
Spencer Labadie

3

Tôi thích câu trả lời của Tom Auger với cách xác định hàm is_plugin_active của riêng bạn thay vì bao gồm plugin.php. Tuy nhiên, việc sử dụng cùng tên chức năng đã khiến khu vực quản trị của tôi gặp sự cố. Sử dụng một tên hàm khác đã giải quyết nó:

function is_plugin_active_byme( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
}

Tôi đồng ý. Mặc dù bạn có thể kiểm tra xung đột trong khai báo hàm, WP không và do đó WP của bạn sẽ gây ra lỗi.
Chris Sprague

1

Bạn đang sử dụng is_plugin_activebên trong quản trị viên hoặc front-end? Tôi khá chắc chắn rằng đó is_plugin_activechỉ là một chức năng quản trị được tìm thấy bên trong wp-admin / gồm / plugin.php.

Ngoài ra, tệp plugin chính của bạn có sử dụng Wordpress File Header không? Là plugin của bạn được bao gồm sau khi tập tin plugin.php ở trên được tải?


Điều này đang xảy ra bên trong quản trị viên trên trang Plugins. Các plugin có tiêu đề tập tin WP đề xuất. Làm cách nào để kiểm tra xem plugin có được bao gồm sau plugin.php không?
Carl

1

Để gỡ lỗi các plugin đang hoạt động:

var_dump(get_option(...));

Để kiểm tra một plugin cụ thể:

in_array(get_option(...));

Hành động được gọi là " active_plugins" IIRC.


0

Không có giải pháp nào trong số này làm việc cho tôi, nhưng điều này đã làm:

include_once('wp-admin/includes/plugin.php');

Tôi tìm thấy giải pháp này tại codebangers.com

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.