質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

600閲覧

テーマを自作した場合の検索ページの作り方がわからない(Ajex以外の方法が知りたいです)

homepage-site

総合スコア27

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/04/18 08:19

編集2022/04/19 21:12

前提

検索欄(front-page.php)と受け取り側(search.php)の2ファイルを用意

実現したいこと

カスタムフィールド名で絞り込み検索を実装したい

発生している問題・エラーメッセージ

検索条件にヒットした募集はありませんでした。と表示されており、検索ページをどのように作成すればいいのかアドバイスをお願いいたします。 front.page.phpに表示しているコンテンツを検索ページにも表示したいです。

該当のソースコード

front-page.php <?php//検索に使用されるページのセクションを識別するために使用,actionはリダイレクトさせたいページ?> <form role="search" method="get" id="searchform" class="searchform" action="http://example.com/"> <div class="hole"> <div class="left"> <label class="screen-reader-text" for="s">キーワード検索</label> </div> <div class="right"> <input type="text" value="" name="s" id="s" placeholder="例)年齢不問"/> <button type="submit" id="searchsubmit"><i class="fa fa-search"></i> 検索</button> </div> </div> </form>
search.php <form method="get" class="single1-search" action="<?php echo esc_url( home_url( '/' ) ); ?>" > <input type="hidden" name="post_type" value="post"> <input type="text" placeholder="<?php if(!is_search()){ echo 'テストから探す';} ?>" value="<?php if(is_search()){ echo get_search_query();} ?>" class="test-searchbody" name="s"> <button type="submit" class="test-searchbutton"></button> </form> <?php $search_query = get_search_query(); ?> <?php global $wpdb; ?> <?php $results = $wpdb->get_results($wpdb->prepare(" FROM $wpdb->postmeta INNER JOIN $wpdb->posts ON post_id = ID WHERE {$wpdb->postmeta}.meta_key IN ('single_rss_feed1') AND meta_value LIKE '{$search_word}' AND post_status = 'publish'", "%$search_query%")); ?> <?php//検索コンテンツを表示させるコード?> <?php//ここから記事表示?> <?php if ($results) : ?> <ul> <?php foreach ($results as $result) : ?> <?php $item = get_post($result->post_id); // ※1 set_other_data($item); // ※2 echo '<ul>'; echo "<li>$item->post_title</li>"; echo "<li><img src=\"{$item->thumbnail}\"></li>"; echo '</ul>'; ?> <?php endforeach; ?> </ul> <?php else : ?> <p><?php echo esc_html('検索条件にヒットした募集はありませんでした。'); ?></p> <?php endif; ?>

search.phpに表示したいコンテンツ

$categories = [];// カテゴリーIDをキーにしたカテゴリー配列を生成 foreach (get_categories() as $category) {//配列の要素のある分だけ繰り返し処理を行う $categories[$category->cat_ID] = $category;// カテゴリーidの取得 } function set_other_data($post) { // アイキャッチIDを取得 $post_thumbnail_id = get_post_thumbnail_id($post); // アイキャッチ画像の確認 if ($post_thumbnail_id) { // 存在する $image_src = wp_get_attachment_image_src($post_thumbnail_id); // サムネイルの画像URLを設定 $post->thumbnail = $image_src[0]; } else { // 存在しない $post->thumbnail = 'noimage.jpg'; } // カテゴリーIDを取得 $post->categories = wp_get_post_categories($post->ID); // コメントテキスト if (0 == $post->comment_count) { // コメントなし $post->comments = __('No Comments'); } else { // コメントあり $post->comments = $post->comment_count.'件のコメント'; } // コメントリンク $post->comments_link = get_comments_link($post->ID); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2022/04/18 08:25

>(Ajex以外の方法が知りたいです) Ajaxでできそうなのであればそちらで実装してみては? Ajaxであってもそうでなくてもサーバサイドの処理は同じですが。
homepage-site

2022/04/18 08:28

Ajexですと記事とRSSを交互に表示するように作りこんでいるため、自力では実装不可能だと思われます。 デザインが崩れてしまう恐れがあるためphpでの実装を考えています。
m.ts10806

