前提
検索欄(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); }
>(Ajex以外の方法が知りたいです)
Ajaxでできそうなのであればそちらで実装してみては?
Ajaxであってもそうでなくてもサーバサイドの処理は同じですが。
Ajexですと記事とRSSを交互に表示するように作りこんでいるため、自力では実装不可能だと思われます。
デザインが崩れてしまう恐れがあるためphpでの実装を考えています。
AjaxでもリクエストをJavaScriptで構成するだけで、リクエストを受け取って検索処理を行うのはPHPの仕事です。
※細かいですがA j a xです
リクエストを送るフォームと送信を受け取るところは分かりますか?
いずれにしてもテーマ自作するとなるとそれなりにきちんとPHPだけでなくWebの仕組みをきちんとおさえる必要があります。
送る側がfront-page.phpで受け取る側がsearch.phpですね。一応仕組みは抑えております。wordpressの書き方がわからず困っている状態です。
phpで作成できる状態でAjaxまで導入するような必要性がないので、避けたいです。
Ajaxでした。指摘ありがとうございます。
質問は編集できますので、本文も直しておいてください。
仕組みがわかっているのでしたらWordpressでもそう変わらないのでは。
リクエスト送って受け取って検索処理して結果を返してHTMLを出力する。
どこまでできて、何ができていませんか?
下記の文で出力はできたのですが、データベースから各コンテンツを出力するところで苦戦しています。
<?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; ?>
こちらの文を$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);
}
カテゴリーを出力する場合は下記のコードで書き方は正しいでしょうか?
<?php
$categories = [];// カテゴリーIDをキーにしたカテゴリー配列を生成
foreach(get_categories($result->post_id) as $category) {
$categories[$category->cat_ID] = $category;
}
?>
コード込みでしたら質問本文に追記をお願いします
了解いたしました。