我目前正在将我的评论系统恢复为默认的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导出文件。“
答案 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;
}