处理对GET_TEMPLATE_DIRECTORY_URI()和类似函数的多个调用的最佳方式是什么?

时间:2012-03-01 作者:Dave Romsey

编辑:谢谢你们的回复,伙计们。这正是我想要的。你们每个人都提出了一些好的观点。我想我会坚持使用常量。

这确实是一个最佳实践/性能问题。

我主要关注以下功能:

get_template_directory_uri()
get_template_directory()
get_stylesheet_directory_uri()
get_stylesheet_directory()
我的印象是,在某些情况下反复调用函数是不好的做法。因此,这将被视为不良做法:

// 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 );
这会更好:

// 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 );
我见过一些主题初始化常量:

// 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 );
我的印象是,使用常量并不是一个好主意,即使它们是使用get_template_directory_uri() 等,因为它们可能不灵活。Here\'s WP trac中的一张票证,其中常量进近启动。查看一下(下面的示例),他们(可能)正在调用get_template_directory_uri() 多次。

我知道这没什么大不了的,但我一直都会遇到这个问题,并且看到它在主题和插件方面做得不同。你们能帮我澄清一下吗?

// ...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\' );

3 个回复
SO网友:Chip Bennett

我想有zero 关于多种用途的性能问题get_template_directory() (或其任何兄弟姐妹)。这些函数的返回值是缓存的一部分。对这些函数的多次调用不会导致多次数据库命中。

SO网友:Bainternet

我不认为有正确或最好的方法可以做到这一点(有错误的方法),如果使用常量,则会在运行时保存函数执行调用,但会失去可以通过直接函数调用处理的过滤灵活性。

在我的主题中,我定义了自己的常量,其中不需要过滤,如果有过滤选项或需要,我在函数变量中使用过滤,这意味着如果它都在同一个函数中,那么反复调用同一个函数就是愚蠢的,例如:

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\' );

SO网友:chrisguitarguy

我几乎总是为涉及URL的内容定义自己的常量(模式3)。

原因如下:

排队不考虑子主题文件。使用get_style_sheet_directory_uri 显然将获取子主题的模板URI,但如果子主题没有复制到JS或CSS文件上,该怎么办?那些排队的资源404。我宁愿排队工作。

脚本和样式可以很容易地退出队列。如果子主题或用户想要更改某些内容,他们可以轻松地将脚本出列。这不仅弥补了使用常量的“非动态”性。

动态过滤只有在有条件的情况下才有用。get_stylesheet_directory_uri 它里面有一个过滤器,但是你怎么知道它调用了你的过滤呢?是否要筛选所有这些内容?

内部有过滤器WP_ScriptsWP_Styles, 它处理排队,可以根据脚本句柄有条件地挂接和更改排队的href和src,并根据需要更改URI。

我不确定这是不是正确的方法,但我看过很多主题和插件的代码,其中很多确实在插件顶部使用自定义常量,或者functions.php 文件。

我同意Bainternet: 对同一个函数的多次调用似乎有点愚蠢。有一些人在get_template_directory_uriget_stylesheet_directory_uri, 然而两者都依赖于数据库选项(如果您可以追溯到最开始的地方),这些选项是用get_option, 这是cached. 但是调用一个函数并进行一系列字符串串联以生成完整的URI仍然有一些开销。

结束

相关推荐

Enable page templates. How?

基本问题,但我想启用页面模板。我有一个启用了页面模板的主题。我切换到了另一个模板,但没有更改模板的选项,即使在创建新页面时也是如此。如何打开此选项?我在抄本和论坛上找到了根,但找不到。