Kaketan::Tech

誰かのためになるかもしれないテックなことに関するメモを書いています。

【LION BLOG】お問い合わせページ( /contact )で Contact form 7 を使ったときはデフォルトの問い合わせフォームを非表示にする方法【WordPress】

▼ 宣伝 ▼

これを読んでいるあなた!HP制作・アフィリエイトサイト制作に興味ありませんか?

現在、コーポレートサイトやアフィリエイトサイトの制作、月額課金制のファンクラブ制作などを行っています。

新しい収益源・集客ツールとしてのWeb制作はお任せください!「Kaketan::Tech を見た」で特別価格にてご案内いたします。

詳細は こちら のお仕事一覧をご覧ください!

プログラミング学習支援サロンのご紹介

フリーランスエンジニアの私が、あなたがプログラマとして案件を獲得できるようになるまでサポートいたします。詳細は こちら をクリック!

▲ 宣伝 ▲

困ったこと

LION BLOG というテーマだけじゃないかもだけど page-contact.php というテンプレートがあるおかげで、 https://sample.com/contact のようなページをつくると、テンプレートの中身が描画される(勝手に問い合わせフォームが表示される)。

たとえば、Contact form 7 のようなプラグインを使って問い合わせフォームをつくりたい場合は、これが邪魔なので非表示したい。

解決策

というわけで非表示にする方法をメモしておきます。

          <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
      <h1 class="heading heading-primary"><?php the_title(); ?></h1>
      <section class="content content-page">
                <?php the_content(); ?>
      </section>
+    <?php if ( !has_shortcode( get_the_content(), 'contact-form-7' ) ) { ?>
      <form action="<?php the_permalink(); ?>" method="post">
        <table class="contactTable">
          <tr>
            <th class="contactTable__header">お名前<span class="required">必須</span></th>
            <td class="contactTable__data">
            <input type="text" name="contactName" value="<?php if(isset($_POST['contactName'])) echo $_POST['contactName'];?>" />
                        <?php if(isset($nameError)) { ?><span class="error"><?=$nameError;?></span><?php } ?>
            </td>
          </tr>
          <tr>
            <th class="contactTable__header">メールアドレス<span class="required">必須</span></th>
            <td class="contactTable__data">
            <input type="text" name="email" value="<?php if(isset($_POST['email'])) echo $_POST['email'];?>" />
                        <?php if(isset($emailError)) { ?><span class="error"><?=$emailError;?></span><?php } ?>
            </td>
          </tr>
          <tr>
            <th class="contactTable__header">お問い合わせ内容<span class="required">必須</span></th>
            <td class="contactTable__data">
            <textarea name="comments" rows="10"><?php if(isset($_POST['comments'])) { if(function_exists('stripslashes')) { echo stripslashes($_POST['comments']); } else { echo $_POST['comments']; } } ?></textarea>
                  <?php if(isset($commentError)) { ?><span class="error"><?=$commentError;?></span><?php } ?></td>
          </tr>
        </table>
        <div class="btn btn-center"><input type="hidden" name="submitted" value="true" /><button class="btn__link" type="submit">送信する</button></div>
      </form>
+    <?php } ?>
          <?php endwhile; endif; ?>

解説

やってることは単純で、ループの中で has_shortcode 関数を使って、コンテンツの中に contact-form-7 というショートコードが含まれていないときだけデフォルトのフォームを表示するようにしている。 重要なのは、投稿の本文を取得するときに the_content() じゃなく get_the_content(); を使っていること。前者は本文を直接renderする関数で、後者は内容を文字列で取得する関数のようなので後者を使うこと。

インデントは全体的にめちゃくちゃなので、無視してます。。