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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

WordPress

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

PHP

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

Q&A

解決済

1回答

1220閲覧

Wordpressの検索フォームを固定ページ(カスタム投稿の写真ギャラリー)内に設置し、キーワード検索した際にそのページ内だけを検索の対象にしたい

tartnac

総合スコア18

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

WordPress

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

PHP

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

0グッド

0クリップ

投稿2019/08/02 03:23

編集2019/08/02 04:08

###犬の写真ギャラリーページ内で、キーワード検索した犬の写真(と文章)だけを表示したい
①通常表示時
下のようなカスタム投稿ページがあります。(犬の写真ギャラリーページ)
イメージ説明

②理想の検索結果
その中の検索フォームにキーワード(例:ちわわ)を入力すると、そのキーワードが含まれるタイトル&写真を表示したいのです。
イメージ説明

③現実の検索結果
しかしながら、何もいじっていないノーマルな検索フォームから検索をすると、以下のようになってしまいます。
イメージ説明

これを②理想の検索結果に持っていくためにしなければいけないことが、いまいちわからないでいます。

自分で色々と調べてみたりしたんですが、「特定のページを検索結果から除外」で出てくるサイトのほとんどはfunction.php内に何かしらの記述をするというものでした。(それかプラグイン「Search Exclude」を使用する方法)

でもそれをすると、この犬の写真ギャラリーページ内の検索機能だけでなく、全体にまで影響してしまうのではないかな~と思うんです。
このページ内だけの検索機能も欲しいですが、サイトのトップ(右上とか)には通常のサイト内検索機能も残しておきたくって……。
function.phpに記述しちゃうと、どちらか片方しか実現できないように思えまして。

とりあえず、以下のコード(質問用に作ったので実際はちょっと違います)でページを作っています。

php

1<?php // www.domain.com/gallery/のページのコード(固定ページ) page-gallery.php ?> 2<?php get_header(); ?> 3 <div class="container"> 4 <div class="search-form"> 5 <?php get_search_form(); ?> 6 </div> 7 <?php 8 $args = array ( 9 'posts_per_page'=> 8, 10 'paged' => $paged, 11 'post_type' => 'dog', 12 'tax_query' => array ( 13 array ( 14 'taxonomy' => 'taxonomy_dog', 15 'field' => 'slug', 16 'terms' => array ( 17 'term_dog' 18 ), 19 ) 20 ) 21 ); 22 ?> 23 <?php $the_query = new WP_Query( $args ); ?> 24 <?php if ( $the_query->have_posts() ) : ?> 25 <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?> 26 <?php $dog_photo = get_field('dog_photo'); ?> 27 <div class="search-result"> 28 <dl class="text-center"> 29 <dt><a href="<?php echo $dog_photo['sizes']['large']; ?>"><?php echo $dog_photo['sizes']['small']; ?></a></dt> 30 <dd><?php the_title(); ?></dd> 31 </dl> 32 </div> 33 <?php endwhile; ?> 34 <?php endif; ?> 35 <?php if (function_exists('wp_pagenavi')) : ?> 36 <nav aria-label="ページネーション"> 37 <?php wp_pagenavi(array('query' => $the_query)); ?> 38 </nav> 39 <?php endif; ?> 40 <?php wp_reset_query(); ?> 41 </div> 42<?php get_footer(); ?>

で、get_search_form()で呼び出されるものはこちら。

php

1<?php // searchform.php ?> 2<form role="search" method="get" id="searchform" class="searchform" action="<?php echo esc_url( home_url( '/' ) ); ?>"> 3 <div class="form-group has-search"> 4 <label class="screen-reader-text" for="s"><?php _x( 'Search for:', 'label' ); ?></label> 5 <span class="fa fa-search form-control-feedback"></span> 6 <input type="text" value="<?php echo get_search_query(); ?>" name="s" id="s" class="form-control" placeholder="検索"> 7 </div> 8</form>

最後に search.php はこちら。

php

