STAFF BLOG スタッフブログ

WordPressからFuelPHPへのDB移行

Qript、心斎橋に引っ越して
私の1回目のブログになります。イエーイ!(^囚^)v


WordPress記事をXML形式でエクスポートできるのですが
新サイトへのデータ移行で対応いたしましたので
phpの移行プログラムのソースを書いてみました。


## 実際のxmlのデータの中身

<?xml version="1.0" encoding="UTF-8" ?>

<!-- generator="WordPress/4.6.3" created="xxxx-xx-xx xx:xx" -->
<rss version="2.0"
	xmlns:excerpt="http://wordpress.org/export/1.2/excerpt/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:wp="http://wordpress.org/export/1.2/"
>

<channel>
	<title>〇〇〇〇〇〇〇〇〇〇</title>
	<link>〇〇〇〇〇〇〇〇〇〇</link>
	<description>〇〇〇〇〇〇〇〇〇〇</description>
	<pubDate>Mon, 06 Mar 2017 02:06:56 +0000</pubDate>
	<language>ja</language>
	<wp:wxr_version>1.2</wp:wxr_version>
	<wp:base_site_url>〇〇〇〇〇〇〇〇〇〇</wp:base_site_url>
	<wp:base_blog_url>〇〇〇〇〇〇〇〇〇〇</wp:base_blog_url>

	<item>
		<title>〇〇〇〇〇〇〇〇〇〇</title>
		<link>〇〇〇〇〇〇〇〇〇〇</link>
		<pubDate>Mon, 06 Mar 2017 00:00:28 +0000</pubDate>
		<dc:creator><![CDATA[XXXXXXXX]]></dc:creator>
		<guid isPermaLink="false">〇〇〇〇〇〇〇〇〇〇</guid>
		<description></description>
		<content:encoded><![CDATA[]]></content:encoded>
		<excerpt:encoded><![CDATA[]]></excerpt:encoded>
		<wp:post_id>XXXXXXXX</wp:post_id>
		<wp:post_date><![CDATA[XXXX-XX-XX XX:XX:XX]]></wp:post_date>
		<wp:post_date_gmt><![CDATA[XXXX-XX-XX XX:XX:XX]]></wp:post_date_gmt>
		<wp:comment_status><![CDATA[closed]]></wp:comment_status>
		<wp:ping_status><![CDATA[closed]]></wp:ping_status>
		<wp:post_name><![CDATA[]]></wp:post_name>
		<wp:status><![CDATA[publish]]></wp:status>
		<wp:post_parent>0</wp:post_parent>
		<wp:menu_order>0</wp:menu_order>
		<wp:post_type><![CDATA[post]]></wp:post_type>
		<wp:post_password><![CDATA[]]></wp:post_password>
		<wp:is_sticky>0</wp:is_sticky>
		<category domain="post_tag" nicename="XXXXXXXX"><![CDATA[XXXXXXXX]]></category>
		<category domain="post_tag" nicename="XXXXXXXX"><![CDATA[XXXXXXXX]]></category>
		<category domain="post_tag" nicename="XXXXXXXX"><![CDATA[XXXXXXXX]]></category>
		<category domain="post_tag" nicename="XXXXXXXX"><![CDATA[XXXXXXXX]]></category>
		<category domain="post_tag" nicename="XXXXXXXX"><![CDATA[XXXXXXXX]]></category>
		<category domain="category" nicename="XXXXXXXX"><![CDATA[XXXXXXXX]]></category>
		<wp:postmeta>
			<wp:meta_key><![CDATA[XXXXXXXX]]></wp:meta_key>
			<wp:meta_value><![CDATA[XXXXXXXX]]></wp:meta_value>
		</wp:postmeta>
		<wp:postmeta>
			<wp:meta_key><![CDATA[XXXXXXXX]]></wp:meta_key>
			<wp:meta_value><![CDATA[XXXXXXXX]]></wp:meta_value>
		</wp:postmeta>
	</item>
</channel>
</rss>

## FuelPHPのTask処理

<?php
namespace Fuel\Tasks;

// インポート処理
class Import
{

	public static function run()
	{
		$count = 0;

		$xml = 'xmlのファイルのあるパス&ファイル名';
		$xmlData = simplexml_load_file($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
		$nameSpaces = $xmlData->getNamespaces(true);

		// DBに保存
		try
		{
			\DB::start_transaction();

			foreach ( $xmlData->channel->item as $data )
			{
				// <title>のような形式のデータ取得の場合
				$title = $data->title;

				// <dc:creator>のような形式のデータ取得の場合、$data->children(':の左のコード', true)->(:の右のコード)で取得
				$creater = $data->children('dc', true)->creator;

				// <category>が複数ありdomain属性なるものがある場合、ループして取得する:今回は domain="post_tag" だけを取得する
				$tags = array();
				foreach ( $data->category as $cat )
				{
					// 属性の中にある値を取得する場合
					$domain= $cat->attributes()['domain'];

					if ( $domain== 'post_tag' )
					{
						// 値を取得する場合は、stringにキャストして取得する
						$tags[] = (string)$cat;
					}
				}

				// <wp:postmeta>が複数あり<wp:meta_key>を取得したい場合
				foreach ( $data->children('wp', true)->postmeta as $postmeta )
				{
					$meta_key = (string)$postmeta->children('wp', true)->meta_key;
				}

				// DB保存
				$ins_data = array();
				$rec = \Model_モデル名::forge($ins_data);
				$rec->save();
			}

			\DB::commit_transaction();
		}
		catch (\Exception $e)
		{
			\DB::rollback_transaction();
			\MyUtil::log($e);
		}
	}

}

domain属性なるものは検索しても
なかなか見つからなかったので苦戦。。


(・囚・)ノ

INDEXブログ一覧へ
CONTACTお問い合わせはこちら