我正在开发一个插件,将超过 20.000 个自定义帖子插入数据库,每个自定义帖子大约有 9 个元帖子条目。
这需要 MySQL 很长时间。有更好的方法吗?
我像这样插入元发布数据:
$post_meta = array(
'_stock_status'=>'instock',
'_price'=>$r["price"],
'_regular_price'=>$r["price_old"],
'_sale_price'=>$r["price"],
'_visibility'=>'visible',
'_button_text'=>'buy',
'_product_url'=>$r["link"],
'_product_external_image_url'=>$r["imagelink"],
'_sku'=>$r["prdcrd"]
);
go_update_post_meta($post_id,$post_meta);
function go_update_post_meta($post_id,$meta){
foreach($meta as $key=>$val){
update_post_meta($post_id,$key,$val);
}
}
我正在做一个导入插件,并且遇到了同样的问题。 70-80 个帖子,每个帖子可能有 20 个元值。 我认为你可以将所有数据存储在一个数组中并执行类似的操作
INSERT INTO wp_postmeta (post_id,meta_key,meta_value) VALUES ($post_id,$key1,$value1),($post_id,$key2,$value2) ,($post_id,$key3,$value3);
应该比你现在使用的循环更快。
看到你的功能,也许这会起作用
function go_update_post_meta($post_id,$meta){
global $wpdb;
$values = '';
$a = 0;
foreach($meta as $key=>$val){
$a++;
if ($a > 1) $values .=',';
$values .= '('.$post_id.',"'.$key.'","'.$val.'")';
}
$sql = "INSERT INTO wp_postmeta (post_id,meta_key,meta_value) VALUES ".$values;
$wpdb->query($sql);
}
在我的代码中测试并工作。看起来更快
我认为没有更好的方法可以做到这一点。这确实是 WordPress 将帖子元数据存储为大量键值对行的方式的固有缺点。
不幸的是,这会导致在这种情况下进行大量更新和插入,这就是它很慢的原因。
不过,值得检查一下 post_id 和 key 列上是否有索引。这可能有助于加快更新查询速度。