WordPress のデフォルトウィジェットの話。
最近の投稿 (英: Recent Posts) ウィジェットを使っているならやって損はない一手間でしょう。
一手間加える理由は何か
気になる人は気になる、という理由です。
説明しづらいためサンプル画像を用意しました ↓
これ、自分のサイトを見ている分には気づきづらいと思うんです。
しかしですね、よくよく考えると今見てるのに最近って言われてもさー、ってなったわけです。
解決するためにソースを覗く
こういうケースでもなんとかできるようにフックが用意されている WordPress の開発陣、素晴らしい。
WordPress 3.9 現在、/wp-includes/default-widget.php 694行目から
/** * Filter the arguments for the Recent Posts widget. * * @since 3.4.0 * * @see WP_Query::get_posts() * * @param array $args An array of arguments used to retrieve the recent posts. */ $r = new WP_Query( apply_filters( 'widget_posts_args', array( 'posts_per_page' => $number, 'no_found_rows' => true, 'post_status' => 'publish', 'ignore_sticky_posts' => true ) ) );
WP_Query で投稿を取得するところにフックされています(この辺りわからない人は読み飛ばしてください)。
クエリへリクエストするウィジェットデフォルトの配列に、widget_posts_args フックを使って表示中の記事を除外する、というキーを足してやれば良いですね!
除外指定は post__not_in
WP_Query へ渡す配列にフックで除外したい記事の ID を配列とした値の post__not_in キーを追加してやります。
コードは簡単。
/** * デフォルトの最近の投稿ウィジェットから閲覧中の記事を除外するフック * * @param $args * * @return mixed */ function remove_current_post_from_recent_posts_widget( $args ) { // 記事ページの場合 if ( is_single() ) // ウィジェットから現在の記事 ID を除外する配列キー追加 $args['post__not_in'] = array( get_the_ID() ); return $args; } add_filter( 'widget_posts_args', 'remove_current_post_from_recent_posts_widget' );
これをいわゆる functions.php に書けばOK。
PHP 5.3 以上であれば無名関数が使えるので、もうちょっとしゅっとしたコードで書けます。
/** * デフォルトの最近の投稿ウィジェットから閲覧中の記事を除外するフック * * @param $args * * @return mixed */ add_filter( 'widget_posts_args', function ( $args ) { // 記事ページの場合 if ( is_single() ) // ウィジェットから現在の記事 ID を除外する配列キー追加 $args['post__not_in'] = array( get_the_ID() ); return $args; } );
変化を見比べてみましょう。
最近の投稿ウィジェットと記事かぶりしなくなりました。
ホホまとめ
余所のブログと違いを出せるんじゃないかと。
とはいえ、プラグインを使ってサムネイル付きにしているブログさんが多いかもしれないですね。
すごく細かい所にこれからも気づいていきたいです。
いつかマネしたい
これ某プラグインでも実装できた面白いなぁと。
post__not_in 重要。うちのブログでも関連記事の表示が重複しないよう post__not_in で工夫してます。
これはやってみよう!
仮コメント