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

Wordpress

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

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

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

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

名前を入力
読者さん

ウゲっ…!

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

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

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

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

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

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

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

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

いずれはこういう機能を、僕のブログにも用意したいです。

ちなみに当ブログはブロガーに大人気のWordPressテーマ「ストーク」を使用中です。

2021年6月に「Cocoon」に変更しました

やり方を知らなくて実装に時間がかかるかもしれないので、簡単な方法でやってみました。

カスタムフィールド

を使用します。

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

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

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

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

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

投稿画面に表示させる

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

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

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

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

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

僕は、「hidden_toppage_flag」と命名して、値は「1」としました。

値は「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からも除外することができました!

管理画面に実装した

WordPressテーマ「Xeory」を参考にして、後日僕が使っているSTORKの管理画面をカスタムしてみました。

チェックをつけるとトップページとRSS、及びサイドメニューの「最新記事」から非表示にする対応にしました。

カスタムフィールドを直接いじるんじゃなくて、ここのチェックボックスのオンオフで対応できるように進化しました。

まとめ

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

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

タイトルとURLをコピーしました