Kaketan::Tech

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

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

困ったこと

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する関数で、後者は内容を文字列で取得する関数のようなので後者を使うこと。

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

【WordPress 4.4+】ページによってタイトルを細かく切り替え・変更する方法【PHP】

困っていること

前提

SEO を考慮してタイトル自身を description を含めた かけたんdiary|絶対に知っておくべき最新の情報をあなたにお届けします! のようなタイトルに設定している。

問題

このようにタイトルを設定したときは、個別ページのタイトルタグの要素の内容( <title>要素の内容</title>)が次のようになる

【最新まとめ】2018年に購入すべき神Amazonグッズ15選! - かけたんdiary|絶対に知っておくべき最新の情報をあなたにお届けします!

これは SEO 的に文字数が長すぎるとされている。(ほとんどの検索エンジンは最大60文字を タイトル に使用するため)

やること

したがって次のようにしたい。

  • Homeのときのタイトル
    • かけたんdiary|絶対に知っておくべき最新の情報をあなたにお届けします!
  • 個別ページのときのタイトル
    • 【最新まとめ】2018年に購入すべき神Amazonグッズ15選! - かけたんdiary

解決策

wp-includes/general-template.phpwp_get_document_title() 関数の次の箇所を変更する。

         if ( is_front_page() ) {
                $title['tagline'] = get_bloginfo( 'description', 'display' );
-        } else {
-              $title['site'] = get_bloginfo( 'name', 'display' );
-        }
+        } // else {
+        //      $title['site'] = get_bloginfo( 'name', 'display' );
+        //}
+        if ( !is_home() ) {
+                $title['site'] = 'かけたんdiary';
+        }

$title['site'] = get_bloginfo( 'name', 'display' ); してしまっているのが今回期待していないことなので、Home 以外では後ろになにをくっつけるかを書く。

後記

get_bloginfo( 'name', 'display' ) には かけたんdiary を設定してしまって、Home 限定で description をがっちゃんこして title タグの要素の内容をつくるみたいな実装にしたほうがきれいになるかもね。 どっちが楽かはわからないですが・・・

Ruby技術者認定試験( Ruby Association Certified Ruby Programmer Silver/Gold version 2.1 )に合格しました

この度、Ruby Association Certified Ruby Programmer Silver/Gold version 2.1 の資格を取得しました。
先月(7月)に Silver に合格し、今月(8月)に Gold に合格しました。

どんな資格か

Silver

Rubyの文法知識、Rubyのクラスとオブジェクト、標準ライブラリの知識について、基本的な技術レベルを持つことを認定します。

Gold

Silverで求められる範囲(文法、オブジェクト指向、組み込みライブラリ、実行環境など)を更に掘り 下げた知識に標準添付ライブラリ知識やアプリケーション設計に必要となるクラスやオブジェクトに関する知識を追加し、Rubyによるプログラム設計技術を持つことを認定します。

Ruby Association HP より

なぜ受験したのか

  • Ruby プログラマとして自分にどれくらいの知識があるのかを、(非エンジニアの人も含めて)、客観的にわかりやすく伝える手段が欲しかったから。
    • 今年から個人事業主として生計を立てているということもあり、アピールできることは増やしておこうと思ったため。
  • Ruby を書くお仕事を数年やっているというのもあり、業務の知識をもとに簡単に合格できそうでコスパがよさそうと思ったから。
  • 手段の目的化を促して学習できそうだから。
    • 「資格取得」を仮目的として設定することで、Ruby の知識を深めることに励み、いつのまにか本当の目的である Ruby の知識を深めることを実現させること。

Silver 対策でやったこと

[改訂2版]Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書

[改訂2版]Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書

この合格教本の Silver の範囲をテキトーに流し読みをして、「まあ余裕っしょ〜」と思いながら受験をしました。落ちました。
100 点満点中 75 点以上で合格なのですが、 68 点で不合格でした。完全に調子に乗っていました。試験終了後に「不合格」と表示されたときに、手足から大量の汗が吹き出したのがわかりました。人間って本当に予測不能な自体に陥ると「えっ」と口から漏れてしまうということを学びました。絶対に不合格になったことは誰にも知られてはいけない、なぜなら受験料が 16,200円(税込) (記入時点) するし、絶対にブログに書くときも一発合格したかのように装うようにしようと思いました。
それからは人間が変わったかのように真面目になり、髪色を金にして、第 7 章の演習問題を解きました。さらにインターネットで「Ruby Silver」と検索し、受検レポートを読み漁りました。そうして、数日後に2度目の受験をして 86 点で合格しました。

Gold 対策でやったこと

上記の試験合格教本に加えて、メタプログラミング Ruby を読みました。今更、読みました。

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

学習時間:約 13 時間

以下のようなスケジュールで進めました。

スケジュール

一発合格 (84 / 100点) でした。

全体を通しての感想

試験内容

Silver のほうが覚えることがたくさんあって大変でした。エイリアスメソッドや、組み込みクラスの細かなメソッドなど、実務であればググってリファレンスを読むことで解決できるようなことも暗記しておく必要がありました。
Gold については、学習するにあたって、特異クラスやメソッド探索、オブジェクト指向、Proc クラス、大域脱出などについて改めて学習するいい機会となりました。また、 Ruby 1.9 から追加された Fiber クラスや Ruby 2.1 から正式に導入された Refinements については初見でした。知れてよかったです。

試験への向き合い方

合格までにやる必要があることを予め整理して、そこから逆算し、スケジュールに落とし込み(実際に Google カレンダーに日時をそれぞれ登録する)、あとはたんたんと実行していくやり方が達成できたのでよかったです。
やっぱり人間は「いつかやろう」ではなかなか行動に移せないので、カレンダーにぶち込んでいくスタイルは効果があるように感じました。(たとえサボってしまっても、翌日に「昨日の分」をやらないとと思えたのがよかったです。)おかげで、いつか読もうと思っていたメタプログラミング Ruby を読むことができました。(特異クラスとメソッド探索については Rubyのしくみ -Ruby Under a Microscope- なども併せて、知識を深めようと思います(いつか...)。)