1<?php // search.php ?> 2<?php get_header(); ?> 3 <div class="container"> 4 <?php 5 global $wp_query; 6 $total_results = $wp_query->found_posts; 7 $search_query = get_search_query(); 8 ?> 9 <h1 class="text-white"><?php echo $search_query; ?>の検索結果<span class="small"><?php echo $total_results; ?>件)</span></h1> 10 </div> 11 <div class="container"> 12 <?php if( $total_results > 0 ): ?> 13 <?php if(have_posts()): ?> 14 <?php while(have_posts()): the_post(); ?> 15 <div class="search-result"> 16 <h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4> 17 <p><?php the_excerpt(); ?></p> 18 </div> 19 <?php endwhile; ?> 20 <?php endif; ?> 21 <?php else: ?> 22 <div class="search-result text-center"> 23 <h4><?php echo $search_query; ?> に一致する情報は見つかりませんでした。</h4> 24 </div> 25 <?php endif; ?> 26 <?php if (function_exists('wp_pagenavi')) : ?> 27 <nav aria-label="ページネーション"> 28 <?php wp_pagenavi() ?> 29 </nav> 30 <?php endif; ?> 31 </div> 32<?php get_footer(); ?>

きっとsearch.phpをどうにか変えればいけるんだろうな~と思ってはいるんですが、その方法がどうしてもわからないでいます。
どなたかお教えいただけませんでしょうか。何卒よろしくお願いいたします。

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

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

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

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

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

tartnac

2019/08/02 03:56

書き方次第でどちらもいけちゃうんですか!なんと、そうだったんですね……。 はい、固定ページで現在は作っていますが何らこだわりはありません。 実はアーカイブページを使うとどうメリットがあるのか理解すらしておりませんで、固定ページでできるんだろうと思ってそうしただけなんです。 もし、アーカイブページを利用した方が良いということでしたら、全然アーカイブページに乗り換えるつもりでおります。 > http://hogehoge.com/gallery/を表示させるのに使用しているテンプレートのコード あ、実際には少々違うとはいえ、このコードが一番上のコードなんです。 「とりあえず、以下のコード(質問用に作ったので実際はちょっと違います)でページを作っています。」 って書いたすぐ下のヤツですね。すみません、わかりづらくて……。
yukikp

2019/08/02 04:25

WordPressがURLからデータを集めて出力するまでの流れってこんな感じなんです。 ・WordPressはURLにアクセスがあると、URLから何が求められているのかを自動的に判断してデータを取ってきてくれます。(この自動的に集められたデータとデータベースにデータを求める文章を「メインクエリ」って呼びます) ・さらにURLから「どのテンプレートが求められているのか」を自動的に判断して、そのテンプレートにメインクエリのデータを渡します。 ・そのテンプレートは、メインクエリにデータがあるのかをif(have_posts())で判定し、データがあるならwhile(have_posts())で一つずつデータを取り出して表示させます。 これを前提に話をすると、galleryという「固定ページ」のURLにアクセスしたとき、WordPressは【自動的に】その固定ページで保存された情報を集めて、固定ページの表示に使うテンプレートに渡します。(このデータがメインクエリです。) ※メインクエリを表示させるときには、if(have_posts()):while(have_posts()):the_post(); ~~ endif;endwhile;wp_reset_query(); という形で中身を表示させます。 閑話休題。 ところがどっこい、galleryという「固定ページ」で表示させたいのは、「固定ページで保存した情報」ではないので、WordPressが集めてくれたメインクエリを完全無視して、自分たちでデータを集めるプログラムを書くことになります。 例えば、get_posts()とかWP_Query()とかそういうのが自分たちでデータを集めるプログラムです。この【メインクエリを無視して自分たちで集めたデータ】をサブクエリと言います。 つまり、gallery固定ページで一覧表示させると「メインクエリ」が無駄になっちゃうという事ですね。アクセスがよっぽど多かった李、ものすごく大変な処理をさせない限り、これくらいの無駄は別に気にしなくていいと思いますが。
yukikp

2019/08/02 04:39

