到目前为止,我的客户一直使用WordPress帖子作为展示产品的方式。我现在需要将所有这些帖子导出为CSV格式,以便我可以格式化CSV文件并将其导入回WP电子商务。
我已经研究了许多选项,包括导出帖子的插件、直接从phpMyAdmin导出以及在WP中使用XML导出选项,但没有一个像我希望的那样干净。
我想我基本上需要一个SQL查询,我可以运行它来只导出POSTS表中的信息,不包括任何其他垃圾,如ID号、ping状态、guid等。
我只需要:
帖子标题,帖子内容,自定义字段,类别,我的查询开始了
SELECT *
FROM `wp_posts`
WHERE `post_status` = \'publish\'
EDIT:如果有人认为有更好的方法可以做到这一点,我愿意接受更好的解决方案?
EDIT
Here\'s a solution I found on SO 但我不知道在哪里使用这个?
<?php
function array2xml($array, $name=\'array\', $standalone=TRUE, $beginning=TRUE)
{
global $nested;
if ($beginning)
{
if ($standalone) header("content-type:text/xml;charset=utf-8");
$output .= \'<\'.\'?\'.\'xml version="1.0" encoding="UTF-8"\'.\'?\'.\'>\' . PHP_EOL;
$output .= \'<\' . $name . \'>\' . PHP_EOL;
$nested = 0;
}
// This is required because XML standards do not allow a tag to start with a number or symbol, you can change this value to whatever you like:
$ArrayNumberPrefix = \'ARRAY_NUMBER_\';
foreach ($array as $root=>$child)
{
if (is_array($child))
{
$output .= str_repeat(" ", (2 * $nested)) . \' <\' . (is_string($root) ? $root : $ArrayNumberPrefix . $root) . \'>\' . PHP_EOL;
$nested++;
$output .= array2xml($child,NULL,NULL,FALSE);
$nested--;
$output .= str_repeat(" ", (2 * $nested)) . \' </\' . (is_string($root) ? $root : $ArrayNumberPrefix . $root) . \'>\' . PHP_EOL;
}
else
{
$output .= str_repeat(" ", (2 * $nested)) . \' <\' . (is_string($root) ? $root : $ArrayNumberPrefix . $root) . \'><![CDATA[\' . $child . \']]></\' . (is_string($root) ? $root : $ArrayNumberPrefix . $root) . \'>\' . PHP_EOL;
}
}
if ($beginning)
$output .= \'</\' . $name . \'>\';
return $output;
}
//connect to database and select database (edit yourself)
mysql_connect("localhost", "username", "password");
mysql_select_db("databasename");
//Get all posts whose status us published.
$result = mysql_query("SELECT * FROM wp_posts WHERE post_status = \'publish\'");
while($row = mysql_fetch_assoc($result))
$posts[] = $row;
//convert to array and print it on screen:
echo "<pre>";
echo htmlentities(array2xml($posts, \'posts\', false));
echo "</pre>";
?>
EDIT:对,所以我创建了一个名为pull posts的php文件。php并将上述代码放入该文件中,然后将该文件保存在本地主机安装的根目录中。然后,我更改了DB详细信息并运行了脚本。下面是我遇到的错误:
警告:mysql\\u connect()[函数.mysql connect]:在C:\\inetpub\\wwwroot\\Xampp-1.7.7\\htdocs\\project\\pull posts中,拒绝用户“username”@“localhost”(使用密码:YES)的访问。php在线40
第40行有以下内容:
mysql\\u connect(“localhost”,“root”,““”);mysql\\u select\\u db(“DBName”);
有什么想法吗?谢谢
SO网友:Milo
您不必导出然后重新导入,您可以通过API一次完成这一切,无需XML。下面是一个简单的插件示例:
<?php
/*
Plugin Name: WPA_convert_types
*/
function wpa_convert_types_page() {
add_management_page(
\'WPA convert types\',
\'WPA convert types\',
\'manage_options\',
\'wpa_convert_types\',
\'wpa_convert_types_render_page\'
);
}
add_action(\'admin_menu\', \'wpa_convert_types_page\');
function wpa_convert_types_render_page() {
if( isset( $_POST[\'wpa_do_convert\'] ) ):
$args = array(
\'posts_per_page\' => -1
);
$posts_query = new WP_Query( $args );
if( $posts_query->have_posts() ):
global $post;
while( $posts_query->have_posts() ):
$posts_query->the_post();
$new_product = array(
\'post_type\' => \'product\',
\'post_status\' => \'publish\',
\'post_title\' => $post->post_title,
\'post_content\' => $post->post_content,
);
$product_id = wp_insert_post( $new_product );
// use get_post_meta, wp_get_object_terms
// to get meta and categories,
// use $product_id to associate with new product
// via wp_set_object_terms, add_post_meta
endwhile;
echo \'done\';
endif;
else:
?>
<form method="post">
<input type="submit" name="wpa_do_convert" value="go">
</form>
<?php
endif;
}
您必须添加元和类别处理,请参见下面的注释
wp_insert_post
行,但这应该让你开始。
EDIT- 我一直忘了wp_insert_post
允许您在函数中设置分类术语,请参阅用于添加类别的codex条目。