Error fatal: Clase no encontrada en
Estoy trabajando en un plugin para 'conectar' un proveedor de pagos adicional en un sistema de pago.
Tengo una clase gtpCheckoutData en mi functions.php que calcula los precios.
En mi plugin quiero usar datos de esta clase gtpCheckoutData, pero cuando lo hago obtengo un:
Error fatal: Clase gtpCheckoutData no encontrada en
Mi código del plugin:
class gtpMollieGateway {
private $mollie, $price;
function __construct() {
$this->mollie = new Mollie_API_Client;
// ESTE ES EL PROBLEMA
$this->price = new gtpCheckoutData;
add_action( 'init', array( $this, 'gtpCreatePayment' ) );
}
function gtpCreatePayment() {
if( isset( $_POST['checkout_submit'] ) ) {
$payment = $this->mollie->payments->create(array(
'amount' => $this->price->getPrice( 'inclusive' ),
));
header( "Location: " . $payment->getPaymentUrl() );
}
}
}
Mi clase gtpCheckoutData en functions.php
class gtpCheckoutData {
private $tax, $price;
public function __construct() {
$this->tax = get_gtp_option( 'gtp_tax' ) / 100;
$this->price = $_SESSION['shopping_cart']['total_price'] + $_SESSION['shopping_cart']['shipping_price'];
$this->shipping = $_SESSION['shopping_cart']['shipping_price'];
}
public function getPrice( $type ) {
if( isset( $type ) ) {
switch( $type ) {
case 'exclusive' :
$totalPrice = $this->price;
break;
case 'tax' :
$totalPrice = $this->price * $this->tax;
break;
case 'inclusive' :
$totalPrice = $this->price * ( $this->tax + 1 );
break;
}
return $totalPrice;
}
}
}

Los plugins se cargan antes que los temas. Los hooks más tempranos disponibles para los plugins son plugins_loaded
(o muplugins_loaded
para mu-plugins), mientras que los temas se ejecutan en after_setup_theme
y hooks posteriores. Por lo tanto, es mejor cargar el archivo [que contiene la clase] en un hook específico en tu plugin. Probablemente sea mejor cargarlo con una prioridad más baja que la predeterminada 10
. A continuación, uso 5
para que esté disponible para las funciones de callback que se ejecutan con la prioridad predeterminada. Esto es más seguro contra errores para tus usuarios, ya que podrían no añadir una prioridad y, por lo tanto, la función de callback se ejecutaría en 10
y se lanzaría el error (de nuevo).
add_action( 'after_setup_theme', function()
{
require plugin_dir_path( __FILE__ ).'src/your-class.php';
}, 5 );
Luego, en el archivo functions.php
de tu tema puedes simplemente confiar en la clase. También evita duplicar tu código (y mantenerlo en dos lugares) y no necesita comprobaciones innecesarias de class_exists
que solo reducen el rendimiento. Además, es predecible dónde tu clase está disponible y lista para usar.
Ten en cuenta que el actual estándar FIG PSR-4 no permite más de una clase por archivo (y nada más allí). Seguir esto hace que tu configuración sea más preparada para el futuro, ya que tu código está listo para namespaces. (La versión actual de PHP es 5.6 y 5.3 está al final de su vida útil).

¡Gracias por tu gran respuesta! El único problema que tengo entonces es que get_gtp_option() es una función creada en functions.php. Así que vuelvo a obtener un error.

Los plugins se cargan antes que functions.php. Deberías incluir la clase en tu plugin si es posible.
He tenido escenarios donde una clase era parte del tema, pero también se necesitaba en un plugin donde no se podía asumir que la clase estaba incluida en el tema. En esos casos, simplemente incluía la clase en ambos lugares y la envolvía en una verificación de "clase existe".
Así:
if(!class_exists('My_Class'))
{
class My_Class{
// Métodos y Propiedades de la Clase
}
}
También podrías incluir la clase solo una vez en los MU Plugins, que se cargan antes que los otros plugins.
