WordPressにはフックとよばれる仕組みが有り、様々な処理に介入することができます。
今回はそれを使って「投稿を全て夢オチにしてしまう」というどーしようもない改造を思いついたので紹介します。
一応、フィルターフックの使い方の練習ですので、そのどうしようもない部分だけきちんと書きなおせばいろいろと応用が効くと思います。
先ほども書いたとおり、WordPressにはフックという仕組みが有り、予め用意されているポイントで処理に介入することができます。
フック出来るポイントは非常に様々な場所にあり ((詳しくはプラグイン API/フィルターフック一覧 – WordPress Codex 日本語版をご覧ください)) 、その中には例えば「the_content」という、テンプレートタグでお馴染みの本文を表示する部分にも用意されています。
ということで、そこにフックして本文を表示し終えたら最後にオチの一言を付け加えるというフィルターを書いてみます。
投稿を全部夢オチにする方法
早速ですが、functions.php に
1 2 3 4 5 6 7 8 9 10 |
function punchline($the_content) { if (is_singular()) { $return = $the_content; $return .= '<p>…という夢を見たんだ。</p>'; return $return; } else { return $the_content; } } add_filter('the_content','punchline'); |
と書いてみてください。
するとそれだけで、全ての記事が強制的に夢オチになります。
しょーもないですね。
一応説明
add_filterで the_content にフックすると、自分で用意した関数の中で $the_content の中身を受け取れるようになります。
そしてそこであれやこれや加工して、最後に return で返してあげると、その結果が本文として出力されるわけです。
極端な話、
1 2 3 4 5 |
function postjack($the_content) { $return = 'はーっはっは!この投稿は俺様が乗っ取ってやったぜ!!!'; return $return; } add_filter('the_content','postjack'); |
とかしちゃうと、投稿で何を書こうと絶対に「はーっはっは!この投稿は俺様が乗っ取ってやったぜ!!!」としか表示されなくなってしまいます。
話を戻しますと、
受け取った $the_content には、投稿の本文が格納されています。
なので、それをそのまま return $the_content すれば、何事もなかったように本文が表示されます。
今回は、本文が全部表示し終わってからメッセージを追加しますので、投稿の中身には触れませんから、WordPressに返す変数($return)にそのまま格納しちゃいます ((今回は$returnとしましたがまぁ内部で使用されてる変数以外ならなんでもいいです。テーマ名などユニークな識別子をつけておけばかぶりにくくなるので良いと思います。)) 。(3行目)
続いて、その変数に、オチの一言を追加しますので、その下に
4 |
$return .= '<p>…という夢を見たんだ。</p>'; |
と書きます。
ポイントは、「=」の前に「.」をつけることです。
「=」で代入すると変数の中身が上書きされてしまいますが、「.=」で代入すると今ある内容はそのまま、追加で代入することができます。
これで、$return の中には、記事本文とオチの一言が追加されました。
あと、一覧でオチが見えちゃ困るので、一覧の時は表示されないように、 is_singular() で投稿本文のページでしか動作しないようにして、一覧の時は普通にコンテントを返すようにしています。
あとは、これを return で返してあげれば完成です。
しょーもないですね(2回目)。でももう一工夫すればなにかに使えそうです。
あ。
というか、テンプレート側で the_content() の直後にオチのメッセージをつければいいじゃん!
というツッコミはなしでお願いします。
あくまで今回はフィルターフックを使う練習であり、「フィルターフックを使って」投稿を夢オチにする方法ですので。。。
フックであれこれできるようになると、この処理だけを切り分けでくだらないプラグインをつくったり、もちろん便利なプラグインとかも作ったり出来るようになりますよ!きっと。
それと、今回は本文には一切手を付けなかったのですが、$the_contentの中身をいじりまわしたい場合は、テンプレート側だけでは難しいですよね。
そんな時こそフィルターフックが本領を発揮します。例えば次のような場合とか。
続きの部分が始まるタイミングでなにかメッセージを出す
ところで、WordPressの投稿画面で使えるタグに
1 |
<!--more--> |
というものがありますね。
これを押すと、moreより前が一覧に出て、それより後ろは個別記事ページに飛ばないと表示されなくなります。
また、「続きを読む」リンクには、
1 |
<a href="記事へのパーマリンク#more-記事ID">続きを読む</a> |
といった風に、 #more-XXX といったのがつき ((XXX部分にはその投稿のIDが入ります))、投稿の詳細ページには、投稿画面で
1 |
<!--more--> |
タグが入っていた位置に、
1 |
<span id="more-記事ID"></span> |
というタグが挿入されます。
なので、続きを読むリンクだと、moreタグの直後までスクロールした状態で表示されるわけなんですね。
ということは、この span id=”more-???” という部分を探しだして、先ほどと同じように書き換えてあげれば、続きが始まる前にメッセージを出すことができそうです。
やってみましょう。
またまた functions.php に、こんな風に書くと、
1 2 3 4 5 6 7 8 9 |
function content_visible_more($the_content) { $pattern = '/(<[a-z0-9]+.*?>)?(<span id="more-[0-9]+"><\/span>)(<\/[a-z0-9]+>)?/i'; $append = '<div>'; $append .= '〜〜ここから続きでっせ〜〜'; $append .= '</div>'; $result = preg_replace($pattern, $append, $the_content); return $result; } add_filter('the_content','content_visible_more'); |
続きが始まるタイミングで「〜〜ここから続きでっせ〜〜」と表示することができます。
これを利用すれば、本文の途中に広告を挿入したりとかもできそうですね。
ただし、この方法のままだと、
1 |
<span id="more-記事ID"></span> |
タグを消してしまいます。
なので、「続きを読む」リンクで記事の途中に飛ばせなくなってしまいます。
ですから、「続きを読む」リンクで記事の途中にジャンプ且つ、続きが始まる部分にメッセージなどを出したい場合は、もう一工夫必要ですね。
パターンで置き換える文字列を予め変数に逃しておいて、置き換えるメッセージのところに一緒に出力できるようにすればよさそうです。
と、いうことで出来上がったのがこちら。
1 2 3 4 5 6 7 8 9 10 11 |
function content_visible_more($the_content) { $pattern = '/(<[a-z0-9]+.*?>)?(<span id="more-[0-9]+"><\/span>)(<\/[a-z0-9]+>)?/i'; preg_match($pattern,$the_content,$matches); $append = $matches[0]; $append .= '<div>'; $append .= '〜〜ここから続きでっせ〜〜'; $append .= '</div>'; $result = preg_replace($pattern, $append, $the_content); return $result; } add_filter('the_content','content_visible_more'); |
正規表現関係はまだ自分も殆ど詳しくありませんので、もしかしたらもっといい方法があるかもしれませんが、ネタということで許してください。
「続きを読む」でも記事のトップに飛ばす方法
因みに、同じ方法で一覧ページの「続きを読む」リンクをページの途中じゃなくて、一番上にジャンプするようにすることもできます。
やりかたは簡単で、Codexにも紹介されています。
というより、もともとはこのコードの解説をしようと思って書き始めたのですが、今の内容のほうが面白くなりそうだったのでそちらをメインにしました
1 2 3 4 5 6 7 8 9 10 11 |
function remove_more_jump_link($link) { $offset = strpos($link, '#more-'); if ($offset) { $end = strpos($link, '"',$offset); } if ($end) { $link = substr_replace($link, '', $offset, $end-$offset); } return $link; } add_filter('the_content_more_link', 'remove_more_jump_link'); |
the_content_more_linkにフックして、「続きを読む」リンクを生成するタイミングでリンクに含まれる「#more-」という部分を探し、その部分を「空っぽ」に置き換えることで、ページ内リンク部分を消してしまうってわけですね。
その結果、「続きを読む」のリンクもクリーンなパーマリンクと同じURLになる為ページの上部に移動できるようになります。
「続きを読む」のカスタマイズ – WordPress Codex 日本語版
このように、フィルターフックを使うと、WordPressがデータベースからデータをもってきて、それを画面に出力するまでの間に更に自由に加工を行うことができます。
使い方次第でいろんな事ができそうで、夢が広がりますね。
それでは。
コメントする