Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Woocommerce 3中以编程方式创建订单后更新产品库存_Php_Wordpress_Woocommerce_Stock_Orders - Fatal编程技术网

Php 在Woocommerce 3中以编程方式创建订单后更新产品库存

Php 在Woocommerce 3中以编程方式创建订单后更新产品库存,php,wordpress,woocommerce,stock,orders,Php,Wordpress,Woocommerce,Stock,Orders,我编写了一个插件来快速购买产品,而不是通过按钮添加到购物车 我创建的自定义属性是Color,每种颜色都有产品的数量 问题是:当我点击按钮快速购买产品 它将在WooCommerce>order中自动插入订单 但在库存中,不要减少我购买的产品数量 我要处理的代码如下: add_action("wp_ajax_sb_test_ajax", "sb_test_ajax_callback"); add_action("wp_ajax_nopriv_sb_test_ajax", "sb_test_ajax_

我编写了一个插件来快速购买产品,而不是通过按钮
添加到购物车

我创建的自定义属性是
Color
,每种颜色都有产品的数量

问题是:当我点击按钮快速购买产品

它将在WooCommerce>order中自动插入订单

但在库存中,不要减少我购买的产品数量

我要处理的代码如下:

add_action("wp_ajax_sb_test_ajax", "sb_test_ajax_callback");
add_action("wp_ajax_nopriv_sb_test_ajax", "sb_test_ajax_callback");

function sb_test_ajax_callback(){
    $address = array(
            'phone'      => $_POST['phone'],
        );

    $order = wc_create_order(array('customer_id'=>get_current_user_id()));
    // print_r($order);
    update_post_meta( $order->get_id(), '_billing_phone', $_POST['phone']);
    update_post_meta( $order->get_id(), '_billing_email', $_POST['email']);
    update_post_meta( $order->get_id(), '_shipping_address_1', 'Tại: '.$_POST['dia_chi']);
    update_post_meta( $order->get_id(), '_shipping_last_name', 'Tên: '.$_POST['ho_ten']);
    $order->set_customer_user_agent( wc_get_user_agent() );
    $order->set_customer_note($_POST['ghi_chu']);
    $order->set_address( $address, 'billing' );

    if( isset($_POST['product_id']) && $_POST['product_id'] ){
        $id = ($_POST['variation_id']) ? $_POST['variation_id'] : $_POST['product_id'];
        $order->add_product( get_product( $id ), $_POST['qty'] ); //(get_product with id and next is for quantity)
        $order->calculate_totals();

    } else {
        $cart = WC()->cart;
        //print_r($cart);
        $cart_hash = md5( json_encode( wc_clean( $cart->get_cart_for_session() ) ) . $cart->total );
        $order->set_cart_hash( $cart_hash );
        WC_Checkout::create_order_line_items( $order, $cart );
        $order->set_total( $cart->total );

        $order->set_shipping_total( $cart->shipping_total );
        $order->set_discount_total( $cart->get_cart_discount_total() );
        $order->set_discount_tax( $cart->get_cart_discount_tax_total() );
        $order->set_cart_tax( $cart->tax_total );
        $order->set_shipping_tax( $cart->shipping_tax_total );
        WC_Checkout::create_order_fee_lines( $order, $cart );
        WC_Checkout::create_order_shipping_lines( $order, WC()->session->get( 'chosen_shipping_methods' ), WC()->shipping->get_packages() );
        WC_Checkout::create_order_tax_lines( $order, $cart );
        WC_Checkout::create_order_coupon_lines( $order, $cart );
        $cart->empty_cart();
    }

    $order->save();

    WC()->payment_gateways();
    WC()->shipping();

    // Load mailer.
    $mailer = WC()->mailer();
    $email_to_send = 'new_order';
    $mails = $mailer->get_emails();

    if ( ! empty( $mails ) ) {
        foreach ( $mails as $mail ) {
            if ( $mail->id == $email_to_send ) {
                $mail->trigger( $order->get_id(), $order );
                /* translators: %s: email title */
                $order->add_order_note( sprintf( __( '%s don't have any notes.', 'woocommerce' ), $mail->title ), false, true );
            }
        }
    }
}

// add custom button woo
add_action('woocommerce_after_add_to_cart_button','cmk_additional_button');
function cmk_additional_button() {
?>
<br/>
<a href="#modal" class="mua_nhanh_nhanh">Quick Buy</a>
<div class="remodal" data-remodal-id="modal">
  <button data-remodal-action="close" class="remodal-close"></button>
  <div class="mua_nhanh">
        <h3>Buy a product: <?php the_title(); ?></h3>
        <form action="" method="post" id="buy_click_form">
        <input type="hidden" value="buy_click" name="action">
        <input id="id_sp" type="hidden" value="<?php the_ID(); ?>" name="product_id">
        <input id="ho_ten" type="text" placeholder="Name"/>
        <input id="email_kk" type="email" placeholder="Email"/>
        <input id="dia_chi" type="text" placeholder="Address"/>
        <input type="tel" value="" name="phone" class="one_click_tel" placeholder="Phone number:" onFocus="if(this.value=='') this.value='+84';" >
    <input type='button' value='-' class='qtyminus' field='quantity'/>
    <input type='text' name='quantity' value='1' class='qty' onkeypress='return event.charCode >= 48 && event.charCode <= 57'/>
    <input type='button' value='+' class='qtyplus' field='quantity' />
    <textarea rows="2" id="ghi_chu" placeholder="Note(optinal)"></textarea>
        <button type="submit" class="buy_click" >Buy Now</button>
    </form>
    </div>
</div>
add_action(“wp_ajax_sb_test_ajax”,“sb_test_ajax_callback”);
添加动作(“wp_ajax_nopriv_sb_test_ajax”,“sb_test_ajax_callback”);
函数sb\u test\u ajax\u callback(){
$address=数组(
'phone'=>$\u POST['phone'],
);
$order=wc\u create\u order(数组('customer\u id'=>get\u current\u user\u id());
//打印(订单);
更新发布元($order->get\u id(),“'u billing\u phone',$'u post['phone']);
更新发布元($order->get_id(),“'u billing_email',$”发布['email']);
更新发布元数据($order->get_id(),''u shipping_address_1','Tại:“.$”邮政['dia_chi']);
更新发布元数据($order->get_id(),'u shipping_last_name','Tên:'。$\u post['hou ten']);
$order->set_customer_user_agent(wc_get_user_agent());
$order->set_customer_note($_POST['ghi_chu']);
$order->set_address($address,'billing');
如果(isset($\u POST['product\u id'])和&$\u POST['product\u id'])){
$id=($发布['variation\u id'])?$发布['variation\u id']:$发布['product\u id'];
$order->add_product(获取产品($id),$_POST['qty']);//(获取具有id的产品,下一步是数量)
$order->计算_总计();
}否则{
$cart=WC()->cart;
//打印(购物车);
$cart\u hash=md5(json\u编码(wc\u clean($cart->get\u cart\u for\u session())。$cart->total);
$order->set\u cart\u hash($cart\u hash);
WC\u Checkout::创建订单行项目($order,$cart);
$order->set_total($cart->total);
$order->set_shipping_total($cart->shipping_total);
$order->设置折扣总额($cart->获取折扣总额();
$order->设置折扣税($cart->获取折扣税总额();
$order->set\u cart\u tax($cart->tax\u total);
$order->set_shipping_tax($cart->shipping_tax_total);
WC\u Checkout::创建订单费用行($order,$cart);
WC\u Checkout::创建订单发货行($order,WC()->session->get('selected\u shipping\u methods'),WC()->shipping->get\u packages());
WC_Checkout::创建_order_tax_行($order,$cart);
WC_Checkout::创建_订单_优惠券_行($order,$cart);
$cart->empty_cart();
}
$order->save();
WC()->支付网关();
WC()->shipping();
//装载邮件。
$mailer=WC()->mailer();
$email_to_send='new_order';
$mails=$mailer->get_emails();
如果(!空($mails)){
foreach($mails作为$mail){
如果($mail->id=$email\u to\u send){
$mail->trigger($order->get_id(),$order);
/*翻译人员:%s:电子邮件标题*/
$order->add\u order\u note(sprintf(\uuuuu(“%s没有任何注释”),'woocommerce'),$mail->title),false,true);
}
}
}
}
//添加自定义按钮woo
添加操作(“添加到购物车按钮后的woocommerce按钮”,“cmk附加按钮”);
功能cmk_附加_按钮(){
?>

购买产品: 更新-更新库存的正确方法是

此方法还发送电子邮件通知,并添加2条管理员注释(一条用于股票更新,另一条用于状态更改)

现在,在您的代码中有很多小错误和过时的代码。您必须在任何地方都使用CRUD setters方法。我已经对您的主要功能代码进行了更改并重新访问:

add_action("wp_ajax_sb_test_ajax", "sb_test_ajax_callback");
add_action("wp_ajax_nopriv_sb_test_ajax", "sb_test_ajax_callback");

function sb_test_ajax_callback(){
    $order = wc_create_order(array('customer_id'=>get_current_user_id()));
    $order->set_customer_user_agent( wc_get_user_agent() );
    $order->set_customer_ip_address( WC_Geolocation::get_ip_address() );
    $order->set_currency( get_woocommerce_currency() );
    $order->set_prices_include_tax( 'yes' === get_option( 'woocommerce_prices_include_tax' ) );
    
    // Customer data (use CRUD setters)
    $order->set_billing_phone( $_POST['phone'] );
    $order->set_billing_email( $_POST['email'] );
    $order->set_shipping_address_1( 'Tại: '.$_POST['dia_chi'] );
    $order->set_shipping_last_name( 'Tên: '.$_POST['ho_ten'] );
    $order->set_customer_note( $_POST['ghi_chu'] );

    if( isset($_POST['product_id']) && $_POST['product_id'] ){
        $product_id = ($_POST['variation_id']) ? $_POST['variation_id'] : $_POST['product_id'];
        // Get_product with id and next is for quantity
        $order->add_product( wc_get_product( $product_id ), $_POST['quantity'] ); // <= corrected
    } else {
        $cart = WC()->cart;
        $chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' );
        $shipping_packages = WC()->shipping->get_packages();
        $cart_hash = md5( json_encode( wc_clean( $cart->get_cart_for_session() ) ) . $cart->total );
        $order->set_cart_hash( $cart_hash );
        $order->set_total( $cart->total );
        $order->set_shipping_total( $cart->shipping_total );
        $order->set_discount_total( $cart->get_cart_discount_total() );
        $order->set_discount_tax( $cart->get_cart_discount_tax_total() );
        $order->set_cart_tax( $cart->tax_total );
        $order->set_shipping_tax( $cart->shipping_tax_total );
        WC()->checkout->create_order_line_items( $order, $cart );
        WC()->checkout->create_order_shipping_lines( $order, $chosen_shipping_methods, $shipping_packages );
        WC()->checkout->create_order_tax_lines( $order, $cart );
        WC()->checkout->create_order_coupon_lines( $order, $cart );
        WC()->checkout->create_order_fee_lines( $order, $cart );
        $cart->empty_cart();
    }
    
    // [Not really needed] Get an instance of  WC_emails object
    # $mailer = WC()->mailer()->get_emails();
    # $email_title = $mailer['WC_Email_New_Order']->title; // email title
    
    // [Not really needed] Admin note
    # $note = sprintf( __( "%s don't have any notes.", "woocommerce" ), $email_title );
    # $order->add_order_note( $note, false, true );
    
    // Update totals
    $order->calculate_totals();

    // Save the data
    $order->save();

    ## STOCK and Status update
    $order->payment_complete();

    ## [NOT needed] Send new order email notification
    # $mailer['WC_Email_New_Order']->trigger( $order->get_id() );
    # echo '<p>Order generated</p>';
}
add_action(“wp_ajax_sb_test_ajax”,“sb_test_ajax_callback”);
添加动作(“wp_ajax_nopriv_sb_test_ajax”,“sb_test_ajax_callback”);
函数sb\u test\u ajax\u callback(){
$order=wc\u create\u order(数组('customer\u id'=>get\u current\u user\u id());
$order->set_customer_user_agent(wc_get_user_agent());
$order->set_customer_ip_address(WC_Geolocation::get_ip_address());
$order->set_currency(获取_商业_currency());
$order->set_prices_include_tax('yes'==get_选项('woocommerce_prices_include_tax'));
//客户数据(使用CRUD设置器)
$order->set_billing_phone($_POST['phone']);
$order->set_billing_email($_POST['email']);
$order->set_shipping_address_1('Tại:“.$”邮政['dia_chi']);
$order->set_shipping_last_name('Tên:'。$_POST['ho_ten']);
$order->set_customer_note($_POST['ghi_chu']);
如果(isset($\u POST['product\u id'])和&$\u POST['product\u id'])){
$product\U id=($\U POST['variation\U id'])?$\U POST['variation\U id']:$\U POST['product\U id'];
//获取带有id的产品,下一步是数量
$order->add_product(wc_get_product($product_id),$\u POST['quantity']);//购物车;
$selected_shipping_methods=WC()->session->get('selected_shipping_methods');
$shipping_packages=WC()->shipping->get_packages();
$cart\u hash=md5(json\u编码(wc\u clean($cart->get\u cart\u for\u session())。$cart->total);
$order->set\u cart\u hash($cart\u hash);
$order->set_total($cart->total);
$order->set_shipping_total($cart->shipping_total);
$order->设置折扣总额($cart->获取折扣总额();
$order->设置折扣税($cart->获取折扣税总额();
$order->set\u cart\u tax($cart->tax\u total);
$order->set_shipping_tax($cart->shipping_tax_total);
WC()->结帐->创建订单商品($order,$cart);
WC()->签出->创建订单发货行($order、$selected、$shipping\u methods、$shipping\u packages);
WC()->checkout->创建订单和税单行($order,$cart);
WC()->结帐->创建订单优惠券行($order$