WPDBでの検索結果をWPループに渡す。SQLもすっきり♪
WordPressで検索のカスタマイズをする様々なケース
search.phpテンプレートでの検索のカスタマイズやpostsモデルのデータを絞り込み検索させ
たり、カスタム投稿やtaxonomyで検索するケースなどがあると思います。
posts_joinやposts_request、posts_whereをフックして出来たSQLを見てみると不要な
コードが混入していたり。。
ページングやループに渡したりするのが面倒くさそうだなー。とカスタムを断念した経験が
ある方もいらっしゃると思います。
$wpdbの結果をquery_posts()に渡してしまう
シンプルに$wpdbで検索して、WPループに渡してページングまで実装する最短のやり方を模索
してみたのでご紹介です。
<?php // パラメーターの取得 $cat_num = $_REQUEST['cat'] ? $_REQUEST['cat'] : false; $query_s = $_REQUEST['s'] ? $_REQUEST['s'] : false; $paged = $_REQUEST['paged'] ? $_REQUEST['paged'] : false; global $wpdb; $cat_query = ''; $join_table = ''; $com_category = ''; // カテゴリがある if ( !empty($cat_num) ) { $join_table = " INNER JOIN wp_term_relationships AS tr ON tr.object_id = post.ID INNER JOIN wp_term_taxonomy AS tt ON tt.term_taxonomy_id = tr.term_taxonomy_id INNER JOIN wp_terms AS t ON t.term_id = tt.term_id "; $com_category = " tt.taxonomy IN ('使っているタクソノミー名')"; $cat_query = " AND tt.term_id = $cat_num"; $cat_query = esc_sql($cat_query); } $word_query = ''; // クエリワードがある if ( !empty($query_s) ) { $and_str = $cat_num ? ' AND' : ''; $query_s = esc_sql($query_s); $word_query = $and_str. " (((post.post_title LIKE '%$query_s%') OR (post.post_content LIKE '%$query_s%')))"; } // SQL $query_str = " SELECT post.ID FROM wp_posts AS post ". $join_table. " WHERE ". $com_category. $cat_query . $word_query . " AND post.post_type IN ('page', 'カスタム投稿名') // 検索対象 AND (post.post_status = 'publish' OR post.post_author = 1 AND post.post_status = 'private') "; $results = $wpdb->get_results($query_str); $ids = NULL; foreach ($results as $value) { $ids[] = $value->ID; } // 結果IDを query_posts() に渡しでループを回す $args['post__in'] = $ids; $args['post_type'] = array('page', 'カスタム投稿名'); if ( !empty($paged) ) $args['paged'] = $paged; query_posts($args); ?>
これで様々な検索に対応できます。
※ 上記ソースは参考までに
関連記事