2022/04/18 08:36 編集

AjaxでもリクエストをJavaScriptで構成するだけで、リクエストを受け取って検索処理を行うのはPHPの仕事です。 ※細かいですがA j a xです リクエストを送るフォームと送信を受け取るところは分かりますか? いずれにしてもテーマ自作するとなるとそれなりにきちんとPHPだけでなくWebの仕組みをきちんとおさえる必要があります。
homepage-site

2022/04/18 08:46

送る側がfront-page.phpで受け取る側がsearch.phpですね。一応仕組みは抑えております。wordpressの書き方がわからず困っている状態です。
homepage-site

2022/04/18 08:49

phpで作成できる状態でAjaxまで導入するような必要性がないので、避けたいです。
homepage-site

2022/04/18 08:51

Ajaxでした。指摘ありがとうございます。
m.ts10806

2022/04/19 02:34

質問は編集できますので、本文も直しておいてください。
m.ts10806

2022/04/19 02:35

仕組みがわかっているのでしたらWordpressでもそう変わらないのでは。 リクエスト送って受け取って検索処理して結果を返してHTMLを出力する。 どこまでできて、何ができていませんか?
homepage-site

2022/04/19 06:38

下記の文で出力はできたのですが、データベースから各コンテンツを出力するところで苦戦しています。 <?php $search_query = get_search_query(); ?> <?php global $wpdb; ?> <?php $results = $wpdb->get_results($wpdb->prepare(" SELECT DISTINCT post_id FROM $wpdb->postmeta INNER JOIN $wpdb->posts ON post_id = ID WHERE {$wpdb->postmeta}.meta_key= %s IN ('single_rss_feed1') AND post_status = 'publish'", "%%$search_query%%")); ?> <?php if ($results) : ?> <ul> <?php foreach ($results as $result) : ?> <li> <a href="<?php echo get_permalink($result->post_id); ?>"> <?php echo get_the_title($result->post_id); ?> </li> <?php endforeach; ?> </ul> <?php else : ?> <p><?php echo esc_html('検索条件にヒットした募集はありませんでした。'); ?></p> <?php endif; ?>
homepage-site

2022/04/19 06:40

こちらの文を$wpdbから出力したいのですが、1つずつアドバイスをいただけると助かります。 $categories = [];// カテゴリーIDをキーにしたカテゴリー配列を生成 foreach (get_categories() as $category) {//配列の要素のある分だけ繰り返し処理を行う $categories[$category->cat_ID] = $category;// カテゴリーidの取得 } function set_other_data($post) { // アイキャッチIDを取得 $post_thumbnail_id = get_post_thumbnail_id($post); // アイキャッチ画像の確認 if ($post_thumbnail_id) { // 存在する $image_src = wp_get_attachment_image_src($post_thumbnail_id); // サムネイルの画像URLを設定 $post->thumbnail = $image_src[0]; } else { // 存在しない $post->thumbnail = 'noimage.jpg'; } // カテゴリーIDを取得 $post->categories = wp_get_post_categories($post->ID); // コメントテキスト if (0 == $post->comment_count) { // コメントなし $post->comments = __('No Comments'); } else { // コメントあり $post->comments = $post->comment_count.'件のコメント'; } // コメントリンク $post->comments_link = get_comments_link($post->ID); }
homepage-site

2022/04/19 07:17 編集

カテゴリーを出力する場合は下記のコードで書き方は正しいでしょうか? <?php $categories = [];// カテゴリーIDをキーにしたカテゴリー配列を生成 foreach(get_categories($result->post_id) as $category) { $categories[$category->cat_ID] = $category; } ?>
m.ts10806

2022/04/19 06:59

コード込みでしたら質問本文に追記をお願いします
guest

回答1

0

検索条件にヒットした募集はありませんでした。と表示されており、検索ページをどのように作成すればいいのかアドバイスをお願いいたします。

else の

<p><?php echo esc_html('検索条件にヒットした募集はありませんでした。'); ?></p>

が表示されており、検索結果の $result が 0件ですが検索ページ自体は動作しているようにみえますので、検索ページの作り自体は問題ないと思います。

