Como usar classes declaradas em outro plugin?

9

Estou desenvolvendo um plugin do Wordpress para o Woocommerce. No meu ambiente local funciona bem, mas eu tenho problemas ao adicionar o plugin a uma réplica do ambiente prod. Eu sou novo no wordpress e não muito familiarizado com o web dev (sou um programador Java).

No arquivo de plug-in, instancio uma classe do pacote de plugins do Woocommerce assim:

$coupon = new WC_Coupon($some_code);

No ambiente local (php 5.4.10, Woocommerce 2.0.13, Wordpress 3.6) está tudo bem. No ambiente de produção (php 5.4.10, Woocommerce 1.6.5.2, Wordpress 3.4.2) eu tenho o seguinte erro:

Fatal error: Class 'WC_Coupon' not found

Eu tentei incluir o arquivo onde a classe WC_Coupon está definida, mas depois o erro se torna

Fatal error: Cannot redeclare class WC_Coupon

Então, qual é a maneira correta de usar classes declaradas em outro plugin?

Nota: a atualização não é uma opção no momento.

    
por znat 19.08.2013 / 14:46

3 respostas

8

Você tem que verificar se a classe existe, mas antes disso você deve esperar que todo o plugin seja carregado: ninguém pode assegurar que o seu plugin é carregado após o WooCommerce.

Para executar um código do plug-in quando todos os plug-ins forem carregados, conecte-se ao plugins_loaded hook.

Esteja ciente de que você não pode usar este gancho em um tema, porque quando o tema carregar esse gancho já foi acionado.

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')
    );
}
    
por gmazzap 19.08.2013 / 15:24
4

Isso é tarde demais, mas gostaria de compartilhar como usar o woocommerce e suas classes sem ter uma classe de erro não encontrada.

Primeiro, verifique se o woocommerce está instalado e use o gancho de ação 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 
    });

}

Espero que isso ajude alguém.

    
por jameshwart lopez 15.04.2016 / 17:31
2

A maneira correta seria:

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

É melhor verificar se a classe existe antes de usá-la, isso evita erros fatais se o plug-in estiver desativado.

Você não pode redeclarar uma classe não é permitido no PHP.

Você também pode estender a turma:

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

Mas na maioria das vezes, e neste caso com o WooCommerce, é melhor você encontrar um gancho em documentação que irá lidar com o trabalho.

    
por JMau 19.08.2013 / 15:06

Tags