当前位置: 首页 > 知识库问答 >
问题:

在WooCommerce 4中以编程方式从自定义产品类型添加新产品

王英彦
2023-03-14

我想创建一个产品从前端直接到一个分组的产品在WooCommerce。现在它正在“简单产品”中创建一个产品。

截图:

当前代码:

$auction_image =  $_POST['auction_image_url']?: '';
$auction_title =  $_POST['auction_title'] ?: '';
$auction_category = $_POST['auction_category'] ?: 'auction';
 
$author_id = $_POST['author_id'] ?: '';

$auction = array(
        'post_author' => $author_id,
        'post_content' => 'Description',
        'post_status' => "publish",
        'post_title' => $auction_title,
        'post_parent' => '',
        'post_type' => "product",
    );

//Create post
$auction_id = wp_insert_post($auction, $wp_error);
if ($auction_id) {
    save_featured_image($auction_image, $auction_id);
    wp_set_object_terms($auction_id, $auction_category, 'product_cat');
    update_post_meta($auction_id, '_author_id', $author_id);
    wp_send_json_success(array('auction_id' => $auction_id,'message' => 'Auction Added Successfully!!'), 200);
} else {
    wp_send_json_error($product_id->get_error_message());
}

共有1个答案

卢朝
2023-03-14

1)。而不是使用WordPress的老方式,因为WooCommerce 3,使用WC_Order方法代替。

  • 产品映像:通常映像是从附件id设置的,但不是从URL设置的。此外,save_featured_image()不是WordPress函数。
  • 产品名称(或标题):是强制性的。
  • 在你提供的代码中有很多错误和错误。
  • 在下面的代码中,您必须定义产品类型

例如,对于"分组"产品类型:

$auction_title    = isset($_POST['auction_title']) ? sanitize_text_field($_POST['auction_title']) : '';
$auction_category = isset($_POST['auction_category']) ? esc_attr($_POST['auction_category']) : 'auction';

$product_type = 'grouped'; // <== Here define your product type slug
$class_name   = WC_Product_Factory::get_classname_from_product_type($product_type); // Get the product Class name

// If the product class exist for the defined product type
if( ! empty($class_name) && class_exists( $class_name ) ) {
    $product = new $class_name(); // Get an empty instance of a grouped product Object
}
// For a custom product class
else {
    $class_name = 'WC_Product_custom'; // <== Here define the Class name of your custom product type

    if( class_exists( $class_name ) ) {
        $product = new $class_name(); // Get an empty instance of a custom class product Object
    } else {
        wp_send_json_error( array( 'message' =>__('Wrong product class') ), 409 );
        return; // or exit;
    }
}

$product->set_name($auction_title);
$product->set_description('Description');
$product->set_short_description('Short_description');
$product->set_status('publish');

// $product-> set_image_id( $image_id ); // ???

$category_term = get_term_by( 'slug', $auction_category, 'product_cat' ); // Get the term from its slug
if( is_a($category_term, 'WP_Term') ) {
    $product->set_category_ids( array($category_term->term_id) );
}

$product_id = $product->save(); // Save product to database

if ( $product_id ) { 
    // Set the post author
    if( isset($_POST['author_id']) ) {
        wp_update_post('ID' => $product_id, 'post_author' => esc_attr($_POST['author_id']) );
    }

    wp_send_json_success(array('auction_id' => $product_id,'message' => __('Auction Added Successfully!!') ), 200);
} else {
    wp_send_json_error( array( 'auction_id' => $product_id, 'message' =>__('Auction failed :(') ), 400 );
}

这段代码应该更好地工作。

2)。或者你仍然可以使用Wordpress老方式组合:

$auction_data = array(
    'post_author'  => isset($_POST['author_id']) ? esc_attr($_POST['author_id']) : '',
    'post_content' => 'Description',
    'post_status'  => "publish",
    'post_title'   => isset($_POST['auction_title']) ? sanitize_text_field($_POST['auction_title']) : __('Empty title'),
    'post_parent'  => '',
    'post_type'    => "product",
);

