it-roy-ru.com

Неустранимая ошибка: класс не найден в

Я работаю над плагином для "подключения" провайдера дополнительных платежей к системе оплаты.

У меня есть класс gtpCheckoutData в моем function.php, который рассчитывает цены.

В моем плагине я хочу использовать данные из этого gtpCheckoutData class, но если я это сделаю, я получу:

Неустранимая ошибка: класс gtpCheckoutData не найден в

Мой код плагина:

class gtpMollieGateway {
   private $mollie, $price;

   function __construct() {
       $this->mollie    = new Mollie_API_Client;

       // THIS IS THE PROBLEM
       $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() );
       }
   }
}

My gtpCheckoutData class в 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;
        }
    }
}
2
Robbert

Плагины загружаются до functions.php. Вы должны включить класс в свой плагин, если это возможно.

У меня были сценарии, в которых класс был частью темы, но также требовался плагин, в котором нельзя было предположить, что класс включен в тему. В этих случаях я просто включал класс в обоих местах и ​​включал его в проверку "класс существует".

Как это:

if(!class_exists('My_Class'))
{
 class My_Class{

    // Class Methods and Properties
 }
}

Вы также можете включить класс только один раз в плагины MU, которые загружаются раньше других плагинов.

1
SkyShab

Плагины загружаются перед темами. Самыми ранними подключаемыми модулями, доступными для плагинов, являются plugins_loaded (или muplugins_loaded для mu-plugins), тогда как темы запускаются на 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 - в конце).

4
kaiser