【问题标题】:wordpress - Insert posts programmatically while maintaining linkswordpress - 在维护链接的同时以编程方式插入帖子
【发布时间】:2015-10-30 11:58:14
【问题描述】:

我目前正在编写一个迁移脚本,将 XML 中的文章插入 Wordpress。

到目前为止,我在 PHP 中解析了 XML 并创建了数组,我正在遍历这些数组,并使用以下代码将它们一一插入到 Wordpress 中:

$post = array(
            'post_title'    => wp_strip_all_tags($article['title']),
            'post_content'  => $article['description'],
            'post_status'   => 'publish',
            'post_author'   => 1,
            'ping_status'   => 'closed',
            'post_date'     => $dateTime->format('Y-m-d H:i:s'),
            'post_type'     => $post_type
        );

        $result = wp_insert_post($post);

一切顺利,但问题来了:XML 是从网站导出的(不幸的是,我不知道是哪个 CMS),并且在内容中可以有指向同一站点上文件的链接,例如:

<![CDATA[<p><strong>Shortcuts:</strong></p>
<p/>
<ul>
<li><a href="http://www.testsite.fi/julkaisut/5440/julkaisut?contentPath=fi/julkaisut/esitteet/elakkeen_hakeminen_ulkomailta">(Booklet in Finnish)</a> 
</li>
<li><a href="http://www.testsite.fi/julkaisut/5440/julkaisut?contentPath=fi/julkaisut/esitteet/sa_har_soker_du_pension_fran_utlandet">(Booklet in Swedish)</a> 
</li>
<li><a href="http://www.testsite.fi/julkaisut/5440/julkaisut?contentPath=fi/julkaisut/esitteet/pensioni_taotlemine_valismaalt">(Booklet in Estonian)</a> 
</li>
<li><a href="http://www.testsite.fi/julkaisut/5440/julkaisut?contentPath=fi/julkaisut/esitteet/poluchenie_pensii_iz_drugih_stran">(Booklet in Russian)</a> 
</li>
</ul>]]>

Testsite.fi 是我自己的网站,所以这些是内部链接。

这些链接指的是 PDF,应该插入到 wordpress 中,但显然链接会有所不同。我确实有被引用的 PDF(例如:elakkeen_hakeminen_ulkomailta.pdf,它们与此脚本位于同一文件夹中),因此所需要做的就是以编程方式在 Wordpress 中上传此文件或手动将其移动到正确的位置,然后更新链接使其仍然有效。

任何线索如何做到这一点?我用正则表达式猜测一些东西,但无法真正弄清楚。

【问题讨论】:

  • 您可以将文件复制到上传文件夹中,它们将可以访问。只是 Wordpress 还不知道它们,但您可以控制该位置。也许使用一些文件 api,codex 应该提供一些选项。而且你不用正则表达式解析那个 HTML 片段,只用 DOMDocument。还允许您更改链接。
  • 谢谢,上传部分现在搞清楚了。只是还不确定 DOMDocument,对此不太熟悉。
  • 我认为这是一个关于如何解析 HTML 和更改 URL 的类似示例:stackoverflow.com/a/24350166/367456
  • 上例中的url没有文件类型...是故意的吗?此外,您只想更改 pdf 的链接还是更改所有内部链接?
  • @alpipego:不幸的是,这就是我们获得链接的方式,我知道在这种情况下它们恰好是 PDF。是的,我们想更改所有内部链接。

标签: php xml wordpress migration


【解决方案1】:

要更改所有内部链接,您可以使用:

$content = preg_replace('%href="http://www\.testsite\.fi/(.*)"%', 'href="' get_bloginfo('wpurl') . '/$1"', $article['description'], -1);

$post = array(
    'post_title'    => wp_strip_all_tags($article['title']),
    'post_content'  => $content,
    'post_status'   => 'publish',
    'post_author'   => 1,
    'ping_status'   => 'closed',
    'post_date'     => $dateTime->format('Y-m-d H:i:s'),
    'post_type'     => $post_type
);

$result = wp_insert_post($post);

由于您示例中的 pdf 没有文件类型,因此无法以编程方式识别它们。否则它会是这样的:

$upload_dir = wp_upload_dir();
$content = preg_replace('%href="http://www\.testsite\.fi/(.*)/(.*).pdf"%', 'href="' . $upload_dir['url'] . '/$2.pdf"', $article['description'], -1);

$2 是 pdf 的文件名。

注意:

正则表达式中的href 部分不是必需的,但可以确保您不会更改不在href 属性内的网址。根据具体情况,您可以省略该部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多