Bestway To Define Theme and Plugin path and url

8

Je suis en désordre. Je sais que c'est une question idiote. Vous voyez que le chemin du thème n'est pas si bon. Alors, y a-t-il une autre façon? Comment puis-je l'utiliser get_template_directory()ici?

    // theme folder path
    if ( ! defined( 'TZSC_THEME_DIR' ) ) {
        define( 'TZSC_THEME_DIR', dirname(__FILE__).'/' );
    }

    // theme folder URL
    if ( ! defined( 'TZSC_THEME_URL' ) ) {
        define( 'TZSC_THEME_URL', plugin_dir_url( __FILE__ ) );
    }
ashraf
la source
1
Pourquoi avez-vous besoin de constantes? Ils créent une dépendance supplémentaire sur l'état global dans votre code. C'est très mauvais.
fuxia
Vous me conseillez donc de ne pas les utiliser? Merci. Est-ce que cela affecte le temps de chargement de ma page?
ashraf
2
A partir de PHP 5.4, les constantes sont placées à la fin de la pile, donc elles seront lues plus rapidement. Mais le vrai problème ici est la qualité du code: chaque fois qu'une fonction ou une classe utilise cette constante, ils «en savent trop», ils font une hypothèse sur l' état en dehors de leur propre code. C'est mauvais. Il rompt l'encapsulation et rend le code difficile à lire. La dépendance de WordPress à l'égard de l'état global est déjà assez grave. N'aggrave pas la situation dans ton code.
fuxia

Réponses:

13

N'utilisez pas de constantes pour cela. N'utilisez pas du tout de constantes globales.

Il existe deux types de constantes: les constantes classe / interface et les constantes globales.

Les constantes dans les classes ou les interfaces sont fines et parfois utiles. Un exemple trop simpliste:

interface Requirements
{
    const MIN_PHP_VERSION = 5.4;

    public function php_is_good();
}

class Theme_Requirements implements Requirements
{
    public function php_is_good()
    {
        return version_compare( PHP_VERSION, self::MIN_PHP_VERSION, '>=' );
    }
}

Mais gardez à l'esprit que ces constantes sont toujours publiques. Si vous les modifiez ultérieurement, vous risquez de casser du code qui dépend d'eux.

C'est pire avec les constantes globales. Imaginez ce qui suit:

define( 'THEME_URI', get_template_directory_uri() );

Et puis une fonction pour une image d'en-tête par défaut:

function get_default_header_image()
{
    return THEME_URI . '/img/default-header.jpg';
}

Cette fonction fait une hypothèse sur quelque chose qui est hors de son contrôle, elle en sait trop. Comment testez-vous cette fonction avec différentes valeurs pour la constante? Tu ne peux pas.

Supposons que vous souhaitiez tester ce qui se passe lorsque la constante est définie sur un répertoire inexistant ou sur un autre serveur plus lent. Mais une fois que vous avez défini la constante, vous ne pouvez pas modifier sa valeur. Vous ne pouvez pas exécuter tous les tests en une seule fois, ce qui rend les tests plus difficiles que nécessaire.

Et dans un thème enfant qui essaie d'utiliser sa propre image par défaut - comment implémentez-vous cela? La constante est définie par le thème parent. Vous pouvez ajouter un chèque avec defined(), mais cela rend plus difficile de voir où sa valeur a été réellement écrite.

Il serait préférable de réécrire la fonction pour:

function get_default_header_image( $base )
{
    return esc_url( $base ) '/img/default-header.jpg';
}

J'ai dit plus tôt, les constantes sont une API. Les API doivent être faciles à changer, mais il est vraiment difficile de déprécier une constante, car PHP ne consigne pas l'accès. Ainsi, votre message de dépréciation n'atteindra jamais les autres développeurs, sauf lorsqu'ils lisent très attentivement votre code source ou vos documents. Croyez-moi, ils ne le font pas.

À utiliser get_stylesheet_directory_uri()dans les thèmes enfants et get_template_directory_uri()dans les thèmes parents. Les deux peuvent être filtrés lors de l'exécution, vous pouvez donc exécuter tous vos tests à la fois.

fuxia
la source