覆盖核心WooCommerce类

时间:2015-12-09 作者:Rahil Wazir

我必须重写以下WooCommerce核心类方法:

我想做的是,WooCommerce不允许在购物车中放置非销售产品和销售产品,然后应用优惠券代码。在优惠券上选中以下选项时Usage restriction 选项卡

如果优惠券不适用于正在出售的商品,请勾选此框。每件商品的优惠券只有在商品不打折的情况下才有效仅当购物车中没有销售商品时,每辆购物车优惠券才起作用。

我必须使优惠券仅适用于非销售产品,即使购物车中有任何销售产品。优惠券只会影响非销售产品金额,而忽略销售产品金额。

现在我找到了解决方法,我必须用我自己的自定义实现覆盖上面的方法。正如你所见,两者都没有挂钩可供使用。

我也尝试了这个解决方案,但没有任何运气

1 个回复
SO网友:Douglas.Sesar

1) 第一个有一个钩子:

您可以使用apply_filters

其代码:

apply_filters( \'woocommerce_get_discounted_price\', $price, $values, $this );
您的代码:

add_filter( \'woocommerce_get_discounted_price\', function($price, $values, $this)
{
     //return whatever you want
},10,3
);
//*PHP 5.3 and up
您可以将任何想要的函数传递到add\\u filter函数的第二个参数中。详细信息请查看法典。

https://codex.wordpress.org/Function_Reference/add_filter

2) 第二个将非常粗糙,可能不推荐:

虽然上面没有钩子validate_cart_excluded_sale_items() 函数,则结果取决于您可以覆盖的瞬时值(如果您在完成时小心地将其放回)。

您可以调整此函数的结果:wc_get_product_ids_on_sale()

其代码:

// Load from cache
    $product_ids_on_sale = get_transient( \'wc_products_onsale\' );
...
set_transient( \'wc_products_onsale\', $product_ids_on_sale, DAY_IN_SECONDS * 30 );
您可以做什么:

存储当前$product_ids_on_saleget_transient 作用

然后将其设置为空数组

set_transient( \'wc_products_onsale\', [], DAY_IN_SECONDS * 30 );
然后在验证通过后将其设置回原位

set_transient( \'wc_products_onsale\', $your_stored_product_ids_on_sale, DAY_IN_SECONDS * 30 );
同样,我不建议这样做,但我想表明这是可能的

听起来你应该得到更好的促销

相关推荐

插件放置在/wp-content/plugins内的文件夹中时不保存值

我得到了WordPRess插件的以下代码,它在每个页面/后期编辑屏幕上添加了两个自定义输入。然后将这些值保存并输出到前端页面的标题中。如果代码位于内部,则可以正常工作。php文件并直接放入“wp内容/插件”。然而,如果我把它放在插件(如“wp-content/plugins/myplugin”)中自己的文件夹中,那么在通过编辑屏幕保存帖子/页面时,输入字段不会保存。此外,它不会向前端页面html标题部分输出任何内容。这似乎是一个被放弃的项目,所以我无法与原始开发人员一起制定解决方案。然而,代码中的某些内容