#php #wordpress #woocommerce #product #custom-taxonomy
#php #wordpress #woocommerce #продукт #пользовательская таксономия
Вопрос:
В WooCommerce мне нужно вставить 25 000 товаров из файла json!
Я думал использовать этот 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;
}
Любая помощь и рекомендации будут действительно оценены.
Комментарии:
1. Всегда используйте встроенную функцию / функцию-член woocommerce для вставки продуктов, если проблема связана с сбоем сервера, пожалуйста, используйте фоновый процесс для продолжения github.com/deliciousbrains/wp-background-processing
2. Спасибо, но я понятия не имею о фоновой обработке wp. Как использовать в моем коде?
3. Проверьте их документацию, и они также предоставили пример плагина, пожалуйста, ознакомьтесь с ним, так как процесс полностью основан на cron с процессом очереди
4. github.com/A5hleyRich/wp-background-processing-example это тот плагин, о котором я говорю
Ответ №1:
В вашем примере кода кажется, что вы пытаетесь добавить некоторые атрибуты продукта к каждому продукту. Атрибуты продукта — это нечто сложное, требующее проверки, существуют ли они, и выходят ли термины. Если они этого не делают, вам нужно их создать… После этого вы можете установить их в продукте.
Использование WPDB()
insert()
метода класса в цикле foreach означает, что вы вставляете данные продукт за продуктом, и это также будет очень сложно с точки зрения количества продуктов и вещей, которые необходимо проверить.
Но вы не обязаны использовать WC_Product()
класс и методы. Вы также можете использовать старый способ, используя функции WordPress, и есть много примеров переполнения стека.
Таким образом, вы могли бы использовать что-то вроде приведенного ниже, которое будет вставлять простые продукты с их атрибутами продукта, но ограничивая процесс, например, 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
}
Сделайте резервную копию базы данных…
Возможно, вам потребуется завершить код для других данных, которые необходимо задать в каждом продукте.
Комментарии:
1. Спасибо за помощь. Сегодня я поработаю над этим и дам вам знать, сэр 🙂
2. Спасибо, LoicTheAztec, он работает нормально и быстро. 🙂