$auction_id = wp_insert_post($auction_data, $wp_error);

if ( $auction_id ) {
    $auction_category = isset($_POST['auction_category']) ? esc_attr($_POST['auction_category']) : 'auction';
    wp_set_object_terms( $auction_id, $auction_category, 'product_cat' );
    
    if( isset($_POST['auction_image_url']) && function_exists('save_featured_image') ) {
        save_featured_image($auction_image, ecs_attr($_POST['auction_image_url']));
    }

    update_post_meta( $auction_id, '_author_id', $author_id );
    
    $product_type = 'grouped'; // <== Here define your product type slug
    $class_name   = WC_Product_Factory::get_product_classname( $product_id, $new_product_type );
    
    // If the product class exist for the defined product type
    if( ! empty($class_name) && class_exists( $class_name ) ) {
        $product = new $class_name($auction_id); // Get an empty instance of a grouped product Object
    }
    // For a custom product class (you may have to define the custom class name)
    else {
        $class_name = 'WC_Product_custom'; // <== Here define the Class name of your custom product type
    
        if( class_exists( $class_name ) ) {
            $product = new $class_name($auction_id); // Get an empty instance of a custom class product Object
        } else {
            wp_send_json_error( array( 'message' =>__('Wrong product class') ), 409 );
            return; // or exit;
        }
    }

    $auction_id = $product->save(); // Save to database
    
    wp_send_json_success( array('auction_id' => $auction_id, 'message' => __('Auction Added Successfully!!') ), 200 );
} else {
    wp_send_json_error( array('message' => __('Auction Failed') 400 );
}

这也应该行得通。

相关的:

  • 使用Woocommerce 3中的CRUD方法以编程方式创建产品
  • 更改WooCommerce 3中现有产品的产品类型
  • WC_产品类(方法)和WC_产品组类(方法)的源代码
 类似资料:
  • 我试图以编程方式批量添加WooCommerce中的产品,但出于某种原因,它只是添加了第一个产品。我正在向一个应用程序发出请求,该应用程序返回带有产品名称和描述的JSON响应。到目前为止,我的代码看起来像下面的代码:

  • 在WooCommerce中,我试图找到一种类似于方法或的方法,例如,设置产品类型,如简单或变化。 实际上,我使用的是对象如下: 如果用户选中“简单产品”或“可变产品”,我如何设置产品类型? 任何帮助都很感激。

  • 我需要如此的帮助。我试图以编程方式更新WooCommerce产品库存数量。我们有一个供应商饲料给我们通过一些JSON。我可以从提要中读取股票,并可以正确地从后元数据中提取数据。我使用最新版本的WP和WOO。PHP是7.2 下面是我如何从SKU中查找产品ID。 这将返回正确的ID,我可以使用它查看已存在的当前元数据: 然后我更新我从提要中得到的股票。这可以是从零到x或x到零的股票,以及介于两者之间的

  • 如何从插件为WooCommerce创建属性?我只发现: 从这个问题 但这种方法需要某些产品的id。我需要生成一些未附加到任何产品的属性。

  • 每次根据其他几个字段的内容保存产品时,我都希望更新产品在我的商店中的属性。 然而,我正在努力让我的属性正确出现。 最初,我试图使用以下功能根据这个问题的公认答案更新产品: 这将添加到了分类法的可用术语列表中,但在我检查产品属性时,它们不可见。 接下来,我尝试了上述问题中第二个答案的变体: 这也无法更新产品的属性。 在这一点上,我不知道下一步该尝试什么。使用操作似乎是有效的,因为这个术语确实被添加到

  • 我有一个WS,它返回非常基本的产品数据:代码、价格和图像。我需要用这些基本数据以编程方式创建Hybris产品,然后进行同步,以便在店面上看到这些产品。 创建具有这些基本信息的产品的步骤是什么?有OOTB服务吗?