Featured image of post StaticPressでFeedをxml形式で出力する方法【WordPress】

StaticPressでFeedをxml形式で出力する方法【WordPress】

StaticPressでWordPressのRSS Feedを出力するとindex.htmlになってしまう問題の解決方法。xml形式で出力する設定と、FeedのURLが管理サーバーのままになる問題をplugin.phpへの追記で直す手順です♪

1263文字

Feedの必要性

WordpressはRSS標準搭載

Wordpressでサイトを生成すると、標準で以下のようなURLが用意されます。

Point
  • http://example.com/?feed=rss
  • http://example.com/?feed=rss2
  • http://example.com/?feed=rdf
  • http://example.com/?feed=atom

パーマリンクをカスタムしている場合は以下のURLとなります。

Point
  • http://example.com/feed/
  • http://example.com/feed/rss/
  • http://example.com/feed/rss2/
  • http://example.com/feed/rdf/
  • http://example.com/feed/atom/

アクセスするとこんな感じです。

StaticPressを利用した際の問題

HTMLファイルになってしまう

StaticPressを使用して、上記のFeed情報を出力するとHTMLファイルとして出力されてしまいます。
これはURLがfeed/となっているため、デフォルトでindex.htmlに出力されてしまっています。

解決方法

こちらを解決するには、StaticPressS3にてS3バケットに転送する際にファイルの拡張子をhtmlからxmlに変更するようにします。
そのためにclass-S3_helper.php62行目辺りを以下のように修正してください。
※{}内の部分は置き換えてください

2019年6月8日追記 以前の方法だと後に行われたfeedページで上書きされていたのでトップのフィードのみ対象にするように修正

class-S3_helper.php
//62行目辺り
	// S3 Upload
	public function upload($filename, $upload_path = null, $bucket = null) {
		if (!file_exists($filename) || !$this->s3)
			return false;
		$object_filename = $filename;
		$isFeed = false;
		try {
			if( strstr($filename, '{Wordpressインストールディレクトリ}/{StaticPress出力ディレクトリ}/feed/index.html') ){
				$object_filename = '{Wordpressインストールディレクトリ}/{StaticPress出力ディレクトリ}/feed/index.xml';
				$upload_path = 'feed/index.xml';
				$isFeed = true;
			}elseif(strstr($upload_path, 'feed/index.html')){
				return;
			}
			if (!$upload_path)
				$upload_path = $filename;
			$args = array_merge($this->options, array(
				'Key'         => $upload_path,
				'Body'        => $this->file_body($filename),
				'ContentType' => $this->mime_type($object_filename, $isFeed),//$object_filenameに変更、第二引数も追加

StaticPressプラグインの全容が分かればもっとスマートにいけそうですが、今回はそこまではやりません。
気になる方はやってみてください。笑

また、mime_typetext/htmlではなくapplication/rss+xml; charset=UTF-8に変える必要があるので、class-S3_helper.php194行目辺りを以下のように修正してください。
※charset=UTF-8を入れないと日本語が文字化けしてしまいます

class-S3_helper.php
private function mime_type($filename, $isFeed){//第二引数追加
		static $info;
		if (!isset($info)) {
			$magic_file = '/etc/httpd/conf/magic';
			$info = file_exists($magic_file)
			? new FInfo(FILEINFO_MIME_TYPE, $magic_file)
			: new FInfo(FILEINFO_MIME_TYPE);
        }
		if( $isFeed ){//feedファイルの場合の早期リターン文の追加
			return 'application/rss+xml; charset=UTF-8';//rss用のMimeType指定
		}

確認

では、実際に再構築して確認してみましょう。

正常に、xml形式で転送されるようになりましたね♪

FeedのURLが管理サーバーのものになる

出力されたFeedの内容をみると、一部のURLがWordpressを載せているサーバーのURLになったままの部分があると思います。

このままだとうまくFeedが働きません。

対応方法

こちらを解決するには、StaticPressのplugin.phpの末尾に以下を追加する必要があります。

plugin.php
add_action('StaticPress::file_put', 'replace_url_of_feed', 2);
function replace_url_of_feed($file_dest, $url){
  if(strstr($file_dest, '/feed/index.html')){
		$buff = file_get_contents($file_dest);
		$replace = substr(static_press_admin::static_url(), 0, -1);
		$content = str_replace(home_url(),$replace,$buff);
		file_put_contents($file_dest, $content);
	}
}

確認

では、実際に再構築して確認してみましょう。

こちらも正常に運用しているドメインに置き換わるようになりましたね♪

終わりに

Feed情報は他のサイトに更新情報を伝える上では、非常に貴重な情報です。

使わないとしても、いつでも使える状態にしておくと良いでしょう♪