使用 WPDB 方法在 Woocommerce 中批量插入简单产品
Bulk insert simple products in Woocommerce using WPDB methods
在 WooCommerce 中,我 从 json 文件中插入 25 000 个产品!
我在考虑使用 WPDB()
insert()
方法,因为使用 WC_Product()
方法时,这是一个较重的过程,需要更多的时间和服务器上的资源。
所以在下面的代码中,我尝试使用 WPDB()
insert()
方法:
for( $i = 0; $i < count($data->DataList); $i++ ) {
$DiamondData = array(
'Shape' => $Shape,
'Size' => $Size,
'Color' => $Color,
'Clarity' => $Clarity,
'Cut' => $Cut
);
$wpdb->insert($table,$DiamondData);
$my_id = $wpdb->insert_id;
}
非常感谢任何帮助和指导。
在您的代码示例中,您似乎正在尝试为每个产品添加一些产品属性。 产品属性比较复杂,需要检查它们是否存在以及条款是否也存在。如果没有,您需要创建它们……完成后,您可以在产品中设置它们。
在 foreach 循环中使用 WPDB()
class insert()
方法,意味着您正在逐个产品插入数据,并且它会产品的数量和需要检查的东西也很重。
但您没有义务使用WC_Product()
Class和方法。您也可以使用旧方法使用 Wordpress 函数,Stack Overflow 上有很多示例。
因此您可以使用类似下面的方法,它会插入带有产品属性的简单产品,但每次将过程限制为 500 个产品。
如果进程因任何原因停止,您可以在原处重新启动它...
代码(可以嵌入函数中):
$limit = 500; // Number of products to be processed (here 500 by 500 products)
$index = (int) get_option( 'custom_product_insertion_index' ); // Get the index of processed products
$insertion_count = 0; // Initializing
// Loop through data array to be inserted in each product
for( $i = $index; $i < count($data->DataList); $i++ ) {
// First insert the new product to get the post ID
$post_id = wp_insert_post(
'post_title' => $product_name,
'post_content' => $product_description,
'post_type' => 'product',
'post_status' => 'publish'
);
// Set the product type (here a simple product)
wp_add_object_terms( $post_id, 'simple', 'product_type' );
$attributes_data = [];
$attributes = array(
'Shape' => $shape,
'Size' => $size,
'Color' => $color,
'Clarity' => $clarity,
'Cut' => $cut
);
$count = 0;
// Check if attributes and terms exist, if not we create them
foreach ($attributes_raw as $attribute => $term ){
$taxonomy = 'pa_'.sanitize_title($attribute_name); // The attribute taxonomy
// If taxonomy doesn't exists we create it (Thanks to Carl F. Corneil)
if( ! taxonomy_exists( $taxonomy ) ){
register_taxonomy(
$taxonomy,
'product_variation',
array(
'hierarchical' => false,
'label' => ucfirst($taxonomy),
'query_var' => true,
'rewrite' => array( 'slug' => sanitize_title($attribute_name)), // The base slug
),
);
}
$term_name = ucfirst($term);
// Add the product attribute term if it doesn't exist.
if( ! term_exists( $term_name, $taxonomy ) )
wp_insert_term( $term_name, $taxonomy ); // Create the term
// Set the term in the product
wp_set_post_terms( $post_id, $term_name, $taxonomy );
$attributes_data[$taxonomy] = array(
'name' => $taxonomy,
'value' => '',
'position' => $count,
'is_visible' => true,
'is_variation' => false,
'is_taxonomy' => true,
);
$count++;
}
// Add the product attribute data in the product
update_post_meta($post_id, '_product_attributes', $attributes_data );
// Add the product price
update_post_meta($post_id, '_price', $price );
// and so on…
$insertion_count++;
// Saving the number of processed products
update_option( 'custom_product_insertion_index', $index++ );
if( $insertion_count >= 500 ) break; // stop the loop after 500 products inserted
}
备份数据库…
您可能需要完成每个产品中需要设置的其他数据的代码。
在 WooCommerce 中,我 从 json 文件中插入 25 000 个产品!
我在考虑使用 WPDB()
insert()
方法,因为使用 WC_Product()
方法时,这是一个较重的过程,需要更多的时间和服务器上的资源。
所以在下面的代码中,我尝试使用 WPDB()
insert()
方法:
for( $i = 0; $i < count($data->DataList); $i++ ) {
$DiamondData = array(
'Shape' => $Shape,
'Size' => $Size,
'Color' => $Color,
'Clarity' => $Clarity,
'Cut' => $Cut
);
$wpdb->insert($table,$DiamondData);
$my_id = $wpdb->insert_id;
}
非常感谢任何帮助和指导。
在您的代码示例中,您似乎正在尝试为每个产品添加一些产品属性。 产品属性比较复杂,需要检查它们是否存在以及条款是否也存在。如果没有,您需要创建它们……完成后,您可以在产品中设置它们。
在 foreach 循环中使用 WPDB()
class insert()
方法,意味着您正在逐个产品插入数据,并且它会产品的数量和需要检查的东西也很重。
但您没有义务使用WC_Product()
Class和方法。您也可以使用旧方法使用 Wordpress 函数,Stack Overflow 上有很多示例。
因此您可以使用类似下面的方法,它会插入带有产品属性的简单产品,但每次将过程限制为 500 个产品。
如果进程因任何原因停止,您可以在原处重新启动它...
代码(可以嵌入函数中):
$limit = 500; // Number of products to be processed (here 500 by 500 products)
$index = (int) get_option( 'custom_product_insertion_index' ); // Get the index of processed products
$insertion_count = 0; // Initializing
// Loop through data array to be inserted in each product
for( $i = $index; $i < count($data->DataList); $i++ ) {
// First insert the new product to get the post ID
$post_id = wp_insert_post(
'post_title' => $product_name,
'post_content' => $product_description,
'post_type' => 'product',
'post_status' => 'publish'
);
// Set the product type (here a simple product)
wp_add_object_terms( $post_id, 'simple', 'product_type' );
$attributes_data = [];
$attributes = array(
'Shape' => $shape,
'Size' => $size,
'Color' => $color,
'Clarity' => $clarity,
'Cut' => $cut
);
$count = 0;
// Check if attributes and terms exist, if not we create them
foreach ($attributes_raw as $attribute => $term ){
$taxonomy = 'pa_'.sanitize_title($attribute_name); // The attribute taxonomy
// If taxonomy doesn't exists we create it (Thanks to Carl F. Corneil)
if( ! taxonomy_exists( $taxonomy ) ){
register_taxonomy(
$taxonomy,
'product_variation',
array(
'hierarchical' => false,
'label' => ucfirst($taxonomy),
'query_var' => true,
'rewrite' => array( 'slug' => sanitize_title($attribute_name)), // The base slug
),
);
}
$term_name = ucfirst($term);
// Add the product attribute term if it doesn't exist.
if( ! term_exists( $term_name, $taxonomy ) )
wp_insert_term( $term_name, $taxonomy ); // Create the term
// Set the term in the product
wp_set_post_terms( $post_id, $term_name, $taxonomy );
$attributes_data[$taxonomy] = array(
'name' => $taxonomy,
'value' => '',
'position' => $count,
'is_visible' => true,
'is_variation' => false,
'is_taxonomy' => true,
);
$count++;
}
// Add the product attribute data in the product
update_post_meta($post_id, '_product_attributes', $attributes_data );
// Add the product price
update_post_meta($post_id, '_price', $price );
// and so on…
$insertion_count++;
// Saving the number of processed products
update_option( 'custom_product_insertion_index', $index++ );
if( $insertion_count >= 500 ) break; // stop the loop after 500 products inserted
}
备份数据库…
您可能需要完成每个产品中需要设置的其他数据的代码。