导出所有帖子以作为产品项目导入

时间:2012-09-03 作者:SixfootJames

到目前为止,我的客户一直使用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”);

有什么想法吗?谢谢

1 个回复
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条目。

结束

相关推荐

Load posts dynamically

我正在寻找一个解决方案/指导,如何在模板的左列中以分层方式列出帖子链接,当选择链接时,它会在右列中加载帖子,但整个页面不会刷新?谢谢DeonUpdate for Marfarma\'s help below感谢您的回复。在阅读了许多页面和帖子后,我能够让它正常工作。我现在需要注意的一点是,右侧列中的链接的href值为#。我有一个主页设置,用户可以选择一条培训路径,将他们带到上面讨论的页面。但我在主页上也有单独的链接,以防用户想跳到特定的主题。因此,现在我的问题是,我可以对它们进行单独编码,并让它们转到单个