首页 >CMS教程 >WordPress >WooCommerce行动和过滤操作购物车

WooCommerce行动和过滤操作购物车

William Shakespeare
William Shakespeare原创
2025-02-18 10:18:09346浏览

WooCommerce行动和过滤操作购物车

欢迎参与有关掌握WooCommerce行动和过滤器系列的第二篇文章。在上一篇文章中,即使是非常基本的,我们也介绍了处理客户的账单和运输地址,以及客户通过WooCommerce注册时会发生什么,并将其发送到第三方网站,例如Salesforce。

>在第二篇文章中,我们将在使用WooCommerce创建电子商务网站时以一些巧妙的方式来操纵购物车。

钥匙要点

>本文提供了有关如何使用操作和过滤器来操纵WooCommerce购物车的详细说明,包括以编程方式添加和删除产品,清空购物车以及建立激励产品系统。
    >以编程方式将产品添加到购物车中,只需要一行代码,但是在每个页面上执行的操作中不运行此产品,例如Template_redirect Action。
  • >通过编程从购物车中删除产品比添加一个产品更为复杂。该代码通过购物车中的每种产品提供了周期,并删除了指定的产品。
  • >本文演示了如何使用WooCommerce_Proceed_to_checkout Action创建一个按编程清空的按钮。
  • >本文提供了建立激励产品系统的现实情况,其中将产品提供给满足特定要求的客户,例如,订单的最低总额或特定类别的产品的最低总额。
  • 在编程上添加产品
  • >在编程中将产品添加到购物车中,只需采用一行代码。您要做的唯一头脑风暴是决定何时或为什么要这样做。当我们在现实世界中工作时,我们将在本文的第三部分中讨论更多。
  • >
  • 在购物车中添加产品所需的全部是以下内容:
>

>注意事项,请确保您不会在每个页面上运行的操作上运行此操作,例如Template_redirect操作,或者您将其中一种将这些产品添加到购物车中,每个页面负载或重新加载。尽可能避免这样做:

<span><span><?php
</span></span><span><span>// Takes the Product ID and the Quantity
</span></span><span><span>WC()->cart->add_to_cart( 73, 1 );</span></span>

>从编程中删除产品

>我已经看到这个问题在各种论坛和网站中被问到了无数次,答案很少。希望这将帮助您下次要从购物车中删除产品时,唯一要做的集思广益是何时或为什么要从购物车中删除产品。以下代码将阻止任何人从您的商店中检查产品。我不知道为什么您想做这样的事情,但它将演示从购物车中删除产品的步骤,而该产品并不像我们在购物车中添加产品时那样简单。

>
<span><span><?php
</span></span><span><span>// template_redirect runs once for every page so you'll be
</span></span><span><span>// increasing the quantity by one on every page load
</span></span><span><span>add_action( 'template_redirect', 'add_random_product' );
</span></span><span><span>function add_random_product() {
</span></span><span>    <span>WC()->cart->add_to_cart( 73, 1 );
</span></span><span><span>}</span></span>

>编程

清空购物车

>更好地说明如何以编程方式清空购物车,让我们在购物车中添加一个按钮,这将允许客户单击并清除他们的购物车。

WooCommerce行动和过滤操作购物车

>让我们使用woocommerce_proceed_to_checkout操作回声我们自己的“提交”按钮,该按钮将为当前客户清除购物车。

<span><span><?php
</span></span><span><span>add_action( 'template_redirect', 'remove_product_from_cart' );
</span></span><span><span>function remove_product_from_cart() {
</span></span><span>    <span>// Run only in the Cart or Checkout Page
</span></span><span>    <span>if( is_cart() || is_checkout() ) {
</span></span><span>        <span>// Set the product ID to remove
</span></span><span>        <span>$prod_to_remove = 56;
</span></span><span>
</span><span>        <span>// Cycle through each product in the cart
</span></span><span>        <span>foreach( WC()->cart->cart_contents as $prod_in_cart ) {
</span></span><span>            <span>// Get the Variation or Product ID
</span></span><span>            <span>$prod_id = ( isset( $prod_in_cart['variation_id'] ) && $prod_in_cart['variation_id'] != 0 ) ? $prod_in_cart['variation_id'] : $prod_in_cart['product_id'];
</span></span><span>
</span><span>            <span>// Check to see if IDs match
</span></span><span>            <span>if( $prod_to_remove == $prod_id ) {
</span></span><span>                <span>// Get it's unique ID within the Cart
</span></span><span>                <span>$prod_unique_id = WC()->cart->generate_cart_id( $prod_id );
</span></span><span>                <span>// Remove it from the cart by un-setting it
</span></span><span>                <span>unset( WC()->cart->cart_contents[$prod_unique_id] );
</span></span><span>            <span>}
</span></span><span>        <span>}
</span></span><span>
</span><span>    <span>}
</span></span><span><span>}</span></span>
>下一步是收听要单击的按钮,以便单击时,我们清除购物车。为此,我们将挂接template_redirect动作。

