如何将Disqus XML导出的注释导入Wordpress WXR

时间:2012-04-21 11:17:02

标签: xml wordpress disqus

我目前正在将我的评论系统恢复为默认的Wordpress评论。我之前使用的是Disqus,但我决定退回去。 Disqus提供了一个可以导出所有注释的工具,但不幸的是,它们将为您提供XML格式。最糟糕的是WordPress只读取WXR文件格式。

我的解决方案是我应该手动重写Disqus给我的东西(我的意思是我从disqus导出的XML文件)到WordPress WXR文件格式。我的问题是我不知道所需的WordPress评论的基本结构是什么。

You can view the Disqus Exported XML file here! 我唯一关心的是我只需要一个模板或格式,我可以遵循如何编写正确的WXR文件注释,以便我可以使用导入工具直接在我的WordPress中导入它。顺便说一句,当我尝试将XML文件上传到WordPress时,我收到此错误:

  

文件无效。请上传有效的Disqus导出文件。“

4 个答案:

答案 0 :(得分:4)

Disqus WordPress插件包含一个同步功能,可以将您的评论从Disqus同步回您的WordPress安装。它可以位于插件内的“高级选项”选项卡上。

答案 1 :(得分:3)

可能更容易解析Disqus XML文件并将从中提取的注释直接插入wordpress数据库中的wp_comments表,而不是尝试生成WXR文件格式。至少这样你可以更好地控制过程。

以上插件可能无法正常工作,因为Disqus会不时更改导出格式(奇怪的是,您甚至无法使用导出的文件将评论重新导入Disqus。)

For my service我必须重写两次解析器才能使它适应Disqus XML的小而烦人的变种

答案 2 :(得分:1)

你看过这个插件了吗? http://wordpress.org/extend/plugins/disqus-comments-importer/

它看起来有限但可能是一个很好的起点。

答案 3 :(得分:1)

将disqus评论导入我的新网站时遇到同样的问题。 最近我想出了一些方法来解析并将注释插入到wordpress数据库中,所有内容都是用PHP编写的,请参考这个this link,欢迎任何反馈

这是代码

//    start to count the timer

$start        = microtime( true );

$max_duration = ”;

//    get content of file and parse the xml

$xml = simplexml_load_file( ‘yourmxlfilesource.xml’ );

//    initiate database connection

$database_info[ 'hostname' ] = “”; //    database hostname

$database_info[ 'database' ] = “”; //    database name

$database_info[ 'username' ] = “”; //    database username

$database_info[ 'password' ] = “”; //    database password

$database_connect = mysql_pconnect( $database_info[ 'hostname' ], $database_info[ 'username' ], $database_info[ 'password' ] ) or trigger_error( mysql_error(), E_USER_ERROR );

mysql_select_db( $database_info[ 'database' ], $database_connect );

$i = 0;

//    get all the comment from xml file

$comments = get_post();

//    get all the post title array from xml file

$post_title = get_post_title_array();

$comment_result = array( );

$temp           = array( );

//    create loop to convert from xml comment into wordpress-format comment

foreach ( $comments as $comment ) {

$start_sub = microtime( true );
$comment_result[ 'comment_post_ID' ]      = get_post_id( $comment->thread->attributes( ‘dsq’, TRUE )->id );

$comment_result[ 'comment_author' ]       = $comment->author->name;

$comment_result[ 'comment_author_email' ] = $comment->author->email;

$comment_result[ 'comment_author_url' ]   = ”;

$comment_result[ 'comment_author_IP' ]    = $comment->ipAddress;

$comment_result[ 'comment_date' ]         = sanitize_date( $comment->createdAt );

$comment_result[ 'comment_date_gmt' ]     = sanitize_date( $comment->createdAt );

$comment_result[ 'comment_content' ]      = strip_tags( mysql_real_escape_string( $comment->message ), ‘<br><img><a>’ );

$comment_result[ 'comment_karma' ]        = 1;
//    check if comment is spam, deleted or approved
if ( $comment->isSpam == ‘true’ ) {

$comment_approved = ‘spam’;

} else if ( $comment->isDeleted == ‘true’ ) {

$comment_approved = ‘trash’;

} else {

$comment_approved = 1;

}
$comment_result[ 'comment_approved' ] = $comment_approved;

$comment_result[ 'comment_agent' ]    = ”;

$comment_result[ 'comment_type' ]     = ”;

$comment_result[ 'comment_parent' ]   = ”;

$comment_result[ 'user_id' ]          = ”;
//    store the wordpress format comment into temporary variable
$temp[ $i ] = $comment_result;
//    insert the wordpress format comment into wp database

insert_comment( $temp[ $i ] );

$duration[ $i ] = microtime( true ) – $start_sub;
$i++;

}

