web-dev-qa-db-ja.com

Get_template_directory_uri()および同様の関数への複数の呼び出しを処理するための最良の方法は何ですか?

編集:あなたの返事をありがとう、みんな。これこそまさに私がしたことです。あなたはそれぞれいくつかの良い点を挙げました。私は定数を使うことに固執すると思います。

これは本当にベストプラクティス/パフォーマンスの問題です。

私は主に次の機能に関心があります。

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()他を使って初期化されたとしても、定数を使うことはあまり良い考えではないという印象を受けます。 これはWP tracにある チケットです。 _sを見ると(下のサンプル)、彼らは(潜在的に)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' );
1
Dave Romsey

私はゼロget_template_directory()(またはその兄弟のいずれか)の複数の使用に関してパフォーマンスの問題があると思います。これらの関数の戻り値はキャッシュの一部です。これらの関数を複数回呼び出しても、複数のデータベースヒットは発生しません。

2
Chip Bennett

実行時に関数実行呼び出しを保存しても、直接関数呼び出しで処理できる柔軟性を失うのであれば、それを行うための正しい方法や最善の方法はありません(間違った方法があります)。

私のテーマでは、私は自分自身の定数を定義し、フィルタリングが不要な場合、そして関数変数で使用するオプションまたはフィルタリングの必要性がある場合、同じ関数の中で同じ関数を繰り返し呼び出した場合:

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

私はほとんどの場合URLを含むものに対して私自身の定数を定義しています(パターン3)。

その理由

  1. エンキューでは子テーマファイルは考慮されません。 get_style_sheet_directory_uriを使用すると明らかに子テーマのテンプレートURIが取得されますが、子テーマがJSまたはCSSファイルをコピーしなかった場合はどうなりますか?エンキューされたリソース404。私はむしろエンキューの仕事をしたいと思います。

  2. スクリプトとスタイルは簡単にデキューできます。子のテーマまたはユーザーが何かを変更したい場合は、スクリプトを簡単にデキューできます。それは、定数を使った「動的でない」ことを補う以上のことです。

  3. 動的フィルタリングは、条件付きの場合にのみ役に立ちます。 get_stylesheet_directory_uriはその中にフィルターを持っていますが、どの呼び出しを自分のフィルターにかけるかをどのように知っていますか?それらすべてをフィルタリングしましたか?

WP_ScriptsWP_Stylesの中にはエンキューを処理するフィルタがあり、スクリプトハンドルに基づいてエンキューのhrefとsrcを条件付きでフックして変更し、必要に応じてURIを変更することができます。

これが正しいアプローチであるかどうかはわかりませんが、私は多くのテーマとプラグインのコードを調べましたが、それらの多くはプラグインまたはfunctions.phpファイルの先頭で自己定義定数を使用します。

私は Bainternet に同意します:同じ関数を複数回呼び出すのは少しばかげているようです。しかし、get_template_directory_uriget_stylesheet_directory_uriに関しては、いくつかの注意が必要です。どちらもデータベースオプションに依存しています(最初に戻ってトレースした場合)。これは キャッシュされた であるget_optionでフェッチされます。しかし、関数を呼び出して完全なURIを生成するために一連の文字列連結を行うことには、まだいくらかのオーバーヘッドがあります。

1
chrisguitarguy