在循环之外获取当前变体 id 并将其用于服务器端功能。 WooCommerce / jQuery

Posted

技术标签:

【中文标题】在循环之外获取当前变体 id 并将其用于服务器端功能。 WooCommerce / jQuery【英文标题】:Get current variation id outside of the loop and use it on server side function. WooCommerce / jQuery 【发布时间】:2019-11-27 23:24:32 【问题描述】:

场景

添加到购物车事件中未使用 WP Ajax,因此,单 一旦用户将某些东西添加到购物车,产品页面就会完全重新加载,这不是我的安装,所以我 无法随意更改 WooCommerce 设置。 用户添加后会显示特定消息 购物车,作为单个产品的 WooCommerce 通知 布局。 此消息如果产品允许延期交货,则不得更改如果是“In Stock”则必须更改,必须添加单个字符串。 商店的产品简单而多变,因此该功能必须在任何情况下都能正常工作。

我必须提及我为实现这一目标所做的工作,并提供一些有关功能的背景知识。

第一种方法

通过'wc_add_to_cart_message_html'直接添加了一条自定义消息。 这是由于先前请求自定义上述消息而无需进一步要求而实现的。


第二种方法(当前,因为它仍在开发中)

如果发现产品不允许延期交货,则前面提到的消息会发生变化,通过 jQuery 在 'woocommerce_single_product_summary' 处进行更改。

创建一个产品对象,并通过以下方法询问产品是否允许延期交货:

    $product->backorders_allowed()

如果不是也有可变产品,那会很好。

我的意思是,尽管可以将可变产品配置为允许延期交货,我的意思是,所有可能变体的父产品,库存管理现在依赖于变体,每个变体都有自己的 “In Stock” 库存状态设置,其中之一可能具有“On backorder” 库存状态设置。


第三种方法(假设)

为了获取当前的变体 ID,我可以在 DOM 上获取它:

    $('input.variation_id').val();

为什么?,因为我想使用该值来调用 WooCommerce 产品变体构造函数并再次检查,但现在在变体级别检查产品是否能够在延期交货时订购,如下所示:

    $p_variation = new WC_Product_Variation( $var_id );
    $p_variation->backorders_allowed()

但是我有一个问题,我不知道如何获取这个 DOM 值(刚刚添加到购物车的当前变体)并将其发送到包含最新提到的构造函数和方法的函数。

在其他情况下,我可以通过 WP Ajax 调用已定义的函数作为操作,将 DOM 数据发送到服务器(由 php 处理),以及操作成功时要考虑的数据和指令在 DOM 上的变体选择 html 对象的更改事件上执行,但随着整个页面的重新加载,我发现自己迷路了。

因为通过选择更改调用某些内容与提交添加到购物车表单时完全不同。

我根本不知道是否可以调用 backorders_allowed 方法,我假设产品变体与父产品具有相同的属性。

我现在缺乏想法,如果有人可以帮助我,我将不胜感激。

【问题讨论】:

只是为了确认:如果我有一个名为tshirt 的可变产品,并且我将tshirt - red 添加到我的购物车,则需要将一个字符串添加到显示的“已添加到购物车”字符串中在顶部的 woocommerce 消息区域中仅当红色 T 恤变体允许延期交货时 相反,只有红色T恤为“有货”时才需要添加消息。如果红色 T 恤允许延期交货,则在将商品添加到购物车后,不应将任何内容添加到 WooCommerce 通知区域。 【参考方案1】:

解决方案

将以下内容添加到您正在使用的子主题、主题或自定义插件的functions.php 中以实现此功能。

第一个函数

<?php
/* Server side function that is invoked via ajax */
function get_variation_id_added_to_cart()
   $variation_id = $_POST['id']; 
   /* When the server receives the post data it should receive this value in order to work. */
   $stockstatus = get_post_meta( $variation_id, '_stock_status', true );
   /* Retrieving stock status per ID, if the id belongs to a product
      it will show a product stock status, if the id belongs to a variation
      it will show a variation stock status. */
   if ($stockstatus != 'instock') 
      $aditional_copy = ''; // If the item is not in stock the custom message would be blank.
   else
      /* On the contrary, if the item is in stock it will show the following custom message */
      $aditional_copy = ' <strong>Add another item and receive it in 3 working days.</strong>' ;
   
   /* Now, let's create a response array */
   $response= array(
      'message'   => $aditional_copy,
   );
   /* Is like a sort of return but as a JSON encoded content */
   wp_send_json_success($response);