(回答には直接関係ない与太話を書き続ける酷い回答者) で、メインクエリを最大限活用すると確かに、二度手間は省けるし、ページングとかも全部WordPress任せにできるのでめっちゃ楽なのですが、メインクエリってサイトの表側でも裏側(管理画面)でもどこでも共通に使っているシステムなので、 「メインクエリでデータを集める時に特殊な条件を強制的に追加しよう」としたとき、「〇〇ページで検索したときだけ」とかそういう条件を付けないと、管理画面だろうが、表のページだろうが無差別に「特殊な条件」で選別されちゃうんですよね。 そういった意味ではサブクエリの方が気楽だったりする部分もあります。 (与太話終わり)
tartnac

2019/08/02 04:49

いや~~~~~~、ものすっごくタメになるお話ありがとうございました。 というか世の中のwordpressの書籍やWEBサイトは、まず最初にこのyukikpさんのお話を冒頭部分に持ってきてくれないかな~と常々思いながら拝見させていただきました。(大抵、front-page.phpが無い時はhome.phpを見に行きますとかばっかり) あ~なるほど、そんな流れになっていたんですね。個人的に衝撃だったのが「固定ページで保存した情報ではないものを表示させるとき、メインクエリが無駄になる」ってところです。 つまりそれはスマートな方法じゃなくて、ちょっと無理させる方法だから、何もこだわりが無いんならメインクエリを利用した方がイケメンだよってことですよね。 ちょうどyukikpさんの足跡をストーキングしておりましたら、 https://teratail.com/questions/203704 のコメントを見つけまして、その中の taxonomy-{taxonomy}-{term}.php っていう記述を見て「えええええー!?何それ!?その{指定した}ファイル名にするだけでメインクエリまわすと{指定した}ヤツが取れるの!?」ってビックリしてたところです。 めっちゃタメになる与太話ありがとうございます。
yukikp

2019/08/02 04:52

>まず最初にこのyukikpさんのお話を冒頭部分に持ってきてくれないかな~と常々思いながら拝見させていただきました。 でしょでしょ!自分も数年WordPressであそんでから、以下の2つのページに巡り合って色々納得しました。 https://hijiriworld.com/web/wp-essence/ http://www.webdesignleaves.com/pr/wp/wp_loops.html 与太話をちゃんとした言葉を使って、わかりやすく書いてくれています。
yukikp

2019/08/02 05:03

>何もこだわりが無いんならメインクエリを利用した方がイケメンだよってことですよね。 ただし、上にも書いたけど、その「メインクエリ」を書き換えるやり方もあって、「gallery固定ページのメインクエリの場合は、gallery固定ページデータを取ってくるのをやめて、xxのようにします!」ってやれば、メインクエリ自体を書き換えられるというやり方もあるのですわ。
guest

回答1

0

ベストアンサー

固定ページで検索したいなら、page-gallery.phpにこんな感じで書けばいいと思い餡巣。

PHP

1<?php 2$get_keyword = filter_input( INPUT_GET, 'keyword',FILTER_SANITIZE_STRING ); 3?> 4<form action="<?php bloginfo( 'url' );?>/gallery/" method="get"> 5<input name="keyword" value="<?php echo $get_keyword;?>" placeholder="フリーワード検索" > 6</form> 7<?php 8$args = array( 9 'post_type' => array( 'photo' ),//ここは使いたい投稿タイプを設定 10 'posts_per_page' => -1, 11); 12 13if( !empty( $get_keyword ) ) $args['s'] = $get_keyword; 14$the_query = new WP_Query( $args ); 15 16if( $the_query->have_posts() ): 17while( $the_query->have_posts() ): $the_query->the_post(); 18//ここで検索で引っかかってきたデータの処理。 19endwhile; 20endif; 21 22wp_reset_postdata(); 23?>

投稿2019/08/02 04:47

yukikp

総合スコア797

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

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

tartnac

2019/08/02 06:18

いや~、すごい。……やばい。できてしまいました……すごいなぁ~(感動) あれだけ考えてもわからなかったことが、yukikpさんのおかげであっという間に実現できました。 自分みたいに何もわかってない人間からすると、今日は相当大事なことを教えてもらえて本当に感無量です。yukikpさん、受講料お支払いしますよ!振込先教えてください!(笑) とりあえずは教えていただいた2つのWEBサイトをしっかり読み込んでみたいと思います。本当にありがとうございました。助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問