web-dev-qa-db-fra.com

Quel est le meilleur moyen de gérer plusieurs appels à get_template_directory_uri () et à des fonctions similaires?

Edit: Merci pour vos réponses, les gars. C'est exactement ce que j'étais après. Vous avez chacun soulevé de bons points. Je pense que je vais rester avec l'utilisation de constantes.

C'est vraiment une question de bonnes pratiques/performance.

Je suis principalement concerné par les fonctions suivantes:

get_template_directory_uri()
get_template_directory()
get_stylesheet_directory_uri()
get_stylesheet_directory()

J'ai eu l'impression qu'il est une mauvaise pratique d'appeler à plusieurs reprises une fonction dans certaines situations. Donc, cela serait considéré comme une mauvaise pratique:

// Pattern 1
wp_enqueue_script( 'test-1', get_template_directory_uri() . '/js/test-1.js', 'jquery', '20120206', true );
wp_enqueue_script( 'test-2', get_template_directory_uri() . '/js/test-2.js', 'jquery', '20120206', true );
wp_enqueue_script( 'test-3', get_template_directory_uri() . '/js/test-3.js', 'jquery', '20120206', true );

Et ce serait mieux:

// Pattern 2
$template_directory_uri = get_template_directory_uri();
wp_enqueue_script( 'test-1', $template_directory_uri . '/js/test-1.js', 'jquery', '20120206', true );
wp_enqueue_script( 'test-2', $template_directory_uri . '/js/test-2.js', 'jquery', '20120206', true );
wp_enqueue_script( 'test-3', $template_directory_uri . '/js/test-3.js', 'jquery', '20120206', true );

J'ai vu des thèmes initialiser des constantes:

// Pattern 3
define( 'THEME_URI', get_template_directory_uri() );
define( 'THEME_JS', trailingslashit( BASETHEME_THEME_URI ) . 'js/' );
// Then, later on...
wp_enqueue_script( 'test-1', THEME_JS . 'test-1.js', 'jquery', '20120206', true );
wp_enqueue_script( 'test-2', THEME_JS . 'test-2.js', 'jquery', '20120206', true );
wp_enqueue_script( 'test-3', THEME_JS . 'test-3.js', 'jquery', '20120206', true );

J'ai l'impression que l'utilisation de constantes n'est pas une bonne idée, même si elles sont initialisées à l'aide de get_template_directory_uri() et al., Car elles peuvent être inflexibles. Voici un ticket dans WP trac où l'approche constante obtient le démarrage. En regardant _s, (exemple ci-dessous), ils appellent (potentiellement) get_template_directory_uri() plusieurs fois.

Je sais que ce n'est pas un gros problème, mais je me heurte à cette question tout le temps et je vois les choses différemment dans les thèmes et les plugins. Pouvez-vous m'aider à remettre les pendules à l'heure?

// ...sample code from _s using the multiple calls to get_template_directory_uri()
/**
 * Enqueue scripts and styles
 */
function _s_scripts() {
    global $post;

    wp_enqueue_style( 'style', get_stylesheet_uri() );

    wp_enqueue_script( 'jquery' );

    wp_enqueue_script( 'small-menu', get_template_directory_uri() . '/js/small-menu.js', 'jquery', '20120206', true );

    if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {
        wp_enqueue_script( 'comment-reply' );
    }

    if ( is_singular() && wp_attachment_is_image( $post->ID ) ) {
        wp_enqueue_script( 'keyboard-image-navigation', get_template_directory_uri() . '/js/keyboard-image-navigation.js', array( 'jquery' ), '20120202' );
    }
}
add_action( 'wp_enqueue_scripts', '_s_scripts' );
1
Dave Romsey

Je pense qu’il ya zéro problème de performances en ce qui concerne les utilisations multiples de get_template_directory() (ou l’un de ses frères et soeurs). Les valeurs de retour de ces fonctions font partie du cache. Les appels multiples à ces fonctions n'engendrent pas plusieurs accès à la base de données.

2
Chip Bennett

Je ne pense pas qu'il existe un moyen correct ou meilleur de le faire (il existe des moyens incorrects). Si vous utilisez des constantes, vous enregistrez les appels d'exécution de fonctions au moment de l'exécution, mais vous perdez la flexibilité du filtrage qui peut être géré avec des appels de fonction directs.

Dans mon thème, je définis mes propres constantes et où aucun filtrage n'est nécessaire. S'il existe une option ou un besoin de filtrage, je l'utilise dans les variables de fonctions, ce qui signifie que si tout est dans la même fonction, appeler la même fonction encore et encore est stupide ex :

function _s_scripts() {
    global $post;
    wp_enqueue_style( 'style', get_stylesheet_uri() );
    wp_enqueue_script( 'jquery' );
    $get_template_directory_uri = get_template_directory_uri();
    wp_enqueue_script( 'small-menu',  $get_template_directory_uri. '/js/small-menu.js', 'jquery', '20120206', true );
    if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) {
        wp_enqueue_script( 'comment-reply' );
    }
    if ( is_singular() && wp_attachment_is_image( $post->ID ) ) {
        wp_enqueue_script( 'keyboard-image-navigation', $get_template_directory_uri . '/js/keyboard-image-navigation.js', array( 'jquery' ), '20120202' );
    }
}
add_action( 'wp_enqueue_scripts', '_s_scripts' );
1
Bainternet

Je définis presque toujours mes propres constantes pour les éléments impliquant des URL (modèle 3).

Les raisons:

  1. La mise en file d'attente ne prend pas en compte les fichiers de thème enfant. Utiliser get_style_sheet_directory_uri ira évidemment chercher l'URI de modèle du thème enfant, mais que se passera-t-il si le thème enfant n'a pas copié le ou les fichiers JS ou CSS? Ces ressources en file d'attente 404. Je préfère que mes files d'attente fonctionnent.

  2. Les scripts et les styles peuvent facilement être retirés de la liste. Si un thème enfant ou un utilisateur souhaite modifier quelque chose, il peut facilement retirer le script de la file d'attente. Cela compense largement le caractère "non dynamique" de l'utilisation de constantes.

  3. Le filtrage dynamique ne semble utile que s'il est conditionnel. get_stylesheet_directory_uri contient un filtre, mais comment savoir lequel de ces appels appelle votre filtrage? Vouliez-vous tous les filtrer?

Il y a des filtres dans les WP_Scripts et WP_Styles, qui traitent les files d'attente, où l'on peut se connecter et modifier les href et src de la file d'attente de façon conditionnelle en fonction du handle de script et modifier l'URI si nécessaire.

Je ne suis pas sûr que ce soit la bonne approche, mais j'ai examiné beaucoup de code de thème et de plugin et beaucoup d'entre eux utilisent des constantes auto-définies en haut de leur plugin ou de leurs fichiers functions.php.

Je suis d'accord avec Bainternet : plusieurs appels à la même fonction semblent un peu ridicules. Cependant, il y a des problèmes avec get_template_directory_uri et get_stylesheet_directory_uri. Les deux reposent sur des options de base de données (si vous remontez au début), récupérées avec get_option, qui est en cache . Mais il reste encore du temps pour appeler une fonction et faire une concaténation de chaînes pour produire un URI complet.

1
chrisguitarguy