2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

WordPressで自作テーブルを検索できるようにした

Posted at

本稿は下記案件の続きです。併せてご参照下さい。

前回は、データベースに商品情報テーブルを作成し、ホームページで各商品の価格を表示できるようにしました。
そうなると欲が出てきます。
せっかく信頼できるデータがWeb/DBサーバにあるのだから、検索できた方が便利ですよね。

サービスセンターには、卸売業者や小売業者、代理店から一般消費者まで、じつに様々な関係先から、商品に関するお問い合わせがあります。
その対応は、内製のMicrosoft Accessアプリケーションで捌きますが、関係先が自己解決できるなら皆にとってハッピーです。

ということで作りましたよ。簡単なので是非やってみて下さい。

検索フォームを作ろう

画像のような検索フォームを作成し、トップページに置きました。
image.png
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; } ?>

ページネーションは少し面倒くさかったので実装しませんでした。
全角/半角、大文字/小文字の区別なく、検索できるようにしています。
いかかでしょうか。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?