WordPressの高速化はChat GPTに聞くと解決することが多い
![](https://vhcinfo.org/wp-content/uploads/2023/11/wordpress-bg-medblue.png)
WordPressでカスタム投稿を組み込み、更にカスタムタクソノミーを使ってタームを多用しているサイトがあったとします。
そのような構成の場合、カスタム投稿の記事をタームでの絞り込むなど、複雑なDBクエリを多用しなければならないことがあります。
最初はいいのですが、サイトの記事が増え、タームも増えてくると、段々サイトが遅くなっていきます。
WordPressの場合は、WP_Queryを使ってDBから情報を抽出します。Worpdpressの組み込み関数のコードは多くの猛者がレビューして無駄がないコードのハズですが、あらゆる用途に対応できるわけではありません。
WordPressを使っている以上、DBの構造がよろしくないので、ある程度は仕方がないのですが、実は、DBを直接叩くことで高速に結果が得られることもあります。
ですが、DBを直接叩くのはある程度の知識がないと苦しいですよね。
また、DBを直接叩くことで高速化されるのかどうかもある程度の知識がないと判断が付きません。
そうなってしまうと、WP_Queryを使うことになり、話がぐるぐる回ってしまいます。
そんな時は、Chat GPTに聞くと完全に動かないまでも9割がた動作するコードを教えてくれます。
Chat GPTにサイト高速化のコードを提案してもらった例
例えば、2つのカスタムタクソノミーのタームに属する記事の数を高速に取得したいとします。あるタームに属する記事を取得して更に他のタームで絞り込むようなイメージです。
WP_Queryを使って、tax_queryのrelationのANDで絞り込むことができますが、速度が遅く使い物になりませんでした。
Chat GPTに聞いたら、WP_Term_Queryを使うコードを提案されました。しかし、複数のタームには対応していませんでした。
$term_query = new WP_Term_Query([
'taxonomy' => 'your_taxonomy_slug', // タクソノミーのスラッグを指定
'include' => $term_id, // タームのIDを指定
'fields' => 'count', // カウントのみを取得するように指定
]);
$term_count = $term_query->get_terms();
if (!empty($term_count)) {
$count = reset($term_count); // 最初のタームのカウントを取得
echo 'タームの記事数: ' . $count;
} else {
echo 'タームが見つかりませんでした';
}
複数のタームに属する記事数を知るための高速なコードを教えて欲しいというと、DBを直接叩くコードを提案してくれました。
$termA = 'termA1'; // タクソノミーAのタームスラッグを指定
$taxonomyA = 'taxonomyA'; // タクソノミーAのスラッグを指定
$termB = 'termB1'; // タクソノミーBのタームスラッグを指定
$taxonomyB = 'taxonomyB'; // タクソノミーBのスラッグを指定
global $wpdb;
$termA_id = $wpdb->get_var(
$wpdb->prepare(
"SELECT term_id FROM {$wpdb->terms} WHERE slug = %s",
$termA
)
);
$termB_id = $wpdb->get_var(
$wpdb->prepare(
"SELECT term_id FROM {$wpdb->terms} WHERE slug = %s",
$termB
)
);
$query = "
SELECT COUNT(DISTINCT p.ID) as post_count
FROM {$wpdb->posts} AS p
INNER JOIN {$wpdb->term_relationships} AS trA ON p.ID = trA.object_id
INNER JOIN {$wpdb->term_relationships} AS trB ON p.ID = trB.object_id
INNER JOIN {$wpdb->term_taxonomy} AS ttA ON trA.term_taxonomy_id = ttA.term_taxonomy_id
INNER JOIN {$wpdb->term_taxonomy} AS ttB ON trB.term_taxonomy_id = ttB.term_taxonomy_id
WHERE p.post_type = 'post' AND p.post_status = 'publish'
AND ttA.taxonomy = %s AND ttA.term_id = %d
AND ttB.taxonomy = %s AND ttB.term_id = %d
AND trA.term_taxonomy_id = ttA.term_taxonomy_id
AND trB.term_taxonomy_id = ttB.term_taxonomy_id
";
$post_count = $wpdb->get_var(
$wpdb->prepare(
$query,
$taxonomyA,
$termA_id,
$taxonomyB,
$termB_id
)
);
echo 'タクソノミーAのタームA1とタクソノミーBのタームB1のAND条件での記事数: ' . $post_count;
まとめ
実際、そのままでは動作しませんでしたが、わずかな調整を行うことで、DBを直接叩く専用のコードが出来上がりました。
サイトのボトルネックを解消するために、Chat GPTにコードを提案してもらうのは、かなり有効な手段であると思います。
問題なのは、Chat GPTがこちらの要求や前提条件をきちんと処理してくれないことが多いことですね。これはChat GPTへの伝え方が悪いのだと思いますが、出てきたコードを自分で精査できない限りは、宝の持ち腐れになってしまうこともあります。
自分が弱い、知識が足りない分野こそ、Chat GPTを使うと使えるコードを出力してくれますので、そこから知識を広げていくのが良さそうです。
コメント