「プラグイン無しでパンくずリスト」みたいな記事がよくあるけど、ちゃんとやろうとすると結構大変だという話

mimizuku

Mimizuku Advent Calendar 21日目の記事です。

「プラグインを使わずに○○」

よくあるじゃないですか、「プラグインを使わずに○○をやる方法」とか「functions.php で○○をやる方法」とか。簡単なことなら良いと思うんですよ、フィルターフックでちょいと出力を変更するとか。でもそこそこコード量が多くなりそうなことについては、そういう系の記事については思慮が浅いなーと思うものが多かったりします。なぜそういう記事を書く人達はプラグインのことを嫌うのかわかりませんが、プラグインとして公式ディレクトリで公開されているものは数多くのフィードバックを受けたり継続的にメンテナンスされ続けているものがたくさんあります。一度書いたら二度とメンテされないブログに書きなぐられた複雑なコードをテスト無しで使うなんていうのは…話がそれました。

パンくずリストもよく「プラグインを使わずに」と書かれることが多いコンポーネントですね。Mimizuku はテーマ内にパンくずリストを表示するためのコードを持っていますが、結構コード量が多くなっています。

お前もプラグイン使わずにテーマ内に書いてるじゃねぇか!と言われればそれまでなのですが(白目

まぁそれは一旦おいておいて。「プラグインを使わずにパンくず」系の記事で良く抜けがある部分についてまとめてみたいと思います。

「ホーム」部分

パンくずリストの一番最初って「ホーム」とか「トップページ」で始まりますよね。ここが結構ハマリポイントです。WordPress は普通に使うとブログ記事の一覧ページがトップページになります。ですが、WordPress をサイトとして使おうとすると「フロントページの表示」の設定でトップページと一覧ページにどの固定ページとして割り当てるか選択しますよね。そうするといままで

ホーム > 記事タイトル

だったのが

ホーム > ブログ > 記事タイトル

とならなければいけません。つまり「フロントページの表示」の設定で条件分岐をさせなければいけないわけです。「プラグインを使わずに」系の記事だとこの辺が抜けていることが結構あるような気がしています。

「ブログ」部分

ホーム > ブログ > 記事タイトル

の「ブログ」の部分、「ブログ」と決め打ちになっていたりしませんか?WordPress で企業サイト作る場合、「投稿」を「ブログ」じゃなくて「お知らせ」とか「ニュース」という名前で使うことも多いですよね。ということは、この部分は「ブログ」と決め打ちしちゃったらダメなわけです。Mimizuku では「フロントページの表示」でブログページに割り当てられた固定ページのページタイトルを使うようにしています。

カスタム投稿アーカイブページ

例えば「商品」のようなカスタム投稿タイプを作った場合、そのアーカイブページを表示させたときは

ホーム > 商品 > 記事タイトル

と表示してほしいですよね。2番目を「商品」と表示するために

if ( get_post_type() === 'product' ) {
    $item = get_post_type_object()->label;
}

とかするわけですが、このget_post_type()がハマリポイントです。その投稿タイプの記事数が0件の場合、get_post_type()では投稿タイプ名が返ってこないのです(全てのパターンで検証していないので返ってくる場合もあるかもしれません)。記事数が0件のときでも投稿タイプ名を取得する場合はWP_Queryの中を参照しないといけません。

フィルターフック

あとよくあるなーと思うのは、処理の中でそのまま HTML を組み立てちゃうことです。今のその環境絵だけ動けば良い、ということならまぁ良いと思うのですが、サイトを作るたびにそれをコピペして変更になる部分を探し出してカスタマイズするってめんどくさいじゃないですか。あーめんどくさい。

だからいきなり HTML を組み立てていくんじゃなくて一旦配列にして、それをフィルターフックに通した後、返ってきた配列を使って HTML を組み立てるのが良いです。そうしておけば特定の条件のときだけパンくずの出力をちょっと変えたい、というときはパンくず本体のコードを直接カスタマイズせずにフックしてその条件のときだけ返す配列を替えてやれば良くなります。

最後に

他にもまだ何かある気がしますが、パンくず程度 functions.php でちょろっとやれば良いと思っても汎用的に使えるものにするには結構配慮が必要ですよーということです。もっと複雑なことであれば尚更なので、それ系の記事はあんまり信用しないで普通にスターが多かったりアクティブユーザー数が多いプラグインを使ったほうが良いです。

Mimizuku のパンくずも完璧じゃない部分があるかもしれませんので、何かおかしい点があればプルリクもらえるととても嬉しいです。あ、ちなみに Mimizuku のパンくずは構造化データ対応しています。僕はパンくずだけ構造化マークアップしてなんか意味あるの?派なのですが、結構そこ気にする方多いのでやってみました。僕のサイトのパンくずはもともと構造化マークアップしていませんでしたが、Mimizuku ベースに変えてから、つまりパンくずの構造化マークアップが適用された後も対して PV も増えなければインデックス数も変わっていません。あっち系の方々は結構パンくずの構造化マークアップにうるさい気がしますが…どうなんでしょうね。

MW WP Form

MW WP Form はショートコードベースのフォームプラグインです。多くの機能を持っており、例えば、多くのバリデーションルール、問い合わせデータの保存、そしてグラフ機能集計などを使用することができます。

さらに詳しく
Habakiri

Habakiri

Bootstrap ベースのシンプルな WordPress テーマ。レスポンシブ、多くのカスタマイズ機能。圧縮された CSS・JS を使用する高速化対策。Microformats 対応。Sass、クラスベースの functions.php。

さらに詳しく
basis-stylus

Basis

軽量なレスポンシブ Stylus/CSS フレームワーク。Flexbox ベースのグリッドシステム、疎結合なコンポーネント、バーティカルリズム。

さらに詳しく