ワードプレスで巨大な投稿やカスタム投稿データがある場合や、複雑な条件で投稿を検索して表示したい場合に直接SQL文を発行して検索し検索結果を表示する方法を解説いたします。


ワードプレスで直接SQL文を実行するには?

ワードプレスでは $wpdbというグローバル変数に既にMYSQL接続済みの処理を渡すだけの構造体がありますのでそちらを利用して直接SQL文を発行することが可能です。
下記の例では、投稿を50件抽出してその投稿のIDを50件表示するプログラムになります。

global $wpdb;
$query = "SELECT * FROM wp_post WHERE post_type = 'post' LIMIT  50;";
$rows = $wpdb->get_results($query);
foreach($rows as $row) {
    echo $row->post_id; 
}

ワードプレスで直接SQL文を実行して検索結果を表示してみましょう

次にマニアックな方法ですが、ワードプレスで直接SQL文を実行して検索結果を表示してみることにします。この検索結果はSQLの結果から通常のワードプレスのクエリに置き換えてループとして結果を表示できるようにしています。

ワードプレスに巨大な投稿数があって、複雑な検索条件を付与して検索する場合は、直接SQL文を発行することで劇的に検索速度を向上させることが可能な場合がございます。

<?php
global $wpdb;
$postperpages = 20; //①
$searchword = "日本";//②
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;//③

$pf = ($paged-1)*$postperpages;
$pe = ($paged)*$postperpages;

$query = "SELECT * FROM wp_post WHERE post_type = 'post' and post_title LIKE '%".$searchword."%' ORDER BY post_date DESC LIMIT ".$pf.",".$pe.";"; 
$rows = $wpdb->get_results($query);
$searchids = array();
foreach($rows as $row) {
$searchids[] = $row->post_id; //④
}

$args = array(
'post_type'=>'post',
'post__in'=> $searchids,
'orderby'=>'post__in'
); //⑤

$my_query = new WP_Query($args); //⑥

?>
<?php while($my_query->have_posts()) : $my_query->the_post(); ?>
通常のループ処理 ⑦
<?php endwhile; ?>

コードの解説

①1ページに表示する投稿数を設定しています

②このコードの例ではタイトルに「日本」を含む投稿を検索します

③検索結果のページ番号を取得してそのページ内の投稿のみを表示するための準備です

④ここで検索結果のpost_idを配列に入れいます

⑤次に正規のワードプレスのクエリを作ります。post__inとは④で作った配列に含まれる投稿のみを取得するという意味です。’orderby’=>’post__in’を指定し並び順も④の配列の通りとします。

⑥ワードプレスのクエリを発行します。

⑦ここからワードプレスではよく見るループ処理ですね。お好きな加工をしてサイト上に出力することができます。

ワードプレスの検索機能の高速化、カスタマイズはWPドクターにご相談・ご依頼ください