本稿は下記案件の続きです。併せてご参照下さい。
前回は、データベースに商品情報テーブルを作成し、ホームページで各商品の価格を表示できるようにしました。
そうなると欲が出てきます。
せっかく信頼できるデータがWeb/DBサーバにあるのだから、検索できた方が便利ですよね。
サービスセンターには、卸売業者や小売業者、代理店から一般消費者まで、じつに様々な関係先から、商品に関するお問い合わせがあります。
その対応は、内製のMicrosoft Accessアプリケーションで捌きますが、関係先が自己解決できるなら皆にとってハッピーです。
ということで作りましたよ。簡単なので是非やってみて下さい。
検索フォームを作ろう
画像のような検索フォームを作成し、トップページに置きました。
HTMLはこんな感じになりますね。
HTML
<form action="/search" method="post">
<span>商品コード</span>
<input type="text" name="p_code" placeholder="前方一致" autofocus>
<span>品名</span>
<input type="text" name="p_name" placeholder="部分一致">
<input type="submit" value="商品検索">
</form>
検索用のコードを書こう
検索ボタンをクリックしたら、入力データを/search
にPOSTするので、/search
に対応するWordPressのページに、PHPでコードを埋め込むだけです。
Qiita向けに改変した上で掲載します。
page-search.php
<?php
while(true) {
// POSTメソッドで無ければ何もせずに抜ける
if($_SERVER['REQUEST_METHOD'] !== 'POST') {
break;
}
global $wpdb;
// 商品コードが入力されていたら
if (isset($_POST['p_code']) && !empty($_POST['p_code'])) {
$str = trim(strtoupper(mb_convert_kana($_POST['p_code'], 'as')));
if (strlen($str) < 2) {
echo '<p>商品コードは2文字以上で指定して下さい</p>';
break;
}
$message = '商品コードが <span class="nor">' . htmlentities($str) . '</span> で始まる商品の一覧です。';
// 商品コード検索SQL作成
$query = $wpdb->prepare("SELECT * FROM $wpdb->foo_product WHERE code like %s ORDER BY code", $wpdb->esc_like($str).'%');
// 品名が入力されていたら
} elseif(isset($_POST['p_name']) && !empty($_POST['p_name'])) {
$str = trim(strtoupper(mb_convert_kana($_POST['p_name'], 'as')));
if (strlen($str) < 3) {
echo '<p>品名は3文字以上で指定して下さい</p>';
break;
}
$message = '品名に <span class="nor">' . htmlentities($str) . '</span> を含む商品の一覧です。';
// 品名検索SQL作成
$query = $wpdb->prepare("SELECT * FROM $wpdb->foo_product WHERE name like %s ORDER BY code", '%'.$wpdb->esc_like($str).'%');
} else {
echo '<p>商品コードまたは品名を指定して下さい</p>';
break;
}
// SQL実行
$rows = $wpdb->get_results($query);
if(empty($rows)) {
echo '<p>検索条件に一致する商品の登録がありません</p>';
break;
}
if($wpdb->num_rows > 100) {
echo '<p>検索条件に一致する商品数が多すぎます。検索条件を見直して下さい</p>';
break;
}
// エラーが無ければここにくる
?>
<table>
<tr>
<th>商品コード</th>
<th>品名</th>
<th>定価</th>
<th>区分</th>
</tr>
<?php foreach($rows as $row) { ?>
<tr
<?php
$p_name = esc_html($row->name);
// 品名に「廃盤」が含まれていればグレーアウト
if (mb_strpos($p_name, '廃盤') !== false) {
echo ' class="gray-out"';
}
?>
>
<td><?php echo $row->code ?></td>
<td><?php echo $p_name; ?></td>
<td><?php echo number_format($row->price); ?></td>
<td><?php echo $row->class ?></td>
</tr>
<?php } ?>
</table>
<?php break; } ?>
ページネーションは少し面倒くさかったので実装しませんでした。
全角/半角、大文字/小文字の区別なく、検索できるようにしています。
いかかでしょうか。