echo ‘max duration : ‘ . max( $duration ) . ‘<br/>’;

echo ‘min duration : ‘ . min( $duration ) . ‘<br/>’;

echo ‘average duration : ‘ . ( array_sum( $duration ) / count( $duration ) ) . ‘<br/>’;



//    show the total duration of process

echo ‘total duration : ‘ . ( microtime( true ) – $start );

/////////    define function here

function insert_comment( $comment )

{

global $database_connect;
//    function to insert the comment into wp database
$field  = ”;

$values = ”;
foreach ( $comment as $key => $value ) {

//    create sql query to insert the comment

$field .= ‘`’ . $key . ‘`’ . ‘,’;

$values .= ‘”‘ . $value . ‘”‘ . ‘,’;

}
$field  = rtrim( $field, ‘,’ );

$values = rtrim( $values, ‘,’ );
//    insert the comment into the database
$query = “INSERT INTO `wp_comments` ($field) VALUES ($values)”;

$query_result = mysql_query( $query, $database_connect ) or die( mysql_error() );

}

function sanitize_date( $date )

{

//  remove the additional string from the date
$date = str_replace( ‘T’, ‘ ‘, $date );

$date = str_replace( ‘Z’, ‘ ‘, $date );
return $date;

}

function get_post_id( $thread )

{

global $post_title, $database_connect;

//  get wordpress post id from disqus thread id
$thread_title = find_thread( ‘id’, $thread, ‘title’ ); //  get the title of the post
$thread_title = explode( ‘/’, $thread_title );

$thread_title = $thread_title[ count( $thread_title ) - 1 ];

$thread_title = str_replace( ‘-’, ‘ ‘, $thread_title );
$thread_title = str_replace( ‘.html’, ”, $thread_title );
$post_title_closest = get_closest_post_title( $thread_title, $post_title );
//  get the wordpress post id from the title of the post
$query = “SELECT `ID` FROM `wp_posts` WHERE `post_title` = ‘$post_title_closest’ LIMIT 1″;

$query_result = mysql_query( $query, $database_connect ) or die( mysql_error() );
$query_result_row = mysql_fetch_assoc( $query_result );

return $query_result_row[ 'ID' ];
}

function get_closest_post_title( $input, $words )

{

// no shortest distance found, yet

$shortest = -1;
// loop through words to find the closest

foreach ( $words as $word ) {
// calculate the distance between the input word,

// and the current word

$lev = levenshtein( $input, $word );
// check for an exact match

if ( $lev == 0 ) {
// closest word is this one (exact match)

$closest  = $word;

$shortest = 0;
// break out of the loop; we’ve found an exact match
break;

}
// if this distance is less than the next found shortest

// distance, OR if a next shortest word has not yet been found

if ( $lev <= $shortest || $shortest < 0 ) {

// set the closest match, and shortest distance

$closest  = $word;

$shortest = $lev;

}
}

return $closest;

}

function get_post_title_array( )

{

//  get wordpress post id from disqus thread id
global $database_connect;
//  get the wordpress post id from the title of the post
$query = “SELECT DISTINCT(`post_title`) FROM `wp_posts`”;

$query_result = mysql_query( $query, $database_connect ) or die( mysql_error() );
$query_result_row = mysql_fetch_assoc( $query_result );
$i = 0;
do {

$result[ $i ] = $query_result_row[ 'post_title' ];

$i++;

} while ( $query_result_row = mysql_fetch_assoc( $query_result ) );
return $result;
}

function find_thread( $category, $source_value, $return_category )

{

//    function to get thread information
global $xml;
foreach ( $xml->children() as $row ) {
if ( (int) $row->attributes( ‘dsq’, TRUE )->id == (int) $source_value ) {

return $row->$return_category;

}

}
}

function get_post( )

{

//    function to get all post from xml data
global $xml;
$i = 0;
foreach ( $xml->children() as $key => $value ) {
if ( $key == ‘post’ ) {
$result[ $i ] = $value;

$i++;

}

}
return $result;

}