web-dev-qa-db-ja.com

追加のDBクエリを使用せずに、ループ内でポストパーマリンクを取得する

私は数千の投稿にリンクするカスタムの「ディレクトリ」ページを作成しようとしています。私はDBクエリーの数を制限しようとしています。各投稿にリンクするには、get_permalink()を呼び出しています。これにより、投稿ごとに追加のDBクエリが作成されます。

追加のクエリなしで投稿のパーマリンクを取得する方法はありますか?私は助けには思われない$ postオブジェクトを渡してみました。私はコア関数も見ました、そして$ post-> filter = 'sample'値と共にオブジェクト全体を渡すことは追加のget_post()呼び出しを避けることに気付きました:

なぜ `get_permalink()`がaddを生成するのですか。 $ post-> filterなしのDBリクエスト?

しかし、それでもまだ余分なクエリが発生しているようです。何か案は?

1
NJ.

各投稿にリンクするために、私はget_permalink()を呼び出していることに気付きます、そしてこれは各投稿のための追加のDBクエリを作成しています。

違います。あなたがリンクした投稿の中で、非常に古い tracチケット#18822 へのリンクをチェックした場合、この問題は2011年に@kaiserによって提起されました。質問には@​​scribuが回答しました。

例えば:

$posts = get_posts();
foreach ( $posts as $post )
    var_dump( get_permalink( $post->ID ) );

これらの投稿はすべてキャッシュされているため、余分なクエリは発生しません。 get_post()がオブジェクトを受け取るので、余分な問い合わせをしないために$ postオブジェクト全体をget_permalinkに渡すこともできます。実際、オブジェクトにfilterプロパティが設定されていて、その投稿IDがまだキャッシュされていないときにオブジェクトを渡すと、get_post()はクエリのみを実行します。

いつものように、私は理論上ではなく、事実上に行きます、そして私が私の事実を得る方法はテストにあります

次のクエリを設定して実行し、timeとdbの呼び出しに注意してください。

timer_start();  
$posts = get_posts();
foreach ( $posts as $post ) {

    // REST TO COME LATER

}
echo '<p>' . get_num_queries() . ' queries in ' . timer_stop(1, 5) . ' seconds. </p>';

私のローカルインストールでは、次のような結果が得られます。

0.02539秒で20のクエリ

注:クエリの数は、クエリだけではなく、メニュー、ウィジェット、カスタムクエリ、メインクエリなど、ページ上で実行されるクエリの総数です。時間はページが読み込まれるたびに変わる可能性があります。

では、次に示すようにクエリを変更します。

timer_start();  
$posts = get_posts();
foreach ( $posts as $post ) {

    get_permalink( $post->ID );

}
echo '<p>' . get_num_queries() . ' queries in ' . timer_stop(1, 5) . ' seconds. </p>';

そしてこれは私の結果です

0.02539秒で20のクエリ。

お分かりのように、そして私が証明したように、キャッシュはtracチケットに記述されているように問い合わせをする前に最初にチェックされます。

結論

get_permalink()を使うことができ、Wordpressのキャッシュシステムのために余分なdb呼び出しを心配する必要はありません。あなたもあなたの時間をかけてTracのチケットを介して作業する必要があります

2
Pieter Goosen