Advanced Custom Fields の関係フィールドを使用して、アーティストをイベントにリンクします。これらのアーティストとイベントはどちらもカスタム投稿タイプです。イベントごとに、関連するアーティストの投稿 ID がカスタム メタ フィールド (lineup_artists) として配列に格納されます。
各イベントページには、すべてのアーティストをリストしています。アーティストをクリックすると、このアーティストを見つけることができるすべてのイベントが表示されます (ブートストラップ モーダルで結果を表示する AJAX 呼び出しを介して)。AJAX 呼び出しをテストしましたが、動作していますが、クエリに問題があります (完了するまでに非常に時間がかかります)。
私の機能では、次のものがあります。
$ArtistID = $_POST['ArtistID']; // Gets the ArtistID from the AJAX call
$meta_query = array(
'key' => 'lineup_artists',
'value' => '"' . $ArtistID .'"',
'compare' => 'LIKE'
);
$args = array(
'post_type' => 'events',
'meta_query' => array($meta_query),
'posts_per_page' => 5,
'post_status' => 'publish',
);
wp_query の結果をダンプすると、次の SQL クエリが得られます。
SELECT SQL_CALC_FOUND_ROWS yt_posts.ID FROM yt_posts
INNER JOIN yt_postmeta ON (yt_posts.ID = yt_postmeta.post_id)
WHERE 1=1
AND yt_posts.post_type = 'events'
AND (yt_posts.post_status = 'publish')
AND ( (yt_postmeta.meta_key = 'lineup_artists' AND CAST(yt_postmeta.meta_value AS CHAR) LIKE '%\"17497\"%') )
GROUP BY yt_posts.ID ORDER BY yt_posts.post_date DESC LIMIT 0, 5
このクエリをphpmyadminに貼り付けると、完了するまでに非常に時間がかかります(時間がかかるため、完了したことはありません)。
これは、アーティスト ID が配列として格納されているためでしょうか。これはあまり効率的ではなく、これらの関係は別のテーブルに格納する必要があると誰かが私に言いました (これはどうすればよいかわかりません)。私のクエリに何か問題がありますか、それともこれはリレーションをクエリする非常に非効率的な方法ですか?