4

我正在努力实施自己的预订系统,is_preorder为每个产品设置一个自定义字段。

我试图修改 WooCommerce 的Is_Purchasable选项,这样,如果产品具有预购状态并且已经过了预购截止日期,则应该无法购买。我尝试了很多方法,但似乎没有任何效果。

这是我做的事情(粗略的想法)

add_filter('woocommerce_is_purchasable', 'preorder_is_purchasable');

function preorder_is_purchasable() {

    // this is a field added using 'Advance Custom Fields' plugin 
    $is_preorder = get_field('is_preorder'); 

    if($is_preorder && "not yet passed deadline")
        return true;
    else
        return false;
}

我不只是想禁用add_to_cart按钮,我还想禁用功能(如果用户尝试通过在 url 中硬编码添加产品,应该提示错误)。
我该怎么做?

==================================================== ==========================

这是我的最终代码:

add_filter('woocommerce_is_purchasable', 'preorder_is_purchasable', 10, 2);

function preorder_is_purchasable( $is_purchasable, $object ) {

// this is a field added using 'Advance Custom Fields' plugin 
$is_preorder = get_field('is_preorder', $object->id); 

// if product is Pre-Order
if($is_preorder)
{
    $today = date('Ymd');

    // another field added using 'Advance Custom Fields' plugin 
    $preorder_deadline = get_field('preorder_deadline', $object->id); 

    if($today <= $preorder_deadline) // if not yet pass deadline
        return true;
    else
        return false;
}
else
    return $is_purchasable; // normal
4

2 回答 2

11

2019 年更新:请参阅dev_masta 答案以获得正确的解决方案。


不确定它是否能解决问题,因为这必须在您自己的自定义设置上进行测试。但是你用get_field错了:如果它没有在循环中使用,你应该提供帖子 ID

分析过滤器woocommerce_is_purchasable,我们看到它有两个参数,一个布尔值(is_purchasable)和一个对象(WC_Product)。

尝试这个:

add_filter('woocommerce_is_purchasable', 'preorder_is_purchasable', 10, 2);

function preorder_is_purchasable( $is_purchasable, $object ) {

    // this is a field added using 'Advance Custom Fields' plugin 
    $is_preorder = get_field('is_preorder', $object->id); 

    if($is_preorder && $is_purchasable)
        return true;
    else
        return false;
}
于 2013-06-23T11:57:50.403 回答
5

今天接受的答案有点过时了。

而不是使用$object->id你应该使用$object->get_id(),否则你会得到一个关于错误使用的PHP通知。

function disable_purchased_products( $is_purchasable, $object ){

    // custom function to get the array of purchased products ID's
    $already_purchased = get_purchased_products();

    if( in_array( $object->get_id(), $already_purchased ) ){
        return false;
    } else {
        return $is_purchasable;
    }
}
add_filter( 'woocommerce_is_purchasable', 'disable_purchased_products', 10, 2 );

我希望这会对某人有所帮助,我已经在网上看到了这个(过时的)代码..

于 2018-01-09T21:54:47.527 回答