データがあるはずなのに「検索結果の $result が 0件」になるということであれば、投稿データの中身や検索しているデータが、こちらではわからないのでなんとも言えません。

データが有るのに 0件となるのであれば、検索条件が間違っていると思われますので、検索条件を見直してください。

たとえば、

<?php $results = $wpdb->get_results($wpdb->prepare(" FROM $wpdb->postmeta INNER JOIN $wpdb->posts ON post_id = ID WHERE {$wpdb->postmeta}.meta_key IN ('single_rss_feed1') AND meta_value LIKE '{$search_word}' AND post_status = 'publish'", "%$search_query%"));

meta_value LIKE '{$search_word}' の部分で $search_word とあります。いきなり $search_word が出てきていますが $search_word って何が入っている変数ですか?

質問に記載されている部分以外で定義されているのでしょうか。


もしかして、prepare のプレースホルダーとして記載されているということでしょうか。

関数リファレンス/wpdb Class の SQL インジェクション攻撃からクエリを保護する

使い方

<?php $sql = $wpdb->prepare( $query, $value_parameter[, $value_parameter ... ] ); ?>

 
パラメータ
query
(文字列) 実行したい SQL クエリ。%s および %d がプレースホルダーになる。

とあるように %s%d が、プレースホルダーです。

投稿2022/04/19 04:47

編集2022/04/19 04:53
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

homepage-site

2022/04/19 06:42

1つずつ説明文を追加していくと表示することができました。 下記の文で出力はできたのですが、データベースから各コンテンツを出力するところで苦戦しています。 <?php $search_query = get_search_query(); ?> <?php global $wpdb; ?> <?php $results = $wpdb->get_results($wpdb->prepare(" SELECT DISTINCT post_id FROM $wpdb->postmeta INNER JOIN $wpdb->posts ON post_id = ID WHERE {$wpdb->postmeta}.meta_key= %s IN ('single_rss_feed1') AND post_status = 'publish'", "%%$search_query%%")); ?> <?php if ($results) : ?> <ul> <?php foreach ($results as $result) : ?> <li> <a href="<?php echo get_permalink($result->post_id); ?>"> <?php echo get_the_title($result->post_id); ?> </li> <?php endforeach; ?> </ul> <?php else : ?> <p><?php echo esc_html('検索条件にヒットした募集はありませんでした。'); ?></p> <?php endif; ?>
homepage-site

2022/04/19 06:50

下記のコンテンツを表示したいのですが、function set_other_dataをデータベースで出力するコードが正しいのかわかりません。書き方はあってますでしょうか? $categories = [];// カテゴリーIDをキーにしたカテゴリー配列を生成 foreach (get_categories() as $category) {//配列の要素のある分だけ繰り返し処理を行う $categories[$category->cat_ID] = $category;// カテゴリーidの取得 } function set_other_data($post) { // アイキャッチIDを取得 $post_thumbnail_id = get_post_thumbnail_id($post); // アイキャッチ画像の確認 if ($post_thumbnail_id) { // 存在する $image_src = wp_get_attachment_image_src($post_thumbnail_id); // サムネイルの画像URLを設定 $post->thumbnail = $image_src[0]; } else { // 存在しない $post->thumbnail = 'noimage.jpg'; } // カテゴリーIDを取得 $post->categories = wp_get_post_categories($post->ID); // コメントテキスト if (0 == $post->comment_count) { // コメントなし $post->comments = __('No Comments'); } else { // コメントあり $post->comments = $post->comment_count.'件のコメント'; } // コメントリンク $post->comments_link = get_comments_link($post->ID); }
homepage-site

2022/04/19 07:44 編集