>

<span><span><?php
</span></span><span><span>add_action( 'woocommerce_proceed_to_checkout', 'insert_empty_cart_button' );
</span></span><span><span>function insert_empty_cart_button() {
</span></span><span>    <span>// Echo our Empty Cart button
</span></span><span>    <span>echo '<input type="submit"  name="empty_cart" value="Empty Cart" />';
</span></span><span><span>}</span></span>
>您现在会注意到,按下按钮后,将显示Cart-empty.php而不是常规模板。

>现在我们已经建立了如何从购物车中添加或删除产品,甚至完全清空购物车,让我们继续构建现实世界中的情况,知道这种东西会产生很大的不同。 WooCommerce行动和过滤操作购物车激励产品

在现实世界的情况下,我们将通过构建一个系统来使所有这些产品都可以赠送产品作为激励所有客户,从而使所有这些工作都起作用。好吧,不完全是您所有的客户,只是那些根据特定要求资格的人。

>

问题

我们需要能够将您选择的产品作为激励您的客户。>

解决方案

>构建一个系统,该系统将允许您根据以下内容赠送激励产品:>

在购物车中具有特定产品

>

    您的订单最低总金额
  • >

    >
  • 在您的购物车中具有最小重量
  • >来自特定类别
  • 因为我们将以正确的方式构建它,不仅您能够将产品赠送给有资格符合这些标准之一的产品,而且您还可以将它们混合在一起并真正缩小谁得到了产品,谁没有。

    >您不仅可以通过符合这些条件之一的资格为客户提供激励产品,而且还可以将它们组合起来。例如,例如,您可以测试其购物车至少100美元的人,而“服装”类别中的产品都可以测试。

    >

    >让我们快速看一下我们将在一分钟内写的功能以及在问题/解决方案方案中所做的工作。

    >
    • >

      get_id_from_product($ product,$ check_variations = true) - 获取产品ID并将其返回。考虑变化ID,因此我们在检查实际产品ID之前检查这些ID。

    • >资格:basedon_specific_product($ product_required) - 检查客户是否通过将指定的产品ID作为购物车中的一项。
    • >

      >资格:$ basedon_weight($ weight_required) - 检查客户是否通过在购物车中具有最小的重量来符合激励措施。

      >
    • >
    • >资格:basedon_cart_total($ total_required) - 检查客户是否通过计算税收之前的最低总金额来符合激励措施。

      >
    • >资格符合_basedon_product_category($类别) - 检查客户是否通过从购物车中的某个类别中获得某个类别的产品来符合奖励。
    • > add_incentive_to_cart($ product_id) - 如果客户有资格

      ,则将激励产品添加到购物车中

      >
    • > emove_incentive_from_cart($ product_id) - 如果客户未能获得产品资格,则将激励产品删除到购物车中。
    • >
    • >资格_for_incentive() - 这是魔术发生的地方,因为它将具有需要匹配的规则才能使客户有资格获得激励措施。此功能将处理我们激励程序的逻辑。
    • 如您所见,这些功能返回“ true”或“ false”,因此它将使我们非常容易将其混合并创建一个非常灵活的激励程序。现在剩下要做的就是提出您要设定的规则,让客户有资格获得激励产品,并编写将与WooCommerce_Check_Cart_Items wooCommerce Action绑定的符合奖励_FOR_INCENTIVE()函数。

      >
    • 下面的
    • 是一些示例,说明如何使用这些功能创建真正唯一的东西。

      >

      只有一个要求
    以下几个示例仅设置一个要求。
    <span><span><?php
    </span></span><span><span>// Takes the Product ID and the Quantity
    </span></span><span><span>WC()->cart->add_to_cart( 73, 1 );</span></span>
    >购物车中存在的特定产品
    <span><span><?php
    </span></span><span><span>// Takes the Product ID and the Quantity
    </span></span><span><span>WC()->cart->add_to_cart( 73, 1 );</span></span>
    购物车中所有产品的最小重量
    >
    <span><span><?php
    </span></span><span><span>// template_redirect runs once for every page so you'll be
    </span></span><span><span>// increasing the quantity by one on every page load
    </span></span><span><span>add_action( 'template_redirect', 'add_random_product' );
    </span></span><span><span>function add_random_product() {
    </span></span><span>    <span>WC()->cart->add_to_cart( 73, 1 );
    </span></span><span><span>}</span></span>
    购物车总数排除税款
    来自购物车中的类别的
    <span><span><?php
    </span></span><span><span>add_action( 'template_redirect', 'remove_product_from_cart' );
    </span></span><span><span>function remove_product_from_cart() {
    </span></span><span>    <span>// Run only in the Cart or Checkout Page
    </span></span><span>    <span>if( is_cart() || is_checkout() ) {
    </span></span><span>        <span>// Set the product ID to remove
    </span></span><span>        <span>$prod_to_remove = 56;
    </span></span><span>
    </span><span>        <span>// Cycle through each product in the cart
    </span></span><span>        <span>foreach( WC()->cart->cart_contents as $prod_in_cart ) {
    </span></span><span>            <span>// Get the Variation or Product ID
    </span></span><span>            <span>$prod_id = ( isset( $prod_in_cart['variation_id'] ) && $prod_in_cart['variation_id'] != 0 ) ? $prod_in_cart['variation_id'] : $prod_in_cart['product_id'];
    </span></span><span>
    </span><span>            <span>// Check to see if IDs match
    </span></span><span>            <span>if( $prod_to_remove == $prod_id ) {
    </span></span><span>                <span>// Get it's unique ID within the Cart
    </span></span><span>                <span>$prod_unique_id = WC()->cart->generate_cart_id( $prod_id );
    </span></span><span>                <span>// Remove it from the cart by un-setting it
    </span></span><span>                <span>unset( WC()->cart->cart_contents[$prod_unique_id] );
    </span></span><span>            <span>}
    </span></span><span>        <span>}
    </span></span><span>
    </span><span>    <span>}
    </span></span><span><span>}</span></span>
    >
    将其混合
    <span><span><?php
    </span></span><span><span>add_action( 'woocommerce_proceed_to_checkout', 'insert_empty_cart_button' );
    </span></span><span><span>function insert_empty_cart_button() {
    </span></span><span>    <span>// Echo our Empty Cart button
    </span></span><span>    <span>echo '<input type="submit"  name="empty_cart" value="Empty Cart" />';
    </span></span><span><span>}</span></span>

    >由于我们有一个非常灵活的代码库,因此您可以将其混合并真正使您的激励计划与众不同。以下是更多示例,显示了必要的添加更多条件的容易。

    >

    >来自购物车或最低购物车的类别的产品

    类别和最低购物车的产品
    >
    <span><span><?php
    </span></span><span><span>// Let's wait for the button to be clicked on
    </span></span><span><span>add_action( 'template_redirect', 'empty_cart_button_handler' );
    </span></span><span><span>function empty_cart_button_handler() {
    </span></span><span>    <span>if( isset( $_POST['empty_cart'] ) && $_SERVER['REQUEST_METHOD'] == "POST" ) {
    </span></span><span>        <span>WC()->cart->empty_cart( true );
    </span></span><span>    <span>}
    </span></span><span><span>}</span></span>
    >您甚至可以比这更先进,并创建更复杂的方案。下一步的步骤是将其转变为“班级”,以便您可以拥有多个激励计划,每个计划都有自己的独特资格规则集。
    >
    <span><span><?php
    </span></span><span><span>/**
    </span></span><span><span> * Will extract the Variation ID if available otherwise it will get the Product ID
    </span></span><span><span> * <span>@param $product Product
    </span></span></span><span><span> * <span>@param <span>bool</span> $check_variations Whether or not to check for variation IDs
    </span></span></span><span><span> * <span>@return <span>mixed</span>
    </span></span></span><span><span> */
    </span></span><span><span>function get_id_from_product( $product, $check_variations = true ) {
    </span></span><span>    <span>// Are we taking variations into account?
    </span></span><span>    <span>if( $check_variations ) {
    </span></span><span>        <span>// Ternary Operator
    </span></span><span>        <span>// http://php.net/manual/en/language.operators.comparison.php
    </span></span><span>        <span>return ( isset( $product['variation_id'] )
    </span></span><span>            <span>&& ! empty( $product['variation_id'])
    </span></span><span>            <span>&& $product['variation_id'] != 0 )
    </span></span><span>            <span>? $product['variation_id']
    </span></span><span>            <span>: $product['product_id'];
    </span></span><span>    <span>} else {
    </span></span><span>        <span>// No variations, just need the product IDs
    </span></span><span>        <span>return $product['product_id'];
    </span></span><span>    <span>}
    </span></span><span><span>}
    </span></span><span>
    </span><span><span>/**
    </span></span><span><span> * Checks the existence of a specific product in the cart
    </span></span><span><span> * <span>@param $product_required The Product ID required to be in the cart
    </span></span></span><span><span> * <span>@return <span>bool</span>
    </span></span></span><span><span> */
    </span></span><span><span>function qualifies_basedon_specific_product( $product_required ) {
    </span></span><span>    <span>/*
    </span></span><span><span>     * We only want to run this on the cart or checkout page
    </span></span><span><span>     */
    </span></span><span>    <span>if( is_cart() || is_checkout () ) {
    </span></span><span>        <span>foreach( WC()->cart->cart_contents as $key => $product_in_cart ) {
    </span></span><span>            <span>if( $product_required == get_id_from_product( $product_in_cart ) ) {
    </span></span><span>                <span>return true;
    </span></span><span>            <span>}
    </span></span><span>        <span>}
    </span></span><span>        <span>// Return false in case anything fails
    </span></span><span>        <span>return false;
    </span></span><span>    <span>}
    </span></span><span><span>}
    </span></span><span>
    </span><span><span>/**
    </span></span><span><span> * Checks the cart for the weight required to qualify for the incentive
    </span></span><span><span> * <span>@param $weight_required Weight Required
    </span></span></span><span><span> * <span>@return <span>bool</span>
    </span></span></span><span><span> */
    </span></span><span><span>function qualifies_basedon_weight( $weight_required ) {
    </span></span><span>
    </span><span>    <span>/*
    </span></span><span><span>     * We only want to run this on the cart or checkout page
    </span></span><span><span>     */
    </span></span><span>    <span>if( is_cart() || is_checkout () ) {
    </span></span><span>        <span>if( $weight_required >= WC()->cart->cart_contents_weight ) {
    </span></span><span>            <span>return true;
    </span></span><span>        <span>}
    </span></span><span>    <span>}
    </span></span><span>    <span>// Return false in case anything fails
    </span></span><span>    <span>return false;
    </span></span><span><span>}
    </span></span><span>
    </span><span><span>/**
    </span></span><span><span> * Checks the cart for the Total excluding taxes
    </span></span><span><span> * <span>@param $total_required
    </span></span></span><span><span> * <span>@return <span>bool</span>
    </span></span></span><span><span> */
    </span></span><span><span>function qualifies_basedon_cart_total( $total_required ) {
    </span></span><span>    <span>/*
    </span></span><span><span>     * We only want to run this on the cart or checkout page
    </span></span><span><span>     */
    </span></span><span>    <span>if( is_cart() || is_checkout () ) {
    </span></span><span>        <span>if( WC()->cart->subtotal_ex_tax >= $total_required ) {
    </span></span><span>            <span>return true;
    </span></span><span>        <span>}
    </span></span><span>    <span>}
    </span></span><span>    <span>// Return false in case anything fails
    </span></span><span>    <span>return false;
    </span></span><span><span>}
    </span></span><span>
    </span><span><span>/**
    </span></span><span><span> * Checks the cart to verify whether or not a product from a Category is in the cart
    </span></span><span><span> * <span>@param $category Accepts the Product Category Name, ID, Slug or array of them
    </span></span></span><span><span> * <span>@return <span>bool</span>
    </span></span></span><span><span> */
    </span></span><span><span>function qualifies_basedon_product_category( $category ) {
    </span></span><span>    <span>foreach( WC()->cart->cart_contents as $key => $product_in_cart ) {
    </span></span><span>        <span>if( has_term( $category, 'product_cat', get_id_from_product( $product_in_cart, false ) ) ) {
    </span></span><span>            <span>return true;
    </span></span><span>        <span>}
    </span></span><span>    <span>}
    </span></span><span>    <span>// Return false in case anything fails
    </span></span><span>    <span>return false;
    </span></span><span><span>}
    </span></span><span>
    </span><span><span>/**
    </span></span><span><span> * Adds a specific product to the cart
    </span></span><span><span> * <span>@param $product_id Product to be added to the cart
    </span></span></span><span><span> */
    </span></span><span><span>function add_incentive_to_cart( $product_id ) {
    </span></span><span>    <span>// Check the cart for this product
    </span></span><span>    <span>$cart_id = WC()->cart->generate_cart_id( $product_id );
    </span></span><span>    <span>$prod_in_cart = WC()->cart->find_product_in_cart( $cart_id );
    </span></span><span>    <span>// Add the product only if it's not in the cart already
    </span></span><span>    <span>if( ! $prod_in_cart ) {
    </span></span><span>        <span>WC()->cart->add_to_cart( $product_id );
    </span></span><span>    <span>}
    </span></span><span><span>}
    </span></span><span>
    </span><span><span>/**
    </span></span><span><span> * Removes a specific product from the cart
    </span></span><span><span> * <span>@param $product_id Product ID to be removed from the cart
    </span></span></span><span><span> */
    </span></span><span><span>function remove_incentive_from_cart( $product_id ) {
    </span></span><span>     <span>$prod_unique_id = WC()->cart->generate_cart_id( $product_id );
    </span></span><span>    <span>// Remove it from the cart by un-setting it
    </span></span><span>    <span>unset( WC()->cart->cart_contents[$prod_unique_id] );
    </span></span><span><span>}</span></span>
    就是本文。在本系列的第三部分中,我们将使用在新产品/编辑产品屏幕上运行的操作和过滤器。然后,我们将探索如何使用API​​来添加自定义字段。

    >关于WooCommerce行动和过滤器的常见问题(常见问题解答)

    > woocommerce操作和过滤器之间有什么区别?

    >动作和过滤器是WooCommerce中的两种类型的挂钩。操作允许您添加或更改功能,例如将新部分添加到您的网站或修改结帐过程。另一方面,过滤器允许您在WooCommerce中修改数据。例如,您可以使用过滤器更改产品的价格或修改按钮的文本。

    >

    如何在WooCommerce Cart中添加自定义字段?自定义字段到WooCommerce购物车,您可以使用'woocommerce_cart_item_data'过滤器。该过滤器允许您将自定义数据添加到购物车项目。然后,您可以使用'woocommerce_get_item_data'过滤器在购物车中显示此自定义数据。

    >如何修改WooCommerce结帐过程?

    >

    >和过滤器。例如,您可以使用'woocommerce_checkout_fields'过滤器修改结帐字段或'woocommerce_checkout_process'操作将自定义验证添加到结帐过程中。

    >我可以使用钩子修改WooCommerce Emails吗?

    是的,WooCommerce提供了几个挂钩,可让您修改WooCommerce发送的电子邮件。例如,您可以使用“ woocommerce_email_header”和“ woocommerce_email_footer”操作来修改电子邮件的标题和页脚,或“ woocommerce_email_email_order_details”的操作来修改电子邮件中的订单详细信息。

    如何更改WooCommerce中的按钮的文本?

    更改WooCommerce中按钮的文本,您可以使用'woocommerce_order_order_button_text'过滤器。该过滤器允许您修改结帐页面上的“订单”按钮的文本。

    如何将自定义消息添加到woocommerce购物车页面?

    您可以将自定义消息添加到使用“ WooCommerce_before_cart”操作的WooCommerce购物车页面。此操作使您可以在购物车内容之前添加自定义内容。

    >我可以使用钩子修改WooCommerce产品页面吗?>要修改WooCommerce中的订单详细信息,您可以使用'woocommerce_order_details_after_oder_order_table'action'操作。此操作允许您在订单详细信息页面上的订单表之后添加自定义内容。

    我可以使用钩子将自定义字段添加到WooCommerce Checkout页面吗? 'WooCommerce_Checkout_fields'过滤器将自定义字段添加到WooCommerce的结帐页面。该过滤器允许您修改结帐字段,包括添加新字段。

    >我如何使用挂钩?

    >

    如何更改产品中的产品价格以更改WooCommerce中产品的价格,您可以使用'woocommerce_get_price_html'过滤器。该过滤器允许您修改价格HTML,其中包括产品的价格。

以上是WooCommerce行动和过滤操作购物车的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn