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

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

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

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1881閲覧

投稿の情報を固定ページで引っ張る

kii.32

総合スコア67

WordPress

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/08/31 05:04

前提・実現したいこと

wordpressでサイト制作を行っております

商品A、B、C、Dを投稿から入稿して、
商品の個別ページからお問い合わせページに移ってそこから、
その商品について問い合わせを送れるようにしたいと考えています。
(問い合わせページに商品情報を引っ張ってきたい)

・商品一覧ページ(category.php)
・個別ページ(single.php)
・お問い合わせフォーム

商品Aについての個別ページから商品Aのお問い合わせフォームに移って問い合わせできるように
商品Cについての個別ページから商品Cのお問い合わせフォームに移って問い合わせできるように

※商品Aと商品Cのお問い合わせフォームは形は同じですが、
フォームページの前半部分にその商品についての情報を載せたいと考えています。

という風にお問い合わせフォームで個別記事の情報を引っ張ってこれるようにしたいです。

この場合は、お問い合わせフォームはsingle.phpで作るべきなのでしょうか?

その場合はどのような条件分岐になるのでしょうか?
カテゴリーごとに分ける方法は下記リンクのようにわかるのですが、
同じカテゴリー内で2つの異なるsingle.phpテンプレートを使い分けることはできるのでしょうか?
(※商品詳細のsingle.php と 商品についてのお問い合わせフォームのsingle.php)

WordPress・カテゴリごとに違うsingle.phpを表示する方法

有識者の方がいらっしゃいましたら、教えていただけますと嬉しいです。
どうぞ宜しくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

この場合は、お問い合わせフォームはsingle.phpで作るべき

固定ページか記事ページかでいえば、個人的には固定ページを使います。
お問い合わせフォームのテンプレートは同じで、その上の部分の商品情報が変わるだけだけですし。
まぁ好みなので、以下は記事ページを使うものとして進めます。


同じカテゴリー内で2つの異なるsingle.phpテンプレートを使い分けることはできるのでしょうか?

(※商品詳細のsingle.php と 商品についてのお問い合わせフォームのsingle.php)

その場合はどのような条件分岐になるのでしょうか?

おそらく条件分岐で(A)(B)に分岐することお考えでしょうか?

(A)普通に商品ページを表示したとき
→「商品詳細のsingle.php」を表示

(B)商品ページからの問い合わせフォームへ来たとき
→「商品についてのお問い合わせフォームのsingle.php」を表示

であれば「single-product.php」と「single-contact.php」というテンプレートを作り、「single.php」では以下のように分岐します。

これはcookieという機能を使いブラウザに登録された商品情報を取得し、その有無でテンプレートを分岐する方法です。

↓「single.php」

php

1<?php 2// 前ページ情報を取得 3$p_id= isset($_COOKIE['p_id']) ? $_COOKIE['p_id'] : ''; 4 5// 前ページに合わせて表示内容を分岐 6if( $p_id=='' ){ 7 // 前ページ情報がなければ商品詳細を表示 8 get_template_part('template-parts/single-product'); 9}else{ 10 // あれば商品についてのお問い合わせフォームを表示 11 get_template_part('template-parts/single-contact'); 12} 13

続いて、上はcookieの有無でテンプレートを分岐しているので、cookieを登録する機能を作らないといけません。

そこで「functions.php」に以下を書きます。

これはお問い合わせフォームのページじゃなければ商品情報(その商品のページID)をcookieに保存し、お問い合わせフォームではcookieを削除するという処理です。

こうしてcookieの有無を登録すれば、上の「single.php」で条件分岐ができますね。

尚、以下はお問い合わせフォームのスラッグを'contact'としてますが、ここは適宜ご変更ください。

↓「functions.php」

php

1<?php 2add_action( 'get_header', 'set_cookies'); 3function set_cookies() { 4 if( ! is_single('contact') ){ 5 $p_id = get_the_ID(); 6 setcookie('p_id', $p_id, time()+3600*24*7, '/'); 7 }else{ 8 setcookie('p_id', '', time()-1, '/'); 9 } 10} 11

最後にお問い合わせフォームに商品情報を掲載する方法です。

「single-contact.php」に以下を書き、cookieに入っている前ページの商品ID($p_id)を使い、その情報を引っ張ってきます。以下はthe_title($p_id);でタイトルだけ表示しています。

<?php // 前ページ情報を取得 $p_id = isset($_COOKIE['p_id']) ? $_COOKIE['p_id'] : ''; // 前ページの情報を表示 echo '<p>あなたが見た商品はこちらです。</p>'; the_title($p_id); ?> /// 問い合わせフォームを表示 <form> <textarea placeholder="お問い合わせ内容を入力"></textarea> <button type="submit">送信</button> </form>

