【WordPress】指定した記事をトップページやRSSフィードに表示させない方法

こんにちは。今年はWordPressのカスタマイズを極めていきたいとみっちです。

WordPressで記事を書いていると、記事によってはトップページや、RSSフィードに表示させたくないものがあるよね。

例えば、最近僕は光回線などの記事を書くのに力を注いでいるので、普通に更新していてはトップページがあっという間に光回線の記事だらけになってしまう。

これでは、別のカテゴリの記事を見に来てくれた人がトップページを見た際に、

訪問者
「ウゲっ!」

と感じてしまうのは明白。

当初は、記事の日付をなるべく過去にしてトップページを埋めないように...なんて小細工をしていたけれど、これでは記事の作成日が正しくないものとなってしまう。

そこで、特定の記事をWordPressのトップページから削除し、なおかつFeedlyなどでRSS購読してくれている読者のために、フィードからも削除する対応をしたいと考えた。

テンプレートを編集したり、PHPの記述が必要なことから、今回はWordPress中級者以上の人向けの情報になるよ。

プラグインで対応できないの?

WordPressの醍醐味である、プラグインでの対応をまずは検討したわけですよ。

でも、特定のカテゴリに所属する記事全てをトップページには出さないといったプラグインはあったんだけど、自分で指定した特定の記事のみ、トップページから非表示にできるものは見つからなかった。。

バズ部のWordPressテーマ「Xeory」の投稿画面にはこういう機能が標準で付いてるんだよな。。

いずれはこういう機能を、僕のブログにも用意したい(WordPressテーマ「ストーク」を使用中)が、やり方を知らなくて実装に時間がかかるかもしれないので、簡単な方法でやってみた。

どうやるかって!?

感の良いあなたならもうお気づきだろう。

もちろんそう、

カスタムフィールド

だよ!

カスタムフィールドとは?

PHPなどのプログラムをやっている人なら、変数と言われるとすぐにどんなものかピンとくるだろう。

WordPressでは、カスタムフィールドという便利な機能があり、ここに記事に関するメタデータを付与することができるのだ。

既存の値と重複してなければ、自分の好きな名前を付けることが可能。

テンプレートで使えるフラグを設定しておくということっすね。

投稿画面に表示させる

デフォルトだと、投稿画面にはカスタムフィールドの欄は表示されていないので、まずは表示させてあげよう。

まずは、投稿画面の「表示オプション」をクリックする。

拡張機能が現れるので、「カスタムフィールド」の欄にチェックをつけよう。

カスタムフィールド欄は、記事を作成するテキストエリア欄の直下に表示されるはず。

続いて、「新規追加」をクリックして、カスタムフィールド名(フラグ名)を作成しよう。

僕は、「hidden_toppage_flag」と命名して、値は「1」としたよ。値は「true」とかでもいいね。

自分の分かりやすい名前と、値を設定しよう。

カスタムフィールド名は一度作成してしまえば、記憶されて、次回以降はプルダウンで選択できる。

これで、特定の記事にフラグを与えるところまではできた。

バズ部のWordPressテーマ「Xeory」の、「TOPページへの表示」機能なども、カスタムフィールドを使ったものなんだよね。

さあ、続いてはテンプレ側の設定をおこなっていこう。

テンプレの変更

トップページから非表示に

今回紹介するのは、「WordPressテーマ「ストーク」」での調整方法になってしまうが、トップページの記事一覧で使用しているPHPファイルは、

  • parts_archive_big.php
  • parts_archive_card.php
  • parts_archive_magazine.php
  • parts_archive_simple.php

のうち、自分で選択した記事一覧ページレイアウトに対応したいずれかのファイルとなるはず。

当ブログの場合は、」現在は「シンプル」を選択していたので「parts_archive_simple.php」を使用中だ。

STORKに限らず、WordPressのテーマに応じて、記事一覧が表示されている箇所のPHPファイルを探そう。

以前紹介した、「Show Current Template」というプラグインを使うと、使用中のテーマに該当したphpファイルを見つけやすいぞ!

では該当箇所をいじってみる。

必ずバックアップを取って作業しよう!僕はGitでバージョン管理してる!

カスタムフィールドを取得

// カスタムフィールド
$ctm = get_post_meta($post->ID, 'hidden_toppage_flag', true); // 記事非表示フラグチェック

これで、変数「$ctm」に、カスタムフィールド「hidden_toppage_flag」の値が入ってくる。

get_post_metaは、カスタムフィールドの値を取得するWordPress独自の関数なので、こういうことができると覚えておくと便利だよ。

【WordPress関数リファレンス】get_post_meta

記事一覧テンプレート変更前

<div class="top-post-list hentry">

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

<article class="post-list animated fadeIn" role="article">
・
・
・

変更前の上記3行目を大きく変更した点に注意してほしい。

