テーマ「ShapeShifter」をプラグイン「bbPress」に対応させてみる。

ワードプレスの代表的なプラグイン「bbPress」にテーマ「ShapeShifter」を対応させたいと思い、現在アップデートに向けてカスタマイズ中で、ちょっと基本的な方法を紹介していこうと思います。
プラグイン「bbPress」は使ったことがありますから、少し勝手が分かっている分簡単でした。
このプラグインでは、基本的にワードプレス関数「the_content()」で生成されたフォーラムを出力しますから、基本的には「投稿ページ」や「固定ページ」と似た作り方で問題ありませんので、スタイルを少し操作するだけで大丈夫です。
ただ、スタイル以外でもテンプレートファイルを少し編集したことがある人だと、案外簡単にアレンジすることができると思います。
プラグイン「bbPress」
生成されたフォーラムのページは、投稿ページのテンプレートが標準的に適用され、ワードプレス関数「the_content()」によって出力されます。
ですので、テーマ側ではテンプレートファイル「single.php」を編集したり、テンプレートファイルを作成したりすることで、「bbPress」で出力されるコンテンツを制御します。
テンプレートファイル
テンプレートファイルは以下のものをテーマのルートディレクトリに配置してください。
- 「plugin-bbpress.php」
- 「bbpress.php」
- 「forums.php」
- 「forum.php」
- 「generic.php」
この他ワードプレスの標準的なテンプレートファイル「post.php」などもありますが、とりあえず「bbPress」用のテンプレートファイルは以上です。
テーマ「ShapeShifter」では「index.php」を使っていて、次に紹介する条件タグによって制御しています。
条件タグ
Codexの参照ページからの引用です。
if( function_exists( 'is_bbpress' ) && is_bbpress() ) { // bbPress if( bbp_is_forum_archive() || bbp_is_topic_archive() ) { // Archive // フォーラムページ } elseif( bbp_is_topic_tag() || bbp_is_topic_tag_edit() ) { // Topic Tags // トピックタグページ } elseif( bbp_is_single_forum() || bbp_is_single_topic() || bbp_is_single_reply() || bbp_is_topic_edit() || bbp_is_topic_merge() || bbp_is_topic_split() || bbp_is_reply_edit() || bbp_is_reply_move() || bbp_is_single_view() ) { // Components // トピック&リプライページ } elseif( bbp_is_single_user_edit() || bbp_is_single_user() || bbp_is_user_home() || bbp_is_user_home_edit() || bbp_is_topics_created() || bbp_is_replies_created() || bbp_is_favorites() || bbp_is_subscriptions() ) { // User // ユーザーページなど } elseif( bbp_is_search() || bbp_is_search_results() ) { // Search // 検索結果ページなど } }
まず、関数「is_bbpress」は、プラグイン「bbPress」で生成されるページ全てを対象にする一般的な関数です。次に使用されているものは、「bbPress」で生成されるページの種類によって分岐することができる関数になっています。
別に上のようにまとめる必要はなく、自分が出力したい条件に応じて使い分けてください。
できればスタイルも
僕はあまり気にしないんですが、クローズしたトピックには「status-closed」といったクラス属性が付いていたりするので、スタイルシートに追記しておくことでより見やすくなります。
例えば、擬似要素「:before」にアイコンを出力するなどです。
標準設定では、トピックのテキストリンクの色で区別されていて、クローズしたトピックは薄いグレーで見えにくくなるようなスタイルになっていますが、まぁ色だけよりはその手前に「closed」とか目印になるアイコンを表示させた方が良いのかもしれません。
テーマ「ShapeShifter」では
当サイトで配布しているテーマ「ShapeShifter」では、最初に紹介したようなテンプレートファイル「forum.php」などは追加せず、「bbPress」の関数を用いて制御しています。
余裕があればテーマカスタマイザーにもいくつか設定項目を追加しようかと思っています。
注意点
まず、テーマ内に実装する必要があるカスタマイズですので、非対応のテーマをカスタマイズする場合、基本的には子テーマを作成するようにしてください。
この他、今までに実際に試した結果、いくつか失敗した経験がありますので、ちょっとまとめてみました。
以下の項目は私的なもので、一般的ではないかもしれませんので特別気にしなくても大丈夫です。
スラッグのフィルター
スラッグを自動生成するための機能をテーマが有している場合、特に注意しなくちゃいけません。
SEOの都合上、各ページのスラッグは「なるべく半角英数で、ハイフンで区切ると良い」と言い、僕もテーマに初期のスラッグ生成機能として実装しています。「新規作成」した時に「投稿タイプ-投稿ID」という形にスラッグが生成されるようなフィルターを用意しています。英語などの場合は、タイトルがそのままスラッグに使用される方が楽で好都合だと思うんですが、日本語の場合は少し勝手が異なりますから、こういう処理を施しています。
ただ、「bbPress」でこのスラッグ生成を行うと、非常に面倒なことになったんです。
フォーラムは公開ページ側から訪問者がトピックなどを作成することができますので、管理画面から作成するページと勝手が異なり、スラッグ生成した時に他のトピックと重複し、パーマリンクがダブったまま登録されることがあるんです。こうなると見たいページに辿り着けず、どのトピックを選択しても、特定の1つのトピックにしかアクセスできなくなります。
このため、スラッグ生成のフィルターを公開ページ側では外したり、任意の投稿タイプだけ対象外にする必要が出てきます。「bbPress」の場合だと、「forum」や「topic」といった投稿タイプがそうです。
プラグインが有効化されていることをチェック
これは「bbPress」に限った話ではないのですが、プラグインで定義されている関数を使用する場合、プラグインが有効化されていることを確認しておく必要があります。有効化されていないと当然定義されていない関数を呼び出そうとすることになりますから、エラーが起こって止まってしまいます。
そこでPHPの関数で「bbPress」で定義されている関数などが存在するかどうかをチェックするようにしましょう。
例えば、「is_bbpress」で「bbPress」によるフォーラムのページかどうかを判別する前に、「function_exists( ‘is_bbpress’ )」で関数の有無をチェックするなどです。
// 悪い例 if( is_bbpress() ) { } // 良い例 if( function_exists( 'is_bbpress' ) && is_bbpress() ) { }
こうすると後者では「is_bbpress」の前に真偽値が出て「false」の場合は後続の「is_bbpress」は評価されませんから、「プラグインが有効化時、”bbPress”によるフォーラムページの場合」という条件を設けることができます。
他にも「class_exists」などで、クラス定義の有無をチェックするのも有りだと思いますので、自分に都合の良いように書いてください。