Фатальная ошибка: Класс не найден в
Я работаю над плагином для 'подключения' дополнительного платежного провайдера в систему оформления заказа.
У меня есть класс gtpCheckoutData в моем файле function.php, который вычисляет цены.
В моем плагине я хочу использовать данные из этого класса gtpCheckoutData, но когда я делаю это, получаю:
Fatal error: Class gtpCheckoutData not found in
Код моего плагина:
class gtpMollieGateway {
private $mollie, $price;
function __construct() {
$this->mollie = new Mollie_API_Client;
// ЭТО ПРОБЛЕМА
$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() );
}
}
}
Мой класс gtpCheckoutData в файле 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;
}
}
}

Плагины загружаются раньше тем. Самые ранние хуки, доступные для плагинов — это plugins_loaded
(или muplugins_loaded
для мультисайтовых плагинов), в то время как темы выполняются на хуке after_setup_theme
и более поздних. Поэтому лучше просто загружать файл [содержащий класс] на определённом хуке в вашем плагине. Вероятно, оптимально загружать его с приоритетом ниже стандартного 10
. Ниже я использую 5
, чтобы сделать его доступным для колбэков, работающих со стандартным приоритетом. Это более безопасно для ваших пользователей, так как они могут не указывать приоритет, и тогда колбэк выполнится с 10
, что снова вызовет ошибку.
add_action( 'after_setup_theme', function()
{
require plugin_dir_path( __FILE__ ).'src/your-class.php`;
}, 5 );
Затем в файле functions.php
вашей темы вы можете просто использовать класс. Это также исключает дублирование кода (и его поддержку в двух местах) и избавляет от ненужных проверок class_exists
, которые просто снижают производительность. Кроме того, становится предсказуемым, где ваш класс доступен и готов к использованию.
Учтите, что текущий стандарт FIG PSR-4 не допускает более одного класса в файле (и ничего лишнего). Следование этому делает вашу настройку более устойчивой к будущим изменениям, так как ваш код готов к использованию пространств имён. (Текущая версия PHP — 5.6, а 5.3 уже не поддерживается).

Спасибо за ваш отличный ответ! Единственная проблема, с которой я сталкиваюсь, это то, что функция get_gtp_option() создается в functions.php. Поэтому я снова получаю ошибку.

Плагины загружаются раньше, чем functions.php. По возможности, класс следует подключать в вашем плагине.
У меня были ситуации, когда класс был частью темы, но также требовался в плагине, где нельзя было гарантировать, что класс подключён в теме. В таких случаях я просто подключал класс в обоих местах, оборачивая его в проверку на существование класса.
Вот так:
if(!class_exists('My_Class'))
{
class My_Class{
// Методы и свойства класса
}
}
Также можно подключить класс только один раз в MU-плагинах, которые загружаются раньше остальных плагинов.
