¿Cómo usar las clases declaradas en otro complemento?

10

Estoy desarrollando un complemento de Wordpress Woocommerce. En mi entorno local funciona bien, pero tengo problemas al agregar el complemento a una réplica del entorno de producción. Soy nuevo en WordPress y no estoy muy familiarizado con el desarrollador web (soy un programador de Java).

En el archivo de complemento, ejemplifico una clase del paquete de complemento de Woocommerce como esta:

$coupon = new WC_Coupon($some_code);

En el entorno local (php 5.4.10, Woocommerce 2.0.13, Wordpress 3.6) está bien. En el entorno de producción (php 5.4.10, Woocommerce 1.6.5.2, Wordpress 3.4.2) tengo el siguiente error:

Fatal error: Class 'WC_Coupon' not found

He intentado incluir el archivo donde se define la clase WC_Coupon pero luego el error se convierte

Fatal error: Cannot redeclare class WC_Coupon

Entonces, ¿cuál es la forma correcta de usar las clases declaradas en otro complemento?

Nota: la actualización no es una opción en este momento.

znat
fuente

Respuestas:

10

Debe verificar si la clase existe, pero antes de eso debe esperar que se carguen todos los complementos: nadie puede asegurar que su complemento se cargue después de WooCommerce.

Para ejecutar un código desde el complemento cuando todos los complementos se cargan gancho en plugins_loadedgancho.

Tenga en cuenta que no puede usar este gancho en un tema, porque cuando se carga el tema, ese gancho ya estaba activado.

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')
    );
}
gmazzap
fuente
No estoy seguro si en ese caso plugins_loadedes el gancho adecuado. Uno tendrá que buscar cuando exactamente esa clase esté disponible y conectarse después de eso. De todos modos +1
kaiser
En este caso particular, me estoy conectando al gancho de desactivación register_deactivation_hook( __FILE__, 'deactivate');. Entonces no puedo esperar. ¿Puedo pedirle a WordPress que cargue la clase si aún no está cargada?
znat
2
Gracias @kaiser. El WC_Coupones cargado por __constructla WooCommerceclase principal (realmente por includes()método directamente llamado por __construct) y la WooCommerceclase se instanziate (como singleton) tan pronto como se carga el complemento. Así plugins_loadedes el gancho adecuado en este caso;)
gmazzap
¿Anónimo antes de las cargas principales? Bien hecho Woo, bien hecho.
Kaiser
@NathanZ Check class_exists( 'WC_Coupon' ). También indique que está usando esto durante la desactivación ... podría haber ahorrado toneladas de tiempo respondiendo a la multitud ...
kaiser
6

Esto es demasiado tarde, pero me gustaría compartir cómo usar woocommerce y sus clases sin tener una clase de error no encontrada.

Primero es verificar si WooCommerce está instalado y usar el woocommerce_loadedgancho de acción.

/**
 * 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 esto ayude a alguien.

jameshwart lopez
fuente
3

La forma correcta sería:

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

Es mejor verificar si la clase existe antes de usarla, evita errores fatales si el complemento está deshabilitado.

No puede volver a declarar una clase que no está permitida en PHP.

También puedes extender la clase:

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

Pero la mayoría de las veces y en este caso con WooCommerce, es mejor que encuentre un gancho en la documentación que se encargará del trabajo.

JMau
fuente
1
Si extiende su clase a través de un enlace, ¿no existirá la nueva clase solo en el ámbito de la función enlace?
alexg