Wodpress XML Import hooks

时间:2019-05-09 作者:fefe

要将来自给定远程站点的帖子合并到给定类别下的一个站点中,我如何挂接导入插件以保存给定类别的帖子:

给出的示例:

接收方站点具有类别auto 我想从(例如)导入所有帖子auto.com 在下面this category. 如果远程帖子有另一个类别auto 添加为子级。

应该下载内部帖子图片,更新帖子内的所有链接,因此我已经找到了一个核心方法,下面是我尝试的方法,但我认为这可以变得更简单

<?php


if (!class_exists(\'Wp_Http\'))
    include_once(ABSPATH . WPINC . \'/class-http.php\');

require_once ABSPATH . \'wp-admin/includes/import.php\';

if (!class_exists(\'WP_Importer\')) {
    $class_importer = ABSPATH . \'wp-admin/includes/class-wp-importer.php\';

    if (file_exists($class_importer)) {
        require $class_importer;
    }
}


class WordpressMigration extends WP_Importer
{
    public $wpXML;

    public $xml;

    public $domain;

    function __construct($wpXML)
    {
        $this->wpXML = $wpXML;

        $this->xml = simplexml_load_file($this->wpXML);

        $this->domain = (string)$this->xml->channel->link;

    }

    public function getPosts()
    {
        $this->xml = simplexml_load_file($this->wpXML);
        $posts = array();

        /* import authors */
        $authors = $this->xml->channel->children(\'wp\', true);

        foreach ($authors->author as $author) {

        }

        foreach ($this->xml->channel->item as $item) {
            $categories = array();

            foreach ($item->category as $category) {
                //echo $category[\'domain\'];
                if ($category[\'nicename\'] != "uncategorized" && $category[\'domain\'] == "category") {

                    $categories[] = $category[\'nicename\'];
                }
            }
            $content = $item->children(\'content\', true);
            $doc = new DOMDocument();
            $doc->loadHTML(mb_convert_encoding(html_entity_decode($content->encoded), \'HTML-ENTITIES\', \'UTF-8\'));
            $imgs = $doc->getElementsByTagName(\'img\');

            //get the remote images and upload to media library
            if ($imgs instanceof DOMNodeList) {
                foreach ($imgs as $i => $img) {
                    $http = new WP_Http();
                    $targetImage = $img->getAttribute(\'src\');
                    $response = $http->request($targetImage);

                    if (!is_array($response) || $response[\'response\'][\'code\'] != 200) {
                        //write_log
                    }

                    if (is_array($response)) {

                        $upload = wp_upload_bits(basename($targetImage), null, $response[\'body\']);
                        if (!empty($upload[\'error\'])) {
                            //write_log
                        }

                        $img->setAttribute(\'src\', $upload[\'url\']);
                        $doc->getElementsByTagName(\'img\')->item($i)->nodeValue = $upload[\'url\'];

                    }
                }
            }

            $targetLinks = $doc->getElementsByTagName(\'a\');

            if ($targetLinks instanceof DOMNodeList) {
                foreach ($targetLinks as $i => $targetLink) {
                    var_dump($targetLink->getAttribute(\'href\'));
                    die;
                }
            }

            $posts[] = array(
                "title" => $item->title,
                "content" => htmlentities(html_entity_decode($doc->saveHTML())),
                "pubDate" => $item->pubDate,
                "categories" => implode(",", $categories),
                "slug" => str_replace("/", "", str_replace("", "", $item->guid))
            );
        }


        return $posts;
    }
}

?>

1 个回复
最合适的回答,由SO网友:Stephan Samuel 整理而成

这有点复杂。我可以想出三种方法:

  • Use someone else\'s importer plugin. 使用复杂的标准将材料导入WP是一个已解决的问题。然而,我从来没有遇到过一个我喜欢的免费导入插件。我所从事的大多数项目都有更少的现金和更多的开发时间,但如果你的项目没有,这将是最简单的
  • Modify the XML. 有几种方法可以做到这一点。您可以编写代码来执行此操作。从语义上解析XML总是比将其作为字符串解析要好(有许多库可以提供帮助),但大多数人仍然将其作为字符串进行解析。您可以使用XSLT来完成。您也可以用Excel将其输入。我在某个时候已经完成了这三项工作,这符合ETL任务的条件。ETL任务总是以非常简单的方式开始,通常以复杂的方式结束
  • Hook the importer. 已经有一些钩子了。This ticket in Make 似乎从3.4.1开始就包含了,并说它包含了一系列可能对您有用的挂钩,如wp_import_posts. 无论哪种方式,您都需要在一些插件中编写代码。这将解决大部分ETL复杂性,因为至少一些导入内容已经得到处理

相关推荐

在WP All Import不断超时的情况下,如何将产品导入Woo Commerce

我一直在使用WP All Import(不同程度的成功)将产品导入我的Woo Commerce网站。我的服务器一直超时并停止导入,这给我带来了困难,我没有太多运气就按照插件的官方建议进行了操作。我的导入分为约12个CSV文件,最大的有约100行。是否有人有任何其他方法可以使用正确的变体向站点添加约400种产品?我考虑的一个解决方案是在本地运行我的站点,运行我的所有导入,然后用本地数据库替换我的live db,但我宁愿避免这种情况。。。