ページと投稿記事でRSSを分ける方法(WordPress)

ページと投稿記事(ブログ記事)でRSSフィードを分けてみました。その作業した内容を記録。

何故、分ける必要があるのか?以下の理由からです。

  • 製品情報やサービス内容、会社情報はおそらくブログを読んでいる人には邪魔な気がする。
  • だからといってRSSフィードを配信しないのではSEO的に良くない。
  • サイトマップ登録用にRSSフィード配信を新着順と更新順に分けたい。
  • Googleウェブマスターツール、Yahooサイトエキスプローラー共にAtomが登録できる
  • AtomのXML項目を見ると検索エンジンのために仕様が制定されたとしか思えない(気がする)
  • ページ部分をフィード配信から外してから、ページ部分の順位が落ちている(気がする)

WordPressにはFeed Controlプラグインなどページと記事を一緒にRSSフィード配信出来るようにするプラグインはあるが、ページとブログ記事を分けて作成してくれるプラグインは発見できなかった。

そこで、ページと投稿記事のRSSフィード配信を分けてくれるプラグインをと言いたいところだが、ページのテンプレートでお茶を濁してみた。

やり方の概要は以下。

  1. ページを作成する
  2. 後に記述するコードのテンプレートファイルをwp-content/themes/使用テーマディレクトリ/配下に適当な名称で作成
  3. 1.で作成したページに2.のテンプレートを適用
  4. header.phpに1.で作成したページへのリンクを作成(linkタグ)
  5. 他のテンプレートファイルのページを表示する部分に1.のページIDをexcludeとして登録する
  6. XML-SitemapのURL配信から1.のページIDをexcludeとして登録する
  7. テストをしたら後はGoogleウェブマスターツールやyahooサイトエキスプローラに登録

