WordPresのDBに対して、PHPを使用してSQLを投げ、DBから値を引っ張ってきてごちゃごちゃしたかった。
ただ、PHPの変数値をSQLの中に埋め込む再に、直接以下のようにドット演算子で繋げて文字列を書くと見通しが悪くなる。
$sql = "SELECT * FROM wp_posts WHERE ID = ". $ID . ";";
また、直接変数を埋め込むのはSQLインジェクションの危険性がある。
そのため以下のようにプレースホルダを使用して書く。
$prepared_fetch_category = $wpdb->prepare(
"
SELECT WPP.ID FROM wp_posts AS WPP
INNER JOIN wp_term_relationships AS WPTR
ON WPP.ID = WPTR.object_id
INNER JOIN wp_term_taxonomy AS WPTT
ON WPTR.term_taxonomy_id = WPTT.term_taxonomy_id
INNER JOIN wp_terms AS WPT
ON WPTT.term_id = WPT.term_id
WHERE WPP.post_type = %s //(='books')
AND WPP.post_status = %s //(='publish')
AND WPT.slug = %s //(= $KEY)
ORDER BY ". $SORT_KEY. " ". $SORT_VALUE.
"
LIMIT %d , %d; //(=$start_page_num, $max_page_num)
",
'books', 'publish', $KEY, $start_page_num, $max_page_num
);
// %d -> 整数
// $s -> 文字列
// $f -> 小数
// ただし%sが文字列に置換される再に値がクオートで囲まれるため、WHERE句の値では使用できるが
// 'DESC'のようにORDER句などのクオートで囲む必要の内部分で使用するとSQLが正しく処理されない。
// そのため、クオートで囲う必要のない部分はドット演算子でPHP変数を繋ぐ必要がありそう。
上記のようにプリペアードステートメントを用意してから、下記のようにget_resultsで値を取得するのが望ましいようです。
$rows = $wpdb -> get_results($prepared_fetch_category);
もっとよい記載の方法などありましたら、是非ご教授ください。
##参考
関数リファレンス/wpdb Class