web-dev-qa-db-fra.com

Meilleure façon de définir le thème et le chemin du plugin et l'URL

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 un autre moyen? Comment 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__ ) );
    }
8
ashraf

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

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

Les constantes dans les classes ou les interfaces sont bonnes 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, ces constantes sont toujours publiques. Si vous les changez plus tard, vous pourriez casser le code qui en dépend.

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 l'hypothèse de 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? Vous ne pouvez 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 changer sa valeur. Vous ne pouvez pas exécuter tous les tests en une fois, cela rend les tests plus difficiles que nécessaire.

Et dans un thème enfant qui tente d’utiliser sa propre image par défaut, comment l’implémentez-vous? La constante est définie par le thème parent. Vous pouvez ajouter un contrôle avec defined(), mais cela rend plus difficile de savoir où sa valeur a été écrite.

Il serait bien mieux 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 à modifier, mais il est très difficile de déconseiller une constante, car PHP ne consigne pas l'accès. Ainsi, votre message de désapprobation ne parviendra jamais aux autres développeurs, sauf quand ils liront votre code source ou votre documentation très attentivement. Croyez-moi, ils ne le font pas.

Utilisez 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 au moment de l'exécution afin que vous puissiez exécuter tous vos tests en même temps.

13
fuxia