php - 如何将 XML 文件插入 WordPress 数据库

标签 php mysql xml wordpress

我有一个 XML 数据源,它是 here .

我正在尝试使用此功能将所有产品插入数据库或更新重复键。重复键是产品元素 <prod id="685814171" in_stock="yes" stock_quantity=""> 上的 ID 。我将其保存为 SKU 字段。

这是函数

function parse_xml(){
global $wpdb;
$xml = simplexml_load_file('http://www.hot-offers.net/wp-content/themes/hotoffers/datafeed_249713.xml');

foreach($xml->datafeed->prod as $item){

    $att = $item->attributes();

    $sql = 'INSERT INTO wp_pcu_babytoddler_products 
              (sku, title, url, stock_message, price, image, pid) 
            VALUES
              (%d, %s, %s, %s, %d, %s, %s) 
            ON DUPLICATE KEY UPDATE    
              title = VALUES(title),
              url = VALUES(url),
              stock_message = VALUES(stock_message),
              price = VALUES(price),
              image = VALUES(image),
              pid = VALUES(pid);';

    $sql_prep = $wpdb->prepare($sql,
                        (string)$att->id,
                        (string)$item->text->name,
                        (string)$item->uri->awTrack,
                        (string)$att->in_stock,
                        str_replace('.','',(string)$item->price->buynow),
                        (string)$item->uri->mImage,
                        (string)$item->pId);

    $wpdb->query($sql_prep);
}
}

这是我的数据库架构

CREATE TABLE IF NOT EXISTS `wp_pcu_babytoddler_products` (
  `sku` int(11) NOT NULL,
  `title` text NOT NULL,
  `url` text NOT NULL,
  `stock_message` text NOT NULL,
  `price` int(11) NOT NULL,
  `image` text NOT NULL,
  `pid` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `wp_pcu_babytoddler_products` ADD PRIMARY KEY (`sku`);

此函数部分起作用,因为它将 136 行插入到数据库中,但应该有 232 行,就像 Feed 中那样。我做错了什么?

我不必使用 $wpdb反对插入这些,我只是觉得这样更容易。

编辑

虽然 XML Feed 中不存在 ID 2147483647,但我收到了一个错误,但这似乎会影响其余产品。

WordPress database error: [Duplicate entry '2147483647' for key 'sku']
INSERT INTO `wp_pcu_babytoddler_products` 
    (`sku`, `title`, `url`, `stock_message`, `price`, `image`, `pid`) 
VALUES 
    (
    '3083667637', 
    'Baby Dan BabyDen Play Pen Black 2014', 
    'http://www.awin1.com/pclick.php?p=3083667637&a=249713&m=3975', 
    'In Stock', 
    '9849', 
    'http://www.babyandtoddlerworld.co.uk/imagprod/imaglarg/BDAN-Babyden-Black.jpg', 
    'BDAN-Babyden-Black-67116-2600-1400-10'
    )

Array
(
    [sku] => 3083667637
    [title] => Baby Dan BabyDen Play Pen Black 2014
    [url] => http://www.awin1.com/pclick.php?p=3083667637&amp;a=249713&amp;m=3975
    [stock_message] => In Stock
    [price] => 9849
    [image] => http://www.babyandtoddlerworld.co.uk/imagprod/imaglarg/BDAN-Babyden-Black.jpg
    [pid] => BDAN-Babyden-Black-67116-2600-1400-10
)

最佳答案

刚刚发现问题,问题在于 SKU 在数据库中作为 int() 存储,int() 可以存储的最大数量是 2147483647 。它会截断任何高于该数字的数字!

我遵循了这个答案:https://stackoverflow.com/a/20442152/1838483

您只需将 int() 更改为 varchar(20)

关于php - 如何将 XML 文件插入 WordPress 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33388118/

相关文章:

json - 使用 jackson-dataformat-xml 自定义根元素的 XML 反序列化?

xml - XSLT - 适合任务吗?

php - 这是一个正确的 utm.gif 查询吗?

java - 如何使用xsl :variable in xsl:choose

javascript - jQuery Submit 函数不会发布值

php - 根据 PHP 的受欢迎程度显示帖子的最佳方法是什么?

php - 分页工作正常但出现错误

MYSQL - 仅当两个表都有条目时才显示结果

php - 如何自动查询mysql以检索名称

PHP 回显 json_encode