※データベース用に書き換えたコード <? php function set_other_data($result->post_id) { // アイキャッチIDを取得 $post_thumbnail_id = get_post_thumbnail_id($result->post_id); // アイキャッチ画像の確認 if ($post_thumbnail_id) { // 存在する $image_src = wp_get_attachment_image_src($post_thumbnail_id); // サムネイルの画像URLを設定 $post->thumbnail = $image_src[0]; } else { // 存在しない $post->thumbnail = 'noimage.jpg'; } // カテゴリーIDを取得 $post->categories = wp_get_post_categories($result->post_id); // コメントテキスト if (0 == $post->comment_count) { // コメントなし $post->comments = __('No Comments'); } else { // コメントあり $post->comments = $post->comment_count.'件のコメント'; } // コメントリンク $post->comments_link = get_comments_link($result->post_id); } ?>
CHERRY

2022/04/19 09:07

> WHERE {$wpdb->postmeta}.meta_key= %s IN ('single_rss_feed1') > AND post_status = 'publish'", meta_key に プレースホルダー を設定していますが、 meta_key の名前を検索したいのでしょうか? カスタムフィールド `single_rss_feed1` の値から検索フォームに入力した文字列を検索するのであれば、 WHERE {$wpdb->postmeta}.meta_key IN ('single_rss_feed1') AND {$wpdb->postmeta}.meta_value LIKE '%s' のように meta_value に プレースホルダー を設定します。
CHERRY

2022/04/19 09:09

> function set_other_dataをデータベースで出力するコードが正しいのかわかりません。書き方はあってますでしょうか? 「データベースで出力するコード」とはどのようなことがしたいのでしょうか? $post を書き換えようとしていますが、何をするためのコードでしょうか。 また、 function set_other_data は、どこのテンプレートファイルに記載されているのでしょうか。set_other_data をどこで呼び出しているのでしょうか?
homepage-site

2022/04/19 09:36

回答ありがとうございます。 meta_key(カスタムフィールド)で検索したいです。 3つ記事のファイルを分けておりまして、single-rss-feedとdouble-rss-feedとtriple-rss-feedと3パターンで表示させたいので、分割しております。 コードの訂正ありがとうございます。修正させていただきました。
homepage-site

2022/04/19 09:43

元のコードが長いので説明させていただきますと、記事の表示を制限するために$postを使用しております。 呼び出しは同じページ内に設置しております。 <?php $dbh = connect_db(); $categories = []; foreach (get_categories() as $category) { $categories[$category->cat_ID] = $category; } function set_other_data($post) { // アイキャッチIDを取得 $post_thumbnail_id = get_post_thumbnail_id($post); // アイキャッチ画像の確認 if ($post_thumbnail_id) { // 存在する $image_src = wp_get_attachment_image_src($post_thumbnail_id); // サムネイルの画像URLを設定 $post->thumbnail = $image_src[0]; } else { // 存在しない $post->thumbnail = 'noimage.jpg'; } // カテゴリーIDを取得 $post->categories = wp_get_post_categories($post->ID); // コメントテキスト if (0 == $post->comment_count) { // コメントなし $post->comments = __('No Comments'); } else { // コメントあり $post->comments = $post->comment_count.'件のコメント'; } // コメントリンク $post->comments_link = get_comments_link($post->ID); } ・ ・ ・ $group_per_block = 5; //ブロックあたり投稿グループ件数 //投稿読み込み $posts_per_block = $wp_query->post_count / $block_per_page;//元々設定したコードを追加 $posts_per_page = $block_per_page * $group_per_block; //ページあたり投稿件数 5×2の10件画像は1なので$posts_per_group省略 $posts_offset = ($current_page - 1) * $posts_per_page; //投稿オフセット $args = [ 'posts_per_page' => $posts_per_page, 'offset' => $posts_offset, ]; $post_items = get_posts($args); echo '<h3>投稿</h3>'; //ここから画像とタイトルの処理 echo '<ul>'; for ($j = 0; $j < $posts_per_block; ++$j) { $item_index = $i * $posts_per_block + $j;//$group_per_blockがないので$kも省略 if ($item_index >= count($post_items)) { break; } $item = $post_items[$item_index]; //タイトルの保存は省略 echo '<ul>'; echo "<li><a href=\"{$item->guid}\">{$item->post_title}</a></li>"; echo "<li><a href=\"{$item->guid}\"><img src=\"{$item->thumbnail}\"></a></li>";echo "<li><img src=\"{$item->thumbnail}\"></li>"; echo "<li>{$item->post_date}</li>"; if ($item->categories) { foreach ($item->categories as $cat_ID) { $category = $categories[$cat_ID]; echo "<li>{$category->cat_name}</li>"; } } echo "<li><a href=\"{$item->guid}\">{$item->comments}</a></li>"; echo "<li>{$item->post_excerpt}</li>"; echo '</ul>'; } } こちらが記事の表示コードとなります。流れとしましては、'posts_per_page' => $posts_per_page,を使い1ページの記事数を5×2ブロックで表示しています。
homepage-site

2022/04/19 09:47

RSS→記事→RSS→記事と表示しており、RSSと記事を足した数を1ブロックとして×2を1ページのコンテンツ数として計算しております。
homepage-site

2022/04/19 10:21

$wpdbはper_pageで1ページの投稿数を制限できるのはわかるんですが、画像の表示コードは初めからばらして考えるべきでしょうか?
homepage-site

2022/04/19 11:06

<?php echo get_post_thumbnail($result->post_id); ?> ですと重大なエラーが表示されます。 $resultを使用せずに実装する方法はあるのですが、$resultでカスタムフィールド名を制限しているようなので、使用して表示しないといけないのですが、画像の階層が違うのかよくわからないです。 どうすればいいでしょうか?
CHERRY

2022/04/19 11:51

いろいろ、疑問点があるので... > 記事の表示を制限するために$postを使用しております。 WordPress の $post は、ループ内で WordPress が必要に応じて書き換えますので、ユーザー側で $post を書き換えることは通常無いと思うのですが、「$post を書き換えて、記事の表示を制限する」というのは、どこからの情報ですか? 出典を記載していただくことはできないでしょうか。 ---- connect_db() 関数が出てきました。 $wpdb で,データベースにアクセスしているのに 別のデータベース接続を使用する理由は何でしょうか? WordPress と別のデータベースから情報を取得するのでしょうか? ---- > <?php echo get_post_thumbnail($result->post_id); ?> > ですと重大なエラーが表示されます。 重大なエラーとは、どのようなエラーメッセージが出ているのでしょうか。 WordPress をデバッグモードにして、PHP のエラーメッセージを表示させる or Webサーバのログから PHP のエラーメッセージを確認して、どのようなエラーメッセージが出ているか確認してください。
CHERRY

2022/04/19 12:12

コメント欄に記載されているコードを見るといろいろ迷走しているので、最初に戻りますが質問の search.php のコード ``` <?php $results = $wpdb->get_results($wpdb->prepare(" FROM $wpdb->postmeta INNER JOIN $wpdb->posts ON post_id = ID WHERE {$wpdb->postmeta}.meta_key IN ('single_rss_feed1') AND meta_value LIKE '{$search_word}' AND post_status = 'publish'", "%$search_query%")); (以下略) ``` のコードも ``` $arg = get_posts( array( 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'single_rss_feed1', 'value' => $search_query, 'compare' => 'LIKE', ), ), )); $the_query = get_posts( $args ); if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); // 投稿を表示するコード endwhile; wp_reset_postdata(); (以下略) ``` のようにカスタムフィールド single_rss_feed1 に $search_query の内容を含む( LIKE ) 投稿を検索することは WordPress 関数だけで実現できると思います。(ただ、質問に記載されていない条件があるのかもしれませんが... 書いてないことはわかりません。) 参考:[関数リファレンス/WP_Query](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/WP_Query) の「カスタムフィールドのパラメータ」参照 このように WordPress 関数でのメインループやサブループを使用して、投稿の表示を実現すると WordPress 関数が問題なく使用できますので、 $post に上書きする等を考えなくても良いと思います。 わざわざ set_other_data を作らなくても 上記の「 // 投稿を表示するコード」部分に カテゴリーの表示は、 ` the_category(); ` で表示できますし、 サムネイル表示であれば ``` if ( has_post_thumbnail() ){ the_post_thumbnail('midium'); } else { echo "<img src="<?php echo get_template_directory_uri(); ?>/noimage.jpg" alt="" />" } ``` のような感じで表示できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問