6

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

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

您可以在此处查看 Disqus 导出的 XML 文件!我唯一关心的是我只需要一个模板或格式,我可以按照它来编写正确的 WXR 文件注释,以便我可以使用导入工具将它直接导入到我的 WordPress 中。顺便说一句,当我尝试将 XML 文件上传到 WordPress 时,我收到了这个错误:

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

4

4 回答 4

4

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

于 2012-04-26T22:31:16.963 回答
3

与其尝试生成 WXR 文件格式,不如解析 Disqus XML 文件并将您从那里提取的评论直接插入到 wordpress 数据库中的 wp_comments 表中,而不是尝试生成 WXR 文件格式。至少通过这种方式,您可以更好地控制流程。

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

对于我的服务,我不得不重写两次解析器以使其适应 Disqus XML 的小而烦人的变化

于 2012-12-07T13:48:23.683 回答
1

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

这是代码

//    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 ), ‘&lt;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 ) . ‘&lt;br/>’;

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

echo ‘average duration : ‘ . ( array_sum( $duration ) / count( $duration ) ) . ‘&lt;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;

}
于 2013-08-30T09:45:47.917 回答
1

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

它看起来很有限,但也许是一个很好的起点。

于 2012-04-21T21:09:50.797 回答