web-dev-qa-db-fra.com

Comment fonctionne plugins_loaded?

Je développe un plugin pour la passerelle de paiement woocommerce.

Lorsque je mets le code de définition de classe à l'intérieur de la fonction de rappel qui est déclenchée par 'plugins_loaded', cela fonctionne.

<?php
    add_action('plugins_loaded','WC_test_gateway_plugin');
    function WC_test_gateway_plugin{
        class my_gateway extends WC_Payment_Gateways{
            //code
        }
    }
?>

Mais quand je le mets dans la portée globale, il montrera que le WC_Payment_Gateways est indéfini.

<?php
    class my_gateway extends WC_Payment_Gateways{
        //code
    }
?>

Quelle est la différence entre ces 2 pratiques?

Est-ce une mauvaise pratique de mettre la définition de classe dans la fonction de rappel? Un meilleur moyen pour ça?

1
kroutony

Utilisez votre définition de classe dans un fichier séparé, par exemple dans /your-plugin-dir/classes/my-gateway.php comme d'habitude:

    <?php
        class my_gateway extends WC_Payment_Gateways {
            //code
        }
    ?>

Puis utilisez ce CODE pour inclure le fichier dans l'action plugins_loaded de votre fichier de plugin principal:

    add_action('plugins_loaded', 'WC_test_gateway_plugin');
    function WC_test_gateway_plugin {
        require_once plugin_dir_path( __FILE__ ) . 'classes/my-gateway.php';
        // instantiate your class here or in your class file or anywhere after this function is called.
    }

Vous aurez maintenant accès à WC_Payment_Gateways car à ce stade, WC_Payment_Gateways est défini, car WordPress déclenche le hook action plugin_loaded uniquement après que tous les plugins ont chargé leurs fichiers principaux.

2
Fayaz