また、if文が増えたので、上記12行目の「endwhile;」の直前に「endif;」を追記した点も注意してください。

記事一覧テンプレート変更後

<div class="top-post-list hentry">
<?php
  if (have_posts()):
    if (is_home() || is_front_page()) {
      // ページ送り対応
      $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
      
      // カスタムフィールド対応
      $args=array(
        'meta_query'=>
          array(
            array(
              'key'=>'hidden_toppage_flag',
              'compare' => 'NOT EXISTS'
            ),
            array(
              'key'=>'hidden_toppage_flag',
              'value'=>'1',
              'compare'=>'!='
            ),
           'relation'=>'OR'
          ),
          'showposts'=>get_option('posts_per_page'),
          'paged'=>$paged
        );
      query_posts($args);
    }

    /* 記事一覧 */
    while (have_posts()) : the_post();
?>

<article class="post-list animated fadeIn" role="article">
・
・
・

is_home() || is_front_page()」を判定に加えたのは、STORKの場合はカテゴリページなどの記事一覧でも同じPHPファイルを使用していたため、トップページでない場合(カテゴリページなど)は、カスタムフィールドの設定値があってもなくても記事を表示するという処理としてみた。

query_posts」関数で「meta_query」の条件を加えることで、もしhidden_toppage_flagが設定されている場合には、トップページの記事一覧から該当記事を除外するようにした。

「query_posts」関数は昔から使われてきた関数なものの、現在はWordPressで非推奨になっているようなので、使えなくなるということは当分ないと思うんだけど、「get_posts」関数が使える人はそっちで書くといいかも。

以上でトップページの対応は完了。

どんなテンプレートでも、WordPressであれば同じように対応できると思うので、お試しあれ。

ブログのサイドバーに表示されている「最新記事」の欄でも上記と同じ処理を行い、カスタムフィールドを判定するようにしてみた。

さて、このままだと、トップページでは特定の記事を非表示にできても、RSSフィードでは表示されてしまう。

RSSフィードにも、フラグを設定した記事を非表示にしたい人は、続いて以下のような設定も必要になる。

RSSフィードから非表示にする

RSSフィードから特定のスラッグに該当する記事を非表示にするためには、functions.phpを編集するよ。

僕の場合は、以下を追記した。

特にこだわりのない人は、「functions.php」の最下部に書くといいっすね。

// RSSフィードから除くものを指定
function exclude_tag_rss($query) {
  if ($query->is_feed) {
    $query->set('meta_query',
      array(
        array(
          'key'=>'hidden_toppage_flag',
          'compare' => 'NOT EXISTS'
        ),
        array(
          'key'=>'hidden_toppage_flag',
          'value'=>'1',
          'compare'=>'!='
        ),
       'relation'=>'OR'
      )
    );
  }
}
add_filter('pre_get_posts', 'exclude_tag_rss');

これで、カスタムフィールドでフラグを与えた記事をFeedからも除外することができたぞ!

まとめ

今回紹介した方法は、カスタムフィールドやスラッグを使って、とりあえず簡単にトップページとRSSフィードから除外する方法になるよ。

近いうちに記事投稿ページに、ちゃんと設定項目を設けて、バズ部のXeoryのように対応できるようにしたい。

こんなの簡単に

優しい人
「プラグインでできるよ!」

とか、

優しい人
「こうすれば実装できるよ!」

などなどあれば、是非連絡くださいね〜。

プロから直接学べるプログラミングスクールの紹介!PHPコースあり!

WordPressの勉強につまづいたら、マンツーマンでプロから習うのがオススメ

担当の指導者(メンター)が付いてくれるTechAcademyなら、分からないことをどんどん質問して解決できます!

ワードプレスで自分のサイトを開発!

Web制作会社が立ち上げたWebデザイナー育成スクール Web塾超現場主義

Web制作に実際に携わっている講師陣が、現場で通用するスキルを伝授します!卒業後は転職支援、仕事紹介などを行っており、フリーランス独立する道を探すこともできそうです。

初心者の方はもちろん更なるスキルアップを目指す方も、現場のクリエイターと実務経験を積むことで、WEB業界への就職や自宅でSOHOとして活躍する近道となります。
Facebookアカウントでコメント

※本コメント機能はFacebookによって提供されており、この機能によって生じた損害に対してザ サイベースは一切の責任を負いません。

ABOUTこの記事を書いた人

とみっち

埼玉でザ サイベースを主催しています。Webクリエイター。フリーランス歴7年。飄々と生きています。これでも育児頑張ってます。長野市出身。 @tomicci 詳しいプロフィール【興味】ギター/DTM/Web/車/田舎/旅/酒/育児 自然の音からデスメタルまで聴きます。【運営サイト】 ザ サイベース おと風景