phpblock_geeklog2mt.phpを改造してphpblock_geeklog2wp.phpを作ってみた。基本phpblock_geeklog2mt.phpと同じで、出力フォーマットをWordPress用にした。
概要
- phpblock_geeklog2mt をベースに改造しただけなので、基本はpc.casey.jp » geeklog から WordPress へ記事移動1(エクスポート編)を参照。
- 出力フォーマットは pc.casey.jp » nicky.cgi から WordPress へ記事移動 で知り得た情報を元にしている。
- phpblock_geeklog2wp は記事と画像をセットで移行できるようにすることが目的のため、コメント、ピングバック等は移動しません。文字ベースでgeeklogサイトを運営していたならMovable Type形式での入出力を行ったほうが良い。(参考:pc.casey.jp » nicky.cgi から Movable Type へ記事移動)
- .htaccessでの追跡ができるようにgeeklogの記事IDを書き込んでいる。
- 記事と画像を紐付けるWordPress用記事IDはプログラムが自動的に計算する。
スポンサードリンク
簡単な使い方
- geeklog/customにphpblock_geeklog2wp.php ファイル設置。
- lib-custom.phpに require_once( ‘custom/phpblock_geeklog2wp.php’ ); を追加。
- geeklogの管理画面からエクスポートする話題を選択。
- geeklog/data/ の出力されたファイルをローカルに保存。
- WordPressの管理画面からWordPress形式でのインポートを選択し、上記ファイルを選択する。
- 環境によってはWordPress側の受け入れが中断されることがあるので、その時はアップロードから再度行う。
- 記事数、メディア数を確認して問題なければ完了。
ソースコード
<?php
/*
* phpblock_geeklog2wp.php for Geeklog 1.7.0
* Copyright (C) 2010 casey, pc.casey.jp
*
* Export Geeklog stories in WordPress format
*
* @AUTHOR CASEY
* @VERSION 0.0.1
* @LICENSE GPL
* @NOTICE The export file is saved as <geeklog>/data/gl_stories.txt.
*/
define('MT_ARTICLE_SEPARATOR', "--------\n");
define('MT_FIELD_SEPARATOR', "-----\n");
// The name of export file
define('EXPORT_FILE', $_CONF['path'] . 'data/gl_stories.txt');
/**
* Language definition
*/
if (empty($_USER['language'])) {
if (empty($_COOKIE[$_CONF['cookie_language']])) {
define('GL2WP_LANG', 'english_utf-8');
} else {
define('GL2WP_LANG', $_COOKIE[$_CONF['cookie_language']]);
}
} else {
define('GL2WP_LANG', $_USER['language']);
}
/**
* Language data for English(utf-8)
*/
$LANG_GEEKLOG2MT['english_utf-8'] = array(
1 => 'Success! The export file is stored as ' . EXPORT_FILE,
2 => 'Cannot open a file for export.',
3 => 'Cannot write into a file for export.',
4 => 'Cannot lock a file for writing.',
'choose_topic' => 'Check topics you would like to export:',
'export' => 'Export!',
'no_topic' => 'No topic was specified.',
);
/**
* Language data for Japanese(utf-8)
*/
$LANG_GEEKLOG2MT['japanese_utf-8'] = array(
1 => 'エクスポートが終了しました。' . EXPORT_FILE . ' に保存されています。',
2 => 'ファイルを開けません。',
3 => 'ファイルに書き込めません。',
4 => 'ファイルをロックできません。',
'choose_topic' => 'エクスポートする話題にチェックを入れてください:',
'export' => 'エクスポート実行',
'no_topic' => '話題が選択されていません。',
);
//===============================================
// Functions
//===============================================
/**
* Escape a string for display
*
* @param string $str - a string to be escaped
* @return string - an escaped string
*/
function GL2WP_escape($str) {
global $LANG_CHARSET;
// Unescape a string
$str = str_replace(
array('<', '>', '&', '":', '''),
array( '<', '>', '&', '"', "'"),
$str
);
return htmlspecialchars($str, ENT_QUOTES, $LANG_CHARSET);
}
/**
* Get all topics
*
* @return array
*/
function GL2WP_getAllTopics() {
global $_PLUGINS, $_TABLES;
static $retval = null;
if (!is_null($retval)) {
return $retval;
}
$retval = array();
if (in_array('dataproxy', $_PLUGINS)) {
$dp = new Dataproxy(0);
$result = $dp->article->getAllCategories(true);
if (is_array($result) AND count($result) > 0) {
foreach ($result as $item) {
$retval[$item['id']] = $item['title'];
}
}
} else {
$sql = "SELECT tid, topic FROM {$_TABLES['topics']}";
$result = DB_query($sql);
if (!DB_error()) {
while (($A = DB_fetchArray($result)) !== false) {
$tid = stripslashes($A['tid']);
$topic = stripslashes($A['topic']);
$retval[$tid] = $topic;
}
}
}
return $retval;
}
/**
* Return a list checkboxes of all topics
*
* @return string - HTML
*/
function GL2WP_getTopicOptions() {
$retval = '';
$topics = GL2WP_getAllTopics();
foreach ($topics as $tid => $topic) {
$retval .= '<input id="' . 't_' . $tid . '" name="GL2WP_topics[]" type="checkbox" value="'
. $tid . '">'
. '<label for="' . 't_' . $tid . '">' . GL2WP_escape($topic) . '</label><br>';
}
return $retval;
}
/**
* Return a corresponding message
*
* @param mixed $msg - message id
* @return string - message
*/
function GL2WP_msg($msg) {
global $LANG_GEEKLOG2MT;
return GL2WP_escape($LANG_GEEKLOG2MT[GL2WP_LANG][$msg]);
}
/**
* Return the user name
*
* @param int $uid - user id
* @return string - user name
*/
function GL2WP_username($uid) {
global $_TABLES;
$retval = '';
static $names = array();
if (isset($names[$uid])) {
$retval = $names[$uid];
} else {
$sql = "SELECT username FROM {$_TABLES['users']} "
. "WHERE (uid = '" . $uid . "')";
$result = DB_query($sql);
if (!DB_error()) {
$A = DB_fetchArray($result);
$retval = stripslashes($A['username']);
$names[$uid] = $retval;
}
}
return $retval;
}
function GL2WP_date($timestamp) {
return date('Y/m/d H:i:s', $timestamp);
}
/**
* Handle comments related to the story
*
* @param $sid string - story id
* @return string
*/
function GL2WP_handleComments($sid) {
global $_TABLES;
$retval = '';
$sql = "SELECT uid, date, ipaddress, title, comment "
. "FROM {$_TABLES['comments']} "
. "WHERE (type = 'article') AND (sid = '" . addslashes($sid) . "')";
$result = DB_query($sql);
if (DB_numRows($result) > 0) {
while (($C = DB_fetchArray($result)) !== false) {
list($uid, $date, $ipaddress, $title, $comment) = $C;
$title = stripslashes($title); // Not used
$comment = str_replace(array("\r\n", "\r"), LB, stripslashes($comment));
$retval .= 'COMMENT: ' . LB
. 'AUTHOR: ' . GL2WP_username($uid) . LB
. 'IP: ' . $ipaddress . LB
. 'DATE: ' . GL2WP_date(strtotime($date)) . LB
. $comment . LB
. MT_FIELD_SEPARATOR;
}
}
return $retval;
}
/**
* Handle trackbacks related to the story
*
* @param $sid string - story id
* @return string
*/
function GL2WP_handleTrackbacks($sid) {
global $_TABLES;
$retval = '';
if (!isset($_TABLES['trackback'])) {
return $retval;
}
$sql = "SELECT title, url, ipaddress, blog, excerpt, date "
. "FROM {$_TABLES['trackback']} "
. "WHERE (type = 'article') AND (sid = '" . addslashes($sid) . "')";
$result = DB_query($sql);
if (DB_numRows($result) > 0) {
while (($T = DB_fetchArray($result)) !== false) {
list($title, $url, $ipaddress, $blog, $excerpt, $date,) = $T;
$title = stripslashes($title);
$url = stripslashes($url);
$blog = stripslashes($blog);
$excerpt = stripslashes($excerpt);
$retval .= 'PING: ' . LB
. 'TITLE: ' . $title . LB
. 'IP: ' . $ipaddress . LB
. 'BLOG NAME: ' . $blog . LB
. 'DATE: ' . GL2WP_date(strtotime($date)) . LB
. $excerpt . LB
. MT_FIELD_SEPARATOR;
}
}
return $retval;
}
// return data file header
function getHeader(){
$data = '<?xml version="1.0" encoding="UTF-8" ?>' . LB;
$data .= '<rss version="2.0" xmlns:excerpt="http://wordpress.org/export/1.0/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.0/"> . LB';
$data .= '<channel>' . LB;
$data .= '<wp:wxr_version>1.0</wp:wxr_version>' . LB;
return $data;
}
// return data file footer
function getFooter(){
$data = null;
$data .='</channel>' . LB;
$data .='</rss>' . LB;
return $data;
}
/**
* @param string $tid - topic id
* @return string exported string in MT format
*/
function GL2WP_export($tid) {
global $_PLUGINS, $_TABLES;
$retval = getHeader();
$all_topics = GL2WP_getAllTopics();
if (!array_key_exists($tid, $all_topics)) {
return $retval;
} else {
$topic = $all_topics[$tid];
}
// Get stories
$stories = array();
if (in_array('dataproxy', $_PLUGINS)) {
$dp = new Dataproxy(0);
$meta_data = $dp->article->getItems($tid, true);
foreach($meta_data as $meta) {
$temp = $dp->article->getItemById($meta['id'], true);
$stories[] = $temp['raw_data'];
}
} else {
$sql = "SELECT sid, uid, draft_flag, date, title, introtext, bodytext, "
. "comments, trackbacks, commentcode, trackbackcode, postmode "
. "FROM {$_TABLES['stories']} "
. "WHERE (tid = '" . addslashes($tid) . "')";
$result = DB_query($sql);
while (($A = DB_fetchArray($result)) !== false) {
$A['title'] = stripslashes($A['title']);
$A['introtext'] = stripslashes($A['introtext']);
$A['bodytext'] = stripslashes($A['bodytext']);
$stories[] = $A;
}
}
// [id]=name
//GL2WP_escape($topic)
$topics = GL2WP_getAllTopics();
foreach ($stories as $S) {
// . '<category><![CDATA['. GL2WP_escape($topics[$tid]) . ']]></category>' . LB
$img1 = null;
$img2 = null;
$id = strtotime($S['date']) - strtotime('2005/01/01 00:00:00');
$retval .= '<item>' . LB
. '<dc:creator><![CDATA[' . GL2WP_username($S['uid']) . ']]></dc:creator>' . LB
. '<title>' . $S['title'] . '</title>' . LB
. '<wp:post_id>' . $id . '</wp:post_id>' . LB
. '<wp:post_date>' . GL2WP_date(strtotime($S['date'])) . '</wp:post_date>' . LB
. '<category><![CDATA['. $topic . ']]></category>' . LB
. '<wp:status>' . ($S['draft_flag'] == 0 ? 'publish' : 'draft') . '</wp:status>' . LB
. '<wp:comment_status>' . ($S['commentcode'] == 0 ? '1' : '0') . '</wp:comment_status>' . LB
. '<wp:ping_status>' . ($S['trackbackcode'] == 0 ? '1' : '0') . '</wp:ping_status>' . LB
. '<wp:post_parent>0</wp:post_parent>' . LB
. '<wp:menu_order>0</wp:menu_order>' . LB
. '<wp:post_type>post</wp:post_type>' . LB
. '<wp:is_sticky>0</wp:is_sticky>' . LB;
if (trim($S['introtext']) != '') {
if($imgs = GL2WP_getImage($id, $S['introtext'])){
foreach($imgs as $img){
$img1 .= _makeImage(GL2WP_username($S['uid']), GL2WP_date(strtotime($S['date'])), $img, $id) . LB;
}
}
$intro = str_replace(array("\r\n", "\r"), LB, $S['introtext'] . LB);
}else{
$intro = null;
}
if (trim($S['bodytext']) != '') {
if($imgs = GL2WP_getImage($id, $S['bodytext'])){
foreach($imgs as $img){
$img2 .= _makeImage(GL2WP_username($S['uid']), GL2WP_date(strtotime($S['date'])), $img, $id) . LB;
}
}
$body = '<!--more-->' . LB
. str_replace(array("\r\n", "\r"), LB, $S['bodytext'] . "oldId." . $S['sid']) . LB;
}else{
$body = null;
}
$retval .= '<content:encoded><![CDATA['
. str_replace(array("\r\n", "\r"), LB, $intro . $body)
. ']]></content:encoded>' . LB;
$retval .= '<excerpt:encoded><![CDATA[]]></excerpt:encoded>' . LB;
$retval .= '</item>' . LB;
$retval .= $img1 ? $img1 : null;
$retval .= $img2 ? $img2 : null;
//$retval .= GL2WP_handleComments($S['sid'])
// . GL2WP_handleTrackbacks($S['sid'])
// . MT_ARTICLE_SEPARATOR;
}
$retval .= getFooter();
return $retval;
}
// make image data format
function _makeImage($author, $date, $url, $sid){
$name = basename($url);
$data = null;
$data .= '<item>' . LB;
$data .= '<title>' . $name . '</title> ' . LB;
$data .= '<dc:creator><![CDATA['. $author .']]></dc:creator>' . LB;
$data .= '<wp:post_date>' . $date . '</wp:post_date>' . LB;
$data .= '<wp:post_type>attachment</wp:post_type>' . LB;
$data .= '<wp:attachment_url>' . $url . '</wp:attachment_url>' . LB;
$data .= '<wp:post_parent>' . $sid . '</wp:post_parent>' . LB;
$data .= '<wp:postmeta><wp:meta_key>_wp_attached_file</wp:meta_key></wp:postmeta>' . LB;
$data .= '</item>';
return $data;
}
function GL2WP_getImage($sid, $str) {
// init
// http://oshiete.goo.ne.jp/qa/1276090.html
preg_match_all("/(\C{5,10})[\"]?https?:\/\/([^\"\s]+)/i" , $str , $arr);
$imgs = array();
// tag search
for($i=0;$i<count($arr[1]);$i++){
if(stristr($arr[1][$i], "src")){
$imgs[] = "http://" . $arr[2][$i];
}
}
// $ret = null;
// foreach($imgs as $img){
// $ret .= $sid . $img . LB;
// }
// return
//return $ret;
return $imgs;
}
//===============================================
// Main
//===============================================
function phpblock_geeklog2mt() {
if (!SEC_inGroup('Root')) {
return '';
}
if (isset($_GET['gl2mt'])) {
$msg = COM_applyFilter($_GET['gl2mt'], true);
if ($msg >= 1 AND $msg <= 4) {
return GL2WP_msg($msg);
}
}
if (!isset($_POST['GL2WP_submit'])) {
$retval = '<p>' . GL2WP_msg('choose_topic') . '</p>' . LB
. '<form action="' . COM_getCurrentURL() . '" method="post">' . LB
. GL2WP_getTopicOptions() . '<br>'
. '<input name="GL2WP_submit" type="submit" value="' . GL2WP_msg('export')
. '"><br>' . LB
. '</form>' . LB;
return $retval;
}
// Do export
if (!isset($_POST['GL2WP_topics']) OR count($_POST['GL2WP_topics']) == 0) {
return GL2WP_msg('no_topic');
}
$export = '';
foreach ($_POST['GL2WP_topics'] as $tid) {
$tid = COM_applyFilter($tid);
$export .= GL2WP_export($tid);
}
// Save into a file
$fp = @fopen(EXPORT_FILE, 'wb');
if ($fp === false) {
$retval = 2;
} else {
if (flock($fp, LOCK_EX)) {
if (fwrite($fp, $export) === false) {
$retval = 3;
} else {
$retval = 1;
}
flock($fp, LOCK_UN);
} else {
$retval = 4;
}
fclose($fp);
}
return GL2WP_msg($retval);
}
?></p>
.htaccessサンプル
RewriteCond %{QUERY_STRING} 20080803155715985
RewriteRule article.php https://pc.casey.jp/?s=20080803155715985 [R=301,L]


コメント