web-dev-qa-db-fra.com

Plugin vs Paramètres ordre de chargement (dépendance woocommerce)

Je développe un plugin dépendant de Woocommerce qui fonctionne, ainsi qu'une page de paramètres qui se comporte de manière géniale et lance une classe 'WC_Settings_Page' introuvable. Erreur fatale

if ( !defined( 'ABSPATH' ) ) {exit;}

if ( !class_exists( 'WooCommerce_Chilexpress_Tags_Settings' ) ) {

   class WooCommerce_Chilexpress_Tags_Settings extends WC_Settings_Page{
   ...
   }

   function my_plugin_add_settings() {
      return new WooCommerce_Chilexpress_Tags_Settings();
   }
}

add_filter( 'woocommerce_get_settings_pages', 'my_plugin_add_settings', 15 );

ce code est dans un includes/mysettings.php qui est chargé pendant le plugin init, qui est alphabétiquement woocommerce-chilexpress-etiquetas, il devrait donc être chargé après woocommerce

Pour une raison que je ne comprends pas encore, les paramètres de mon plug-in sont toujours chargés avant ceux de WooCommerce, même si je reçois un PHP Erreur fatale:

PHP Fatal error:  Class 'WC_Settings_Page' not found

La solution incorrecte évidente consistait à insérer le code WC_Settings_Page dans mes propres paramètres. J'essaie maintenant de nettoyer cela, mais de toute façon cela ne fonctionnera pas ...

Donc, la question (oui, je sais très large) est: Que pourrais-je manquer?

1
Canelo Digital

Le problème est que, au moment où votre WooCommerce_Chilexpress_Tags_Settings est défini, WC_Settings_Page n'est en effet pas encore chargé; par conséquent vous avez l'erreur fatale.

Et si vous souhaitez le faire de la même manière que WooCommerce, placez le WooCommerce_Chilexpress_Tags_Settings dans un fichier PHP séparé, par exemple. includes/class-woocommerce-chilexpress-tags-tettings.php et initialisez la classe à partir de ce fichier - c.-à-d. return une instance de WooCommerce_Chilexpress_Tags_Settings comme ceci:

<?php
// class-woocommerce-chilexpress-tags-tettings.php

defined( 'ABSPATH' ) || exit;

class WooCommerce_Chilexpress_Tags_Settings extends WC_Settings_Page {

    ...
}

return new WooCommerce_Chilexpress_Tags_Settings();

et include il de my_plugin_add_settings():

function my_plugin_add_settings( $settings ) {
    $settings[] = include 'path/to/includes/class-woocommerce-chilexpress-tags-tettings.php';

    return $settings;
}
add_filter( 'woocommerce_get_settings_pages', 'my_plugin_add_settings' );

Et si vous avez remarqué, vous devez renvoyer le $settings de my_plugin_add_settings().

4
Goku

Voir l'exemple de travail: https://Gist.github.com/bekarice/34aaeda2d4729ef87ad7
Vous devriez faire quelque chose comme ceci:

// If this file is called directly, abort.
defined('ABSPATH') or exit();


if ( !class_exists( 'WooCommerce_Chilexpress_Tags_Settings' ) ) {

    function my_plugin_add_settings() {

        class WooCommerce_Chilexpress_Tags_Settings extends WC_Settings_Page {
            // Your class and your code / logic 
        }

        return new WooCommerce_Chilexpress_Tags_Settings();

    }

    add_filter( 'woocommerce_get_settings_pages', 'my_plugin_add_settings', 15 );

}
2
Remzi Cavdar