Làm thế nào để sử dụng các lớp được khai báo trong một plugin khác?


10

Tôi đang phát triển một plugin Wordpress Wooc Commerce. Trên môi trường cục bộ của tôi, nó hoạt động tốt nhưng tôi gặp vấn đề khi thêm plugin vào bản sao của môi trường prod. Tôi chưa quen với wordpress và không rành về web dev (Tôi là một lập trình viên Java).

Trong tệp plugin, tôi khởi tạo một lớp từ gói plugin Wooc Commerce như thế này:

$coupon = new WC_Coupon($some_code);

Trong môi trường cục bộ (php 5.4.10, Wooc Commerce 2.0.13, Wordpress 3.6) thì tốt. Trong môi trường sản xuất (php 5.4.10, Wooc Commerce 1.6.5.2, Wordpress 3.4.2) Tôi gặp lỗi sau:

Fatal error: Class 'WC_Coupon' not found

Tôi đã thử bao gồm cả tệp nơi lớp WC_Coupon được xác định nhưng sau đó lỗi trở thành

Fatal error: Cannot redeclare class WC_Coupon

Vì vậy, cách thích hợp để sử dụng các lớp được khai báo trong một plugin khác là gì?

Lưu ý: nâng cấp không phải là một lựa chọn tại thời điểm này.

Câu trả lời:


10

Bạn phải kiểm tra xem lớp có tồn tại không, nhưng trước đó bạn phải đợi rằng tất cả các plugin đã được tải: không ai có thể đảm bảo rằng plugin của bạn đã được tải sau WooC Commerce.

Để chạy mã từ plugin khi tất cả các plugin được tải hook vào plugins_loadedhook.

Xin lưu ý rằng bạn không thể sử dụng hook này trong một chủ đề, bởi vì khi tải chủ đề đó hook đã được kích hoạt.

add_action('plugins_loaded', 'my_coupon_init');

function my_coupon_init() {
  if ( class_exists('WC_Coupon') ) {
    $coupon = new WC_Coupon($some_code);
    // some code here
  } else {
    add_action('admin_notices', 'wc_not_loaded');
  }
}

function wc_not_loaded() {
    printf(
      '<div class="error"><p>%s</p></div>',
      __('Sorry cannot create coupon because WooCommerce is not loaded')
    );
}

Không chắc chắn trong trường hợp đó plugins_loadedlà móc thích hợp. Người ta sẽ phải tìm kiếm khi chính xác lớp đó có sẵn và kết nối sau đó. Dù sao +1
kaiser

Trong trường hợp cụ thể này, tôi đang móc vào móc khử kích hoạt register_deactivation_hook( __FILE__, 'deactivate');. Vì vậy, tôi không thể chờ đợi. Tôi có thể yêu cầu wordpress tải lớp nếu nó chưa được tải không?
znat

2
Cảm ơn @kaiser. Lớp WC_Couponđược tải bởi lớp __constructchính WooCommerce(thực sự theo includes()phương thức được gọi trực tiếp bởi __construct) và WooCommercelớp là instanziate (dưới dạng singleton) ngay khi plugin được tải. Vậy plugins_loadedlà móc thích hợp trong trường hợp này;)
gmazzap

Vô danh trước khi tải lõi? Woo làm tốt lắm, làm tốt lắm.
kaiser

@NathanZ Kiểm tra class_exists( 'WC_Coupon' ). Ngoài ra, vui lòng cho biết rằng bạn đang sử dụng tính năng này trong khi hủy kích hoạt ... có thể đã tiết kiệm được việc trả lời hàng tấn thời gian của đám đông ...
kaiser

6

Điều này là quá muộn nhưng tôi muốn chia sẻ cách sử dụng thương mại điện tử và các lớp của nó mà không tìm thấy lớp lỗi.

Đầu tiên là kiểm tra xem thương mại điện tử đã được cài đặt chưa và sử dụng woocommerce_loadedhook hành động.

/**
 * Check if WooCommerce is active
 **/
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
    // Put your plugin code here

    add_action('woocommerce_loaded' , function (){
         //Put your code here that needs any woocommerce class 
         //You can also Instantiate your main plugin file here 
    });

}

Tôi hi vọng điêu nay se giup được ai đo.


3

Cách thích hợp sẽ là:

 if( class_exists('WC_Coupon') ) $coupon = new WC_Coupon($some_code);

Tốt hơn là kiểm tra xem lớp có tồn tại trước khi sử dụng hay không, nó sẽ tránh được lỗi nghiêm trọng nếu plugin bị vô hiệu hóa.

Bạn không thể xác định lại một lớp mà nó không được phép trong PHP.

Bạn cũng có thể mở rộng lớp học:

class My_WC_Coupon extends WC_Coupon {
   //some code
   //some hook
}

Nhưng hầu hết thời gian và trong trường hợp này với WooC Commerce, bạn tốt hơn nên tìm một cái móc trong tài liệu sẽ xử lý công việc.


1
Nếu bạn mở rộng lớp của mình thông qua một hook, thì lớp mới sẽ chỉ tồn tại trong phạm vi của hook hook chứ?
alexg
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.