書いていて結構、複雑です。(汗

1.ページを作成する

普通に「ページ」→「新規追加」で登録してください。全て作業完了後のページ設定は以下。コンテンツは空です。

ページ設定

2.後に記述するコードのテンプレートファイルをwp-content/themes/使用テーマディレクトリ/配下に適当な名称で作成

wp-include/feed-atom.phpからソースコードを拝借して改造したものです。

<?php
/*
Template Name: Atom Feed For Pages
*/
?>
<?php
header('Content-Type: application/atom+xml; charset=charset=UTF-8', true);
echo '<?xml version="1.0" encoding="UTF-8"?'.'>'."\n";

global $posts,$post;
the_post();

/* キャッシュを使わない場合は決め打ちにした方がクエリ数が少なくてよかとです。(何故か福岡弁) */
$_url = get_bloginfo('url', 'display'); //ブログのURL
$_name = get_bloginfo('name', 'display'); //ブログの名前
$_description = get_bloginfo('description', 'display'); //ブログの説明
$_feed_url = get_permalink($post->ID);
//$_feed_title = $_name.apply_filters('wp_title_rss', get_wp_title_rss('»'));
$_feed_title = $_name;
/* 決め打ちが嫌な場合、下をコメント */
$_feed_lang = 'ja';
/* 決め打ちが嫌な場合、下をコメントアウト */
//$_feed_lang = get_option('rss_language');

/* ページ一覧を取得(グローバル変数書き換え) */
$post_type = 'page'; //any:ページとポスト両方対象,page:ページのみ対象,post:投稿記事対象
$orderby = 'modified';
$numberposts = 100;
$exclude = EXCLUDE; /* 自環境では除外ページは定数宣言しています。 */
$query = 'post_type='.$post_type.'&orderby='.$orderby.'&numberposts='.$numberposts.'&exclude='.$exclude;
$posts = get_posts($query);
//setup_postdata($post);
?>
<feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	xml:lang="<?php echo get_option('rss_language'); ?>"
	xml:base="<?php bloginfo_rss('home') ?>/wp-atom.php"
	<?php /* do_action('atom_ns'); */ ?>

	>

	<title type="text"><?php echo $_feed_title; ?></title>
	<subtitle type="text"><?php echo $_description; ?></subtitle>

	<updated><?php echo mysql2date('Y-m-d\TH:i:s\Z', get_lastpostmodified('GMT')); ?></updated>

	<?php /* 下は宣伝です。消去しても可 */ ?>
	<generator uri="http://soft.fpso.jp" version="0.5.1">とりさんのソフト屋さん</generator>

	<link rel="alternate" type="text/html" href="<?php  echo $_url; ?>" />
	<id><?php the_guid(); ?></id>
	<link rel="self" type="application/atom+xml" href="<?php  echo $_feed_url; ?>" />

	<?php do_action('atom_head'); ?>

	<?php foreach( $posts as $post ) : setup_postdata($post); ?>
	<entry>
		<author>
			<name><?php the_author() ?></name>
			<?php $author_url = get_the_author_url(); if ( !empty($author_url) ) : ?>
			<uri><?php the_author_url()?></uri>
			<?php endif; ?>
		</author>
		<title type="<?php html_type_rss(); ?>"><![CDATA[<?php the_title_rss() ?>]]></title>
		<link rel="alternate" type="text/html" href="<?php the_permalink_rss() ?>" />
		<id><?php the_guid(); ?></id>
		<updated><?php echo get_post_modified_time('Y-m-d\TH:i:s\Z', true); ?></updated>
		<published><?php echo get_post_time('Y-m-d\TH:i:s\Z', true); ?></published>
		<?php the_category_rss('atom') ?>
		<summary type="<?php html_type_rss(); ?>"><![CDATA[<?php the_excerpt_rss(); ?>]]></summary>
<?php if ( !get_option('rss_use_excerpt') ) : ?>
		<content type="<?php html_type_rss(); ?>" xml:base="<?php the_permalink_rss() ?>"><![CDATA[<?php the_content('', 0, '') ?>]]></content>
<?php endif; ?>
<?php atom_enclosure(); ?>
<?php do_action('atom_entry'); ?>
		<link rel="replies" type="text/html" href="<?php the_permalink_rss() ?>#comments" thr:count="<?php echo get_comments_number()?>"/>
		<link rel="replies" type="application/atom+xml" href="<?php echo get_post_comments_feed_link(0,'atom') ?>" thr:count="<?php echo get_comments_number()?>"/>
		<thr:total><?php echo get_comments_number()?></thr:total>
	</entry>
	<?php endforeach ; ?>

</feed>

3. 1.で作成したページに2.のテンプレートを適用

省略します。1.の部分のキャプチャを見てください

4. header.phpに1.で作成したページへのリンクを作成(linkタグ)

ページIDは1.で追加したページのIDです。

<?php
$_name = get_bloginfo('name', 'display'); //ブログの名前
$_rss_all = get_permalink(ページID)
?>
<link rel="alternate" type="application/atom+xml" title="<?php echo $_name; ?> - Atom1.0 全コンテンツ対象(100件)、更新順" href="<?php echo $_rss_all; ?>" />

5. 他のテンプレートファイルのページを表示する部分に1.のページIDをexcludeとして登録する

除外するページIDを定数化してfunction.phpに定義して置くと楽です。

6. XML-SitemapのURL配信から1.のページIDをexcludeとして登録する

Google XML Sitemapsプラグインの場合は以下のようにします。

xml-sitemapでのページID除外

7. テストをしたら後はGoogleウェブマスターツールやyahooサイトエキスプローラに登録

AtomやRSS2.0をサイトマップとして登録できます。項目的にAtomを送るとよさげな予感。

ウェブマスター/サイト所有者 ヘルプ – サイトマップの作成

最後に

記事を途中まで書いた後、このサイトのAtomをページとポスト両方対象にしました。

今回は独自のAtomフィールド配信のテンプレートを作成しましたが、ページはHTMLを出力するだけでは無く、様々な用途に使用できるかと思います。SVGフォーマットで何か出来ないかな。。。

ページトップ

ブックマーク!


コメント投稿

* は必須項目です。入力したメールアドレスは公開されません。

*
*



AccessやExcel、.NETソフトウェア開発、WordPress等を使用したWebのシステム化、PCサポート、コンサルなどを行っています。全国対応可能です。お問い合わせください。
TEL (0776)56-8539