Як використовувати класи, оголошені в іншому плагіні?


10

Я розробляю плагін Wordpress Woocommerce. У моєму локальному середовищі це працює чудово, але у мене є проблеми при додаванні плагіна до репліки середовища prod. Я новачок у wordpress і не дуже добре знайомий з веб-розробником (я програміст Java).

У файлі плагінів я інстанціюю клас із пакета плагінів Woocommerce таким чином:

$coupon = new WC_Coupon($some_code);

У локальному середовищі (PHP 5.4.10, 2.0.13 WooCommerce, Wordpress 3,6), це добре. У виробничому середовищі (php 5.4.10, Woocommerce 1.6.5.2, Wordpress 3.4.2) у мене є така помилка:

Fatal error: Class 'WC_Coupon' not found

Я спробував включити файл, де визначений клас WC_Coupon, але потім стає помилка

Fatal error: Cannot redeclare class WC_Coupon

Отже, який правильний спосіб використання класів, оголошених в іншому плагіні?

Примітка: оновлення наразі не є можливим.

Відповіді:


10

Ви повинні перевірити, чи існує клас, але перед цим потрібно почекати, що весь плагін завантажений: ніхто не може запевнити, що ваш плагін завантажений після WooCommerce.

Для запуску коду з плагіна, коли весь плагін завантажений гачок у plugins_loadedгачок.

Майте на увазі, що ви не можете використовувати цей гачок у темі, тому що коли завантажується тема, цей гачок уже був запущений.

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')
    );
}

Не впевнений, чи є в цьому випадку plugins_loadedправильний гачок. Треба буде шукати, коли саме цей клас доступний, і підключитися після цього. У будь-якому разі +1
кайзер

В даному конкретному випадку, я закріплювати до деактивації гачка register_deactivation_hook( __FILE__, 'deactivate');. Тож я не можу чекати. Чи можу я попросити wordpress завантажити клас, якщо він ще не завантажений?
znat

2
Дякую @kaiser. WC_CouponЗавантажуються __constructз основного WooCommerceкласу ( на самому справі за includes()методі безпосередньо названо __construct) і WooCommerceкласом instanziate (як одноточкові) , як тільки завантажується плагін. Тож plugins_loadedналежний гачок у цьому випадку;)
gmazzap

Анонімні перед завантаженням основних? Молодці Ву, молодець.
кайзер

@NathanZ Check class_exists( 'WC_Coupon' ). Також зауважте, що ви користуєтесь цим під час деактивації ... міг би врятувати відповіді натовп тонн часу ...
kaiser

6

Це занадто пізно, але я хотів би поділитися тим, як використовувати woocommerce та її класи, не маючи класу помилок, не знайденого.

Спочатку слід перевірити, чи встановлена ​​система торгівлі та використовувати 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 
    });

}

Я сподіваюся, що це комусь допоможе.


3

Правильним способом було б:

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

Краще перевірити, чи існує клас, перш ніж його використовувати, це дозволяє уникнути фатальної помилки, якщо плагін вимкнено.

Ви не можете передекларувати клас, це не дозволено в PHP.

Ви також можете продовжити клас:

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

Але більшу частину часу, і в цьому випадку з WooCommerce, ви краще знайдете гачок в документації, яка буде справлятися з цим завданням.


1
Якщо ви розширите свій клас за допомогою гака, чи не буде новий клас існувати лише в області гака функції?
alexg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.