ワードプレスのデータベース内で、例えば「クエリの中に変数の値を渡したい」と思った時に、これ一体どうやれば…?というところで躓いたいので、まとめてみました。
クエリでレコード数を抽出する(num_rows)
こちらは前回のおさらいですが、クエリを使ってレコード数を取得する時にはnum_rowsを使って取得することができました。
$query = 'SELECT * FROM wp_posts WHERE post_author=15';
$result = $wpdb->get_results($query);
$num = $wpdb->num_rows;
echo "レコード数:";
echo $num;
クエリに変数を渡す時は…?
例えば「ログインユーザーの投稿数を取得したい」と思った時には、クエリのWHEREの中に変数を入れる方法を思いつきましたが(きっと他にもあるだろうとは思いますが…!)、これ一体どうやれば?ということで躓きました。
はて・・・ここから、どうやってpost_authorに渡せば?
$uu_id = get_current_user_id();
echo "ユーザーID:";
echo $uu_id;
echo "<br>";
$query = 'SELECT * FROM wp_posts WHERE post_author=15';
$result = $wpdb->get_results($query);
$num = $wpdb->num_rows;
echo "レコード数:";
echo $num;
ということで、色々と試してみたいと思います。
[rml_read_more]
そのまま渡してもダメな様子
とりあえず変数を渡せないのかな…?と思って渡してみたところ、ダメでした。
$uu_id = get_current_user_id();
echo "ユーザーID:";
echo $uu_id;
echo "<br>";
$query = 'SELECT * FROM wp_posts WHERE post_author=$uu_id';
$result = $wpdb->get_results($query);
$num = $wpdb->num_rows;
echo "レコード数:";
echo $num;
レコード数は4つあるはずですが・・・0となりました。
区切ってカンマで連結
変数をつなげる時は「.(カンマ)」で区切って、連結させることで読み込むことができます。
$uu_id = get_current_user_id();
echo "ユーザーID:";
echo $uu_id;
echo "<br>";
$query = 'SELECT * FROM wp_posts WHERE post_author='.$uu_id;
$result = $wpdb->get_results($query);
$num = $wpdb->num_rows;
echo "レコード数:";
echo $num;
できました・・・!!
prepare処理をした方がよさそう
話はこれで終わり…でしたが、追記です。mysqlへの変数データの受け渡しはprepare処理をした方が良さそうです。というのもユーザーが入力をしてクエリを実行する場合に、そのまま変数を受け渡すと、SQLで悪意のある処理を実行できてしまうためです。
‘prepare’ メソッドを使うのは、不正な操作や不正な文字を処理しないためです
SQL インジェクション攻撃からクエリを保護するためには、実行する前にクエリデータをすべて SQL エスケープする必要があります。 WordPress では prepare メソッドがこの機能を提供します。
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wpdb_Class
ということで、下記のように変えてみました(合ってるのかな…?)。
$uu_id = get_current_user_id();
echo "ユーザーID:";
echo $uu_id;
echo "<br>";
$sql = 'SELECT * FROM wp_posts WHERE post_author = %d';
$query = $wpdb->prepare($sql,$uu_id);
$result = $wpdb->get_results($query);
$num = $wpdb->num_rows;
echo "レコード数:";
echo $num;
出力結果
レコード数が取れました!
まとめ
ということで、SQLインジェクション対策で最後追記してみましたが、このような感じでユーザーデータや特定の条件のデータをデータベースから抽出することができました。次回は別の抽出パターンなども色々と試していきたいと思います。
ご参考ください😃