Установите тип продукта при программном создании продукта в Woocommerce 3 - PullRequest
0 голосов
/ 03 декабря 2018

В Woocommerce я пытаюсь найти способ, аналогичный WC_Product методам set_name() или set_status(), например, для установки типа продукта, например Простой или Вариация .

На самом деле я использую объект WC_Product следующим образом:

    $product = new WC_Product;

    $product->set_name($data['product']['title']);

    $product->set_status('pending');

    $product->save();

Как мне установить тип продукта , если пользователь выберет "простой продукт" или "Переменный продукт "?

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Не существует метода типа для класса WC_Product.Тип продукта управляется подклассами продукта…

Сначала вы получите пустой экземпляр объекта WC_Product для требуемого типа продукта:

  1. Переменная тип: $product = new WC_Product_Variable();
  2. сгруппированный тип: $product = new WC_Product_Grouped();
  3. внешний тип: $product = new WC_Product_External();
  4. Простой тип: $product = new WC_Product_Simple();

Затем для выбранного типа продукта можно использовать любой метод WC_product или соответствующие методы подкласса продукта для объекта $product:

$product->set_name($data['product']['title']);
$product->set_status('publish');

Затем вы сохраните продукт (и при желании он вернет идентификатор продукта) :

$product_id = $product->save();

См .: Создание программного продукта с использованием методов CRUD в Woocommerceчасть существующего продукта Variable…

// Get the Variable product object (parent) from an existing product ID
$product = wc_get_product( $product_id );

// Define the variation data
$variation_post = array(
    'post_title'  => $product->get_title(),
    'post_name'   => 'product-'.$product_id.'-variation',
    'post_status' => 'publish',
    'post_parent' => $product_id,
    'post_type'   => 'product_variation',
    'guid'        => $product->get_permalink()
);

// Creating the product variation
$variation_id = wp_insert_post( $variation_post );

// Get an instance of the product variation Object
$variation = new WC_Product_Variation( $variation_id );

// Set existing product attribute values (defined in the variable product)
$variation->update_meta_data( 'attribute_'.'pa_color', 'blue' );
$variation->update_meta_data( 'attribute_'.'pa_size', 'xxl' );

# You can use any WC_Product allowed setter methods on the $variation object

$variation->set_regular_price( 25 );
$variation->set_price( 25 );

$variation->save();

См. эти 2 связанные темы:

0 голосов
/ 03 декабря 2018

Хотя WooCommerce не предоставляет API для изменения типа продукта, фактически WooCommerce действительно реализует эту функцию, поскольку необходимо поддерживать изменение типа продукта с помощью поля выбора «Тип продукта» на страницах администратора, таких как https :://aaa.bbb.ccc/wp-admin/post.php?post=12345&action=edit.Код для этого по сути следующий:

    $classname = WC_Product_Factory::get_product_classname( $post_id, $product_type );
    $product   = new $classname( $post_id );
    $product->save();

Обратите внимание, что здесь происходит преобразование типа продукта, поскольку тип продукта существующего продукта с id == $ post_id может отличаться от $ product_type.Очевидно, можно использовать конструктор продукта другого типа, чем тот, который использовался для первоначального конструирования продукта.Это кажется странным, но именно так поступает код WooCommerce при изменении типа продукта на странице администратора.

REST API осуществляет изменение типа продукта практически таким же образом.

0 голосов
/ 03 декабря 2018

Тип обычно устанавливается при создании продукта:

$prod_data = [
    'name'          => 'A great product',
    'type'          => 'simple',
    'regular_price' => '15.00',
    'description'   => 'A very meaningful product description',
    'images'        => [
        [
            'src'      => 'https://shop.local/path/to/image.jpg',
            'position' => 0,
        ],
    ],
    'categories'    => [
        [
            'id' => 1,
        ],
    ],
];

$woocommerce->post( 'products', $prod_data );

Я не уверен, есть ли функция для изменения типа продукта, но ее можно изменить с помощью REST API:

$api_response = wp_remote_post( 'https://your-website/wp-json/wc/v2/products/{PRODUCT ID}', array(
    //'method'    => 'PUT',
    'headers' => array(
        'Authorization' => 'Basic ' . base64_encode( 'KEY:SECRET' )
    ),
    'body' => array(
        'type' => 'simple', // just update the product type
        // Options: simple, grouped, external and variable
        // more params http://woocommerce.github.io/woocommerce-rest-api-docs/?shell#product-properties
    )
) );

$body = json_decode( $api_response['body'] );
//print_r( $body );

if( wp_remote_retrieve_response_message( $api_response ) === 'OK' ) {
    echo 'The product ' . $body->name . ' has been updated';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...