Массовая вставка простых продуктов в Woocommerce с использованием методов WPDB

#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, он работает нормально и быстро. 🙂