web-dev-qa-db-ja.com

キャッシュエラーのない直接データベース呼び出しの使用

データベースの最初と最後の投稿の年に基づいて動的な著作権年の範囲を作成するカスタム関数があります。

function jldc_copyright_dates() {
    global $wpdb;
    $copyright_dates = $wpdb->get_results( "
        SELECT
            YEAR(min(post_date_gmt)) as firstdate,
            YEAR(max(post_date_gmt)) as lastdate
        FROM
            $wpdb->posts
    " );

    if ( $copyright_dates ) {
        $copyright_year = $copyright_dates[0]->firstdate;
        if ( $copyright_dates[0]->firstdate !== $copyright_dates[0]->lastyear ) {
            $copyright_year .= '—' . $copyright_dates[0]->lastdate;
        }
        echo esc_html( $copyright_year . ' '; );
    }
}

PHPCSをWordPress VIPコード標準で使用していますが、このファイルで実行すると警告が表示されます。Usage of a direct database call is discouraged.

また、私はまたエラーUsage of a direct database call without caching is prohibited. Use wp_cache_get / wp_cache_set or wp_cache_delete.を得る

これらの値がキャッシュされているかどうかを確認するためのテストを実行し、そうでない場合はこのエラーを解決するためにそれらをキャッシュします。

2
Cedon

私は@Tom J Nowellに同意します。

私はあなたがそれを削除することを勧めます、あるいはもっと良いことには「all rights reserved」と言ってください。

しかし、答えを求めて、ここに年をキャッシュするためにオプションフィールドを使う提案があります:

/**
 * Get year range for posts.
 * 
 * @return str
 */
function wpse_226627_get_copyright() {
    if ( ! $years = get_option( 'copyright' ) ) {
        $args = [
            'posts_per_page' => 1,
            'post_type'      => get_post_types([ 'public' => true ]),
            'post_status'    => 'publish',
            'orderby'        => 'post_date',

            /**
             * Don't waste memory we don't need
             */
            'update_post_term_cache' => false,
            'update_post_meta_cache' => false,
            'cache_results'          => false,
        ];

        $newest = get_posts([ 'order' => 'DESC' ] + $args );
        $oldest = get_posts([ 'order' => 'ASC'  ] + $args );
        $years  = [
            'from' => $oldest ? mysql2date( 'Y', $oldest[0]->post_date_gmt ) : '',
            'to'   => $newest ? mysql2date( 'Y', $newest[0]->post_date_gmt ) : '',
        ];

        update_option( 'copyright_years', $years );
    }

    return $years;
}

/**
 * Bust the cache.
 */
function wpse_226627_flush_years( $post_id ) {
    if ( in_array( get_post_type( $post_id ), get_post_types([ 'public' => true ]) ) )
        update_option( 'copyright_years', '' );
}

add_action( 'before_delete_post', 'wpse_226627_flush_years' );
add_action( 'save_post',          'wpse_226627_flush_years' );

この方法では、投稿が作成/更新/削除されたときにのみキャッシュがフラッシュされてデータが移入されるので、(1回の直接データベース呼び出しの代わりに)いくつかの追加クエリはここではそれほど大きくありません。

$years     = wpse_226627_get_years();
$copyright = $years['from'];
if ( $years['from'] != $years['to'] )
    $copyright .= ' — ' . $years['to'];

値を独立して処理できるように(コンパイルされた著作権文字列とは対照的に)年を直列化された配列としてキャッシュすることを選択しました。

3
TheDeadMedic