web-dev-qa-db-ja.com

Get_postsをキャッシュする

メタ値 "event_date"で順序付けされ、今日より前の投稿のみが表示されるようにフィルタリングされた10個のニュース項目のリストを表示するクエリ(下記参照)があります。このクエリの処理には2秒かかります。そのため、ロード時間を短縮するために結果をキャッシュする簡単な方法を探しています。私はすでにWPEngineを使用しているので、キャッシングプラグインは必要ありません。ご協力ありがとうございます。

<?php $today = time();?>
<?php $args = array( 
'numberposts' => 10,
'orderby'       => 'meta_value_num',
'order'         => 'DESC',
'meta_key'      => 'event_date',
'meta_query'    => array(
    array(
        'key' => 'event_date',
        'value' => $today,
        'compare' => '<=',
        'type' => 'NUMERIC'
        )
    )
 );

$postslist = get_posts( $args );

foreach ($postslist as $post) :  setup_postdata($post); ?>
1
Mark Devlin

一時キャッシュを使用してカスタムクエリをキャッシュできます。これは、12時間クエリをキャッシュするためのset_transientキャッシュの簡単なコードです。 12時間以内にWordPressは新しいクエリを作成しませんが、一時的なものから投稿を取得します。有効期限が切れると、次の12時間、新しいクエリが一時的に保存されます。

私は私のウェブサイト上の多くのクエリに一時的なものを使用してきましたが、有効期限を慎重に設定するようにしてください。

<?php 

    // Check for transient. If none, then execute Query
    if ( false === ( $postslist = get_transient( 'postslist_query' ) ) ) {

        $args = array(
            'numberposts' => 10,
            'orderby'       => 'meta_value_num',
            'order'         => 'DESC',
            'meta_key'      => 'event_date',
            'meta_query'    => array(
                array(
                    'key' => 'event_date',
                    'value' => $today,
                    'compare' => '<=',
                    'type' => 'NUMERIC'
                )
            )
        );

        $postslist = get_posts( $args );

      // Put the results in a transient. Expire after 12 hours.
      set_transient( 'postslist_query', $postslist, 12 * 60 * 60 );

    }

    foreach ( $postslist as $post ) :  setup_postdata( $post );

?>

一時API の詳細

6
Robert hue

@ Robert-hueのコードをget_cached_postsというヘルパーメソッドにラップしました。これは、トランジェントキャッシングを有効にしたget_postsの代わりのドロップインです。

/**
 * Gets cached posts for a query. Results are stored against a hash of the
 * parameter array. If there's nothing in the cache, a fresh query is made.
 * 
 * @param Array $args The parameters to pass to get_posts().
 * @return Array List of posts matching $args.
 */
public static function get_cached_posts( $args )
{
    $post_list_name = 'get_posts_' . md5( json_encode( $args ) );

    if ( false === ( $post_list = get_transient( $post_list_name ) ) ) {
        $post_list = get_posts( $args );

        set_transient( $post_list_name, $post_list, 86400 );
    }

    return $post_list;
}

注:86400は1日です。

0
aalaap