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

9

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

En el archivo de complementos, hago una instancia de una clase del paquete de complementos de Woocommerce como este:

$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 en

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.

    
pregunta znat 19.08.2013 - 14:46

3 respuestas

8

Tienes que verificar si la clase existe, pero antes tienes que esperar que todos los complementos estén cargados: nadie puede asegurar que tu complemento esté cargado después de WooCommerce.

Para ejecutar un código desde el complemento cuando todos los complementos estén cargados, enganche en plugins_loaded hook.

Tenga en cuenta que no puede usar este enganche en un tema, porque cuando la carga del tema ya estaba enganchado.

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

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

Lo primero es verificar si woocommerce está instalado y usar el enlace de acción 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 esto ayude a alguien.

    
respondido por el jameshwart lopez 15.04.2016 - 17:31
2

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 puedes 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 encuentres un gancho en documentación que manejará el trabajo.

    
respondido por el JMau 19.08.2013 - 15:06

Lea otras preguntas en las etiquetas