/* Code that allows to invoke the server side function. */
add_action( 'wp_ajax_variation_id_added_to_cart', 'get_variation_id_added_to_cart');
/* Code that allows to invoke the server side function in a non private way. */
add_action( 'wp_ajax_nopriv_variation_id_added_to_cart', 'get_variation_id_added_to_cart');

第二个功能


/* Attach the custom function that makes the js magic to the wp_footer function. */
add_action('wp_footer','after_add_to_cart');
/* The function that sends the variation id to the server side to make a process from it. */
function after_add_to_cart()
    /* Assure that this will only work if a single product template is present */
    if ( is_product() )
        /* Create a product object, when you are at a single product if you don't tell anything else it takes as parameter the current product id */
        global $product;
        /* Now we know that this is the current product and will check if it is a variable one */
        if ($product->is_type('variable')) 
            /* If it is a variable product let's put a round zero on the var aux for the product id */
            $p_id = 0;
        else
            /* If it is not a variable product let's put the current product id in here */
            $p_id = $product->get_id();
        
        /* Let's close the php tags and try a little js. */
        ?>
            <!-- The javascript that is responsible of sending
                 the variation id from the client side to the server side -->
            <script type="text/javascript">
                 /* I like to start with a semicolon my jQuery functions, it works
                    miracles when you have extremely complex environments with lots of
                    different js libraries, it cuts everything. */
                ;(function($)
                    /* Your document is ready so it begins */
                    $(document).ready(function() 
                        /* Let's equal the variation id on the client side
                           to zero */
                        var variation_id = 0;
                        /* Let's put a timeout, because client side WooCommerce
                           always has a bit of delay */
                        setTimeout(function() 
                            /* Now, let's get the current product variation id,
                               the real one */
                            var variation_id = $('input.variation_id').val();
                            /* Protect your WP Ajax URL at all costs,
                               the following will work but is not recommended.
                               Also this thing is the one that make it possible
                               to send and retrieve data from the server side */
                            var ajaxurl = "<?php echo admin_url('admin-ajax.php'); ?>";
                            /* Now the parameters, the name of the action that we
                               declared way back and the id that we are going to pass
                               but with a twist. Not always we are going to pass a
                               variation id, sometimes we are going to pass
                               a product id. */
                            var parameters = 
                                action: 'variation_id_added_to_cart',
                                <?php
                                if ($p_id > 0) 
                                /* if the product id aux is more than zero that means 
                                   that our product is a simple product (that has no
                                   variations). */
                                    ?>
                                    id: <?php echo $p_id; ?>
                                    <?php
                                else
                                /* if the product id aux is equal to zero that means 
                                   that our product is a variable product and we 
                                   should check the current variation id, to send it
                                   to the server side function. */
                                    ?>
                                    id: variation_id
                                    <?php
                                
                                ?>
                            ;
                            /* Now it begins, we determine the parameters that are 
                               going to be used in the execution, and what to do if 
                               the execution is successful */
                            $.ajax(
                                url: ajaxurl,
                                type: 'POST',
                                data: parameters,
                                success: function (data)  var initial_output = JSON.parse(data); var final_output = initial_output.data.message;  $('div.woocommerce-message').append(final_output); ,
                                dataType: 'html'
                            );
                            /* A */
                            console.log('inside timeout: '+variation_id);
                        ,1000);
                        /* B */
                        console.log('outside timeout: '+variation_id);
                    );
                )(jQuery);
            </script>
        <?php
    

?>

您可以检查 B 中的值是否始终为零,因为该代码在文档准备好后立即运行,并且在 A 中(如果它是可变产品)始终是产品变体 ID,因为该代码会延迟一秒运行。

【讨论】:

以上是关于在循环之外获取当前变体 id 并将其用于服务器端功能。 WooCommerce / jQuery的主要内容,如果未能解决你的问题,请参考以下文章

iphone app - 如何只获取一次当前位置并将其存储以用于另一个功能?

从电脑获取当前时间并将其保存在数据库中

如何编写用于迭代 DataFrame 的 for 循环并将其子集化以仅包含在每次迭代中检索到的那些列?

CloudKit 用于我的 iOS 游戏

如何获取模型中图像变体的 url(在控制器/视图之外)?主动存储

从服务器获取当前日期时间并将其转换为 c# 中的本地时间