Создайте продукт WooCommerce с тем же именем, когда пользовательский тип публикации будет опубликован - PullRequest
1 голос
/ 30 мая 2019

У меня есть пользовательский тип записи под названием Event, который я хочу продавать через woocommerce. Итак, что я хочу, когда я создаю сообщение о событии, оно автоматически создает продукт под именем woocommerce с тем же именем. Возможно ли это?

Я попробовал следующий код, найденный в Создание продукта Woocommerce при создании сообщения

add_action( 'save_event', 'auto_create_product_from_post', 100, 2 ); 
function auto_create_product_from_post($id, $post){
$post_id = wp_insert_post( array(
    //'post_title' => 'Adams Product',
    'post_title' => $post.post_title,
    'post_content' => $post.post_title,
    'post_status' => 'publish',
    'post_type' => "product",
) );
    wp_set_object_terms( $post_id, 'simple', 'product_type' );
    update_post_meta( $post_id, '_visibility', 'visible' );
    update_post_meta( $post_id, '_stock_status', 'instock');
    update_post_meta( $post_id, 'total_sales', '0' );
    update_post_meta( $post_id, '_downloadable', 'no' );
    update_post_meta( $post_id, '_virtual', 'yes' );
    update_post_meta( $post_id, '_regular_price', '' );
    update_post_meta( $post_id, '_sale_price', '' );
    update_post_meta( $post_id, '_purchase_note', '' );
    update_post_meta( $post_id, '_featured', 'no' );
    update_post_meta( $post_id, '_weight', '' );
    update_post_meta( $post_id, '_length', '' );
    update_post_meta( $post_id, '_width', '' );
    update_post_meta( $post_id, '_height', '' );
    update_post_meta( $post_id, '_sku', '' );
    update_post_meta( $post_id, '_product_attributes', array() );
    update_post_meta( $post_id, '_sale_price_dates_from', '' );
    update_post_meta( $post_id, '_sale_price_dates_to', '' );
    update_post_meta( $post_id, '_price', '' );
    update_post_meta( $post_id, '_sold_individually', '' );
    update_post_meta( $post_id, '_manage_stock', 'no' );
    update_post_meta( $post_id, '_backorders', 'no' );
    update_post_meta( $post_id, '_stock', '' );
}

Но приведенный выше код выдает ошибку Recoverable fatal error: Object of class WP_Post could not be converted to string. Я изменил хук действия на publish_event, но мой веб-сайт зашел в бесконечный цикл и все еще создает множество продуктов даже после того, как я удалил код.

1 Ответ

1 голос
/ 30 мая 2019

Неправильная часть: $post.post_title$post - это объект WP_Post, поэтому используйте -> в $post->post_title, чтобы получить заголовок записи, так как . используется для конкатенации строк в PHP.

Итак, в вашем коде:

$product = wp_insert_post( array(
    //'post_title' => 'Adams Product',
    'post_title' => $post->post_title, // <=== HERE
    'post_content' => $post->post_content, // <=== Changed
    'post_status' => 'publish',
    'post_type' => "product",
) );

Это решит вашу проблему.


Лучший способ: Начиная с WooCommerce 3, вы можете использовать Объекты CRUD вроде:

add_action( 'save_event', 'auto_create_product_from_post', 100, 2 );
function auto_create_product_from_post($id, $post){
    // Create an empty instance of the WC_Product
    $product = new WC_Product_Simple(); // <=== Simple product

    $product->set_name( $post->post_title );
    $product->set_status( $post->post_status );
    $product->set_description( $post->post_content ); // (optional)
    $product->set_short_description( $post->post_excerpt ); // (optional)

    // You can use any available WC_Product methods to set other properties
    // see: https://docs.woocommerce.com/wc-apidocs/class-WC_Product.html

    $product->save(); // Save (publish) new product
}

Код помещается в файл functions.php вашей активной дочерней темы (или активной темы).Проверено и работает.

...