Woocommerce - 允许再次订购不同的状态

时间:2017-02-08 15:14:00

标签: php wordpress woocommerce

我希望Order Again功能允许所有状态。默认情况下,WooCommerce仅允许状态为COMPLETED的订单具有此功能。这似乎是一个两步过程,因为第一步需要向用户显示按钮,这是通过编辑此文件来完成的:

wc-template-functions.php

有了这段代码:

function woocommerce_order_again_button( $order ) {
        //if ( ! $order || ! $order->has_status( 'completed' ) || ! is_user_logged_in() ) {
        // Allow 'Order Again' at all times.
        if ( ! $order || ! is_user_logged_in() ) {
            return;
        }

        wc_get_template( 'order/order-again.php', array(
            'order' => $order
        ) );
    }

通过评论$order->has_status()方法的验证,我可以在页面上显示按钮。但是,在尝试单击“再次订购”按钮时,它仍然会在将项目添加到购物车之前进行检查。

有人可以告诉我存储此代码的位置,以便对$order->has_status()进行初步检查吗?

3 个答案:

答案 0 :(得分:0)

对于那些有相同问题的人来说,这个插件能够实现我想要的目标:

https://wordpress.org/plugins/one-click-order-reorder/installation/

答案 1 :(得分:0)

自OP的原始问题以来,WooCommerce已为这些状态添加了过滤器。该函数可以在includes / wc-template-functions.php

中找到

https://docs.woocommerce.com/wp-content/images/wc-apidocs/function-woocommerce_order_again_button.html

/**
 * Display an 'order again' button on the view order page.
 *
 * @param object $order
 * @subpackage  Orders
 */
function woocommerce_order_again_button( $order ) {
    if ( ! $order || ! $order->has_status( apply_filters( 'woocommerce_valid_order_statuses_for_order_again', array( 'completed' ) ) ) || ! is_user_logged_in() ) {
        return;
    }

    wc_get_template( 'order/order-again.php', array(
        'order' => $order,
    ) );
}

因此,为了过滤状态,您可以执行以下操作(wc_get_order_statuses()只返回此情况下的所有订单状态;您可以将$ statuses变量设置为您想要的状态数组:

add_filter('woocommerce_valid_order_statuses_for_order_again', function( $statuses ){

    $statuses = wc_get_order_statuses();

    return $statuses;

}, 10, 2);

答案 2 :(得分:0)

您只需添加差异订单状态即可过滤woocommerce_valid_order_statuses_for_order_again

add_filter( 'woocommerce_valid_order_statuses_for_order_again', 'add_order_again_status', 10, 1);

function add_order_again_status($array){
    $array = array_merge($array, array('on-hold', 'processing', 'pending-payment', 'cancelled', 'refunded'));
    return $array;
}