Como usar classes declaradas em outro plugin?


10

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

No arquivo de plug-in, instancio uma classe a partir do pacote de plug-ins do Woocommerce, assim:

$coupon = new WC_Coupon($some_code);

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

Fatal error: Class 'WC_Coupon' not found

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

Fatal error: Cannot redeclare class WC_Coupon

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

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

Respostas:


10

Você precisa verificar se a classe existe, mas antes disso, é necessário aguardar o carregamento de todos os plug-ins: ninguém pode garantir que o plug-in seja carregado após o WooCommerce.

Para executar um código do plug-in quando todos os plug-ins forem carregados, gancho no plugins_loadedgancho.

Esteja ciente de que você não pode usar esse gancho em um tema, porque quando o tema foi carregado, 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')
    );
}

Não tenho certeza se nesse caso plugins_loadedé o gancho adequado. Será preciso pesquisar quando exatamente essa classe está disponível e depois conectar-se a ela. Enfim +1
kaiser

Nesse caso em particular, estou conectando ao gancho de desativação register_deactivation_hook( __FILE__, 'deactivate');. Então eu mal posso esperar. Posso pedir ao wordpress para carregar a classe se ela ainda não estiver carregada?
Znat 19/08

2
Obrigado @kaiser. O WC_Couponé carregado por __constructda WooCommerceclasse principal (realmente pelo includes()método chamado diretamente por __construct) e a WooCommerceclasse é instanziada (como singleton) assim que o plugin é carregado. Então plugins_loadedé gancho adequada neste caso;)
gmazzap

Anônimo antes das cargas principais? Muito bem Woo, muito bem.
kaiser

@NathanZ Check class_exists( 'WC_Coupon' ). Também indique que você está usando isso durante desativação ... poderia ter salvo respondendo toneladas multidão de tempo ...
kaiser

6

É tarde demais, mas gostaria de compartilhar como usar o woocommerce e suas classes sem que uma classe de erro não seja encontrada.

Primeiro, verifique se o woocommerce está instalado e use o woocommerce_loadedgancho de ação.

/**
 * 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.


3

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 redefinir uma classe que não é permitida no PHP.

Você também pode estender a classe:

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

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


11
Se você estender sua classe por meio de um gancho, a nova classe não existirá apenas no escopo do gancho de função?
31915 alexg18:
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.