Как обновить пользовательские метаданные (добавить имя поставщика из Dokan) всех продуктов на сайте?

#wordpress #woocommerce

#wordpress #woocommerce woocommerce

Вопрос:

На сайте есть плагин Dokan. Теперь мне нужно добавить vendor_name к каждому продукту, например, в пользовательское мета-поле. И я попытался сделать что-то вроде этого:

 $args = array(
   'post_type' => 'product',
   'posts_per_page' => -1
);

 $products = new WP_Query( $args );
    if ( $products->have_posts() ):
       while ( $products->have_posts() ):
          
           $vendor_id = get_post_field( 'post_author', get_the_id() );
           $vendor = new WP_User($vendor_id);
           $store_info  = dokan_get_store_info( $vendor_id );
           $store_name  = $store_info['store_name'];   

           $productID = $product->get_id();
           update_post_meta( $productID, 'vendor_name', $store_name );
           $products->the_post();
       endwhile;
  endif;
 

Таким образом, я решил обновить метаданные для всех продуктов. Но когда я добавляю этот код в functions.php Сайт просто перестает загружаться, вернее, он загружается, но так медленно. Здесь нет никаких ошибок. Хотя я могу и ошибаться. Может быть, проблема не в коде, а в том, что на сайте более 18 000 товаров? Или, может быть, есть другой способ достичь нужной мне цели. Пожалуйста, помогите мне разобраться в этом.

Ответ №1:

Вы можете попробовать запустить этот код в действии WordPress и проверить некоторый аргумент запроса, чтобы он не загружался в обычном представлении. Это одноразовый процесс, который означает, что вы можете запустить этот скрипт самостоятельно.

 add_action( 'wp', function(){
    if( isset( $_REQUEST['add_vendor_meta'] ) amp;amp; $_REQUEST['add_vendor_meta'] == 'true' ){
        $args = array(
            'post_type' => 'product',
            'posts_per_page' => -1
        );

        $products = new WP_Query( $args );
        if ( $products->have_posts() ):
            while ( $products->have_posts() ):
                $products->the_post();
                $vendor_id = get_post_field( 'post_author', get_the_id() );
                $vendor = new WP_User($vendor_id);
                $store_info  = dokan_get_store_info( $vendor_id );
                $store_name  = $store_info['store_name'];   

                $productID = $product->get_id();
                update_post_meta( $productID, 'vendor_name', $store_name );

            endwhile;
            wp_reset_postdata();
        endif;
    }
} );
 

А также убедитесь, что вы добавили wp_reset_postdata() после завершения цикла while, это помогает сбросить ваш пользовательский запрос и не влияет на основной запрос.