ざっくりとですがこのような流れになると思います。

がんばってください。

投稿2019/09/01 01:11

hotaruika

総合スコア57

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

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

kii.32

2019/09/01 10:03

ご丁寧にご回答いただきましてありがとうございます! 非常にわかりやすい解説で、うまく作れそうです。 頑張って、制作いたします。 参考程度に、固定ページで制作する場合にも 同じようにfunctions.phpでcookieの有無を確認してというような 流れになるのでしょうか?
hotaruika

2019/09/02 00:18 編集

そうですね。着眼点によって同じ流れであるという判断は変化しますが、「>同じようにfunctions.phpでcookieの有無を確認して」という点でいえば同じです。 ただし ・商品ページ→記事ページのテンプレート ・問い合わせページ→固定ページのテンプレート の場合は single.php で条件分岐はできませんよね。(固定ページのテンプレートpage.phpですから。) なので固定ページのテンプレート(page.php)の先頭で「もし前ページの情報があれば商品情報を記載」って書くといいと思います。次のような感じでしょうか。 ↓「page.php」 <?php // 前ページ情報を取得 $p_id = isset($_COOKIE['p_id']) ? $_COOKIE['p_id'] : ''; // もし前ページの情報があれば商品情報を記載 if( $p_id != '' ){ echo '<p>あなたが見た商品はこちらです。</p>'; the_title($p_id); } if( is_page('contact') ){ // 問い合わせフォームを表示 }else{ // 通常の固定ページの内容を表示 } ?> あともし余力があれば、cookieはユーザーが操作できるので $p_id の有無の判定には get_post_status() なんかを使って、そのIDの記事が存在するかどうかをチェックしてあげるといいかもしれません。
kii.32

2019/09/04 04:07

ご丁寧にありがとうございます。 なかなかうまくいかず、下記方法で実装することができました。 もし下記の実装方法で何か、悪い部分があればご指導いただけると嬉しいです。 *固定ページ page-contact.phpを作成 「function.php(cookieの有無の登録)」 add_action( 'get_header', 'set_cookies'); function set_cookies() { if( ! is_page('contact') ){ $p_id = get_the_ID(); setcookie('p_id', $p_id, time()+3600*24*7, '/'); } } 「page-contact.php」 <?php get_header(); ?> <main> // 前ページの情報を表示 <?php $p_id = isset($_COOKIE['p_id']) ? $_COOKIE['p_id'] : ''; $the_query = new WP_Query( array( 'post_type' => 'post', 'post__in' => array($p_id), ) ); ?> <?php if ( $the_query->have_posts() ) : ?> <?php while ( $the_query->have_posts() ) : ?> <?php $the_query->the_post(); ?> <p>あなたが見た商品はこちらです。</p> <?php the_title($p_id); ?> <?php endwhile; ?> <?php endif; ?> <?php wp_reset_postdata(); ?> /// 問い合わせフォームを表示 <form> <textarea placeholder="お問い合わせ内容を入力"></textarea> <button type="submit">送信</button> </form> <main/> <?php get_footer(); ?>
hotaruika

2019/09/04 23:47

すみません固定ページ版ではWP_Query書かないとダメでしたね。 懸念としては(自分で書いといてアレですが)cookie登録のifが曖昧であるという点でしょうか。if( ! is_page('contact') ){} です。 これは「お問い合わせページ以外の場合」ですよね。これだと問い合わせページ以外のすべてのIDをcookieに登録することになります。aboutページのIDが登録されても使いませんからね。 なのでifは「お問い合わせページ以外の場合」でなく「商品ページの場合」の方が良さそうです。 たとえば if( is_single() ){} なら「記事ページの場合」になりますのでaboutページのIDは登録されませんが、でもきっと商品ページ以外にも single.php は使っているでしょうから、今度は別の記事ページのIDが登録されてしまう。 そこで「商品ページの場合」を判定するために、商品ページにはカスタム投稿タイプを使うといいかもしれません。そうすれば if( is_singular('product') ){} のような感じで「商品ページの場合」を判定できます。 もしカスタム投稿タイプってなんだ?と思ったら学習コストがすこし高いので、単に商品ページには「product」というカテゴリをつけるだけにして、「カテゴリproductを持つ記事ページの場合」=「商品ページの場合」という判定でもいいと思います。(カスタム投稿タイプより少し判定が遅くなりますが)
kii.32

2019/09/05 02:18

なるほど! 詳しいご説明をいただき、わかりやすい説明で非常に理解が深まりました! カスタム投稿タイプについても、学習をいたします。 hotaruikaさんのおかげで解決することができました。 本当にありがとうございました。感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問