다른 플러그인에서 선언 된 클래스를 사용하는 방법은 무엇입니까?


10

Wordpress Woocommerce 플러그인을 개발 중입니다. 내 로컬 환경에서는 제대로 작동하지만 prod 환경의 복제본에 플러그인을 추가 할 때 문제가 있습니다. 저는 워드 프레스를 처음 사용하고 웹 개발자에 익숙하지 않습니다 (Java 프로그래머입니다).

플러그인 파일에서 다음과 같이 Woocommerce 플러그인 패키지에서 클래스를 인스턴스화합니다.

$coupon = new WC_Coupon($some_code);

로컬 환경 (php 5.4.10, Woocommerce 2.0.13, Wordpress 3.6)에서는 괜찮습니다. 프로덕션 환경 (php 5.4.10, Woocommerce 1.6.5.2, Wordpress 3.4.2)에서 다음과 같은 오류가 있습니다.

Fatal error: Class 'WC_Coupon' not found

WC_Coupon 클래스가 정의 된 파일을 포함하려고 시도했지만 오류가 발생합니다.

Fatal error: Cannot redeclare class WC_Coupon

그렇다면 다른 플러그인에서 선언 된 클래스를 사용하는 올바른 방법은 무엇입니까?

참고 : 현재 업그레이드는 옵션이 아닙니다.

답변:


10

클래스가 존재하는지 확인해야하지만 그 전에 모든 플러그인이로드 되기를 기다려야 합니다. WooCommerce 이후에 플러그인이로드 되었는지 확인할 수는 없습니다.

모든 플러그인이 후크에 연결될 때 플러그인에서 코드를 실행합니다 plugins_loaded.

테마로드시 해당 후크가 이미 실행되었으므로 테마에서이 후크를 사용할 수 없습니다.

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')
    );
}

이 경우 plugins_loaded올바른 고리 인지 확실하지 않습니다 . 해당 클래스가 사용 가능할 때 검색하고 그 후에 연결 해야합니다. 어쨌든 +1
카이저

이 특별한 경우에는 비활성화 훅에 연결하고 register_deactivation_hook( __FILE__, 'deactivate');있습니다. 그래서 기다릴 수 없습니다. 클래스가 아직로드되지 않은 경우 워드 프레스에 클래스를로드하도록 요청할 수 있습니까?
znat

2
@kaiser에게 감사합니다. 가 WC_Coupon에 의해로드되는 __construct메인의 WooCommerce클래스 (실제로 의해 includes()직접 호출 방법 __construct과) WooCommerce클래스 곧 플러그인이로드 될뿐 (싱글)을 instanziate입니다. 따라서 plugins_loaded이 경우에는 적절한 후크이다)
gmazzap

코어가로드되기 전에 익명입니까? 잘 했어 우 잘 했어
카이저

@NathanZ 확인 class_exists( 'WC_Coupon' ). 또한 비활성화하는 동안이 기능을 사용하고 있다고 말하십시오. 응답하는 많은 시간을 절약 할 수 있습니다 ...
kaiser

6

너무 늦었지만 오류 클래스를 찾을 수없이 woocommerce와 클래스를 사용하는 방법을 공유하고 싶습니다.

먼저 woocommerce가 설치되어 있는지 확인 하고 woocommerce_loaded조치 후크를 사용하십시오 .

/**
 * 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 
    });

}

나는 이것이 누군가를 돕기를 바랍니다.


3

올바른 방법은 다음과 같습니다.

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

사용하기 전에 클래스가 존재하는지 확인하는 것이 좋습니다. 플러그인을 사용 중지하면 치명적인 오류가 발생하지 않습니다.

PHP에서 허용되지 않는 클래스는 다시 선언 할 수 없습니다.

클래스를 확장 할 수도 있습니다.

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

그러나 대부분의 경우이 경우 WooCommerce를 사용하면 작업을 처리 할 수 있는 문서 를 찾아야합니다 .


1
후크를 통해 클래스를 확장하면 새 클래스가 함수 후크 범위에만 존재하지 않습니까?
alexg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.