禁用WC预订自动完成订单

时间:2019-12-13 作者:Yuri

WooCommerce Bookings具有此功能,一旦确认付款,即可自动将订单状态从处理更改为完成。

我正试图找到一种方法来禁用它,这样它就可以像通常在标准WooCommerce上一样工作。

搜索插件的代码时,我找到了以下过滤器:

class WC_Booking_Order_Manager {
  public function __construct() {
    add_filter( \'woocommerce_payment_complete_order_status\', array( $this, \'complete_order\' ), 20, 2 );
  }
}
我确信我只需要删除这个过滤器,但我不知道该怎么做,因为我不知道哪个变量保存这个类的实例。

我还找到了实例化此类的位置:

class WC_Bookings {
  private function init() {
    new WC_Booking_Order_Manager();
  }
}
是否有保存该类实例的变量?我如何访问它?是否有其他方法删除此过滤器?

1 个回复
最合适的回答,由SO网友:Yuri 整理而成

我一直在做一些研究,WC Bookings团队在实例化一个类时没有将其分配给变量,这似乎是一种不好的做法。

但在这种情况下,知道这一点对我没有帮助。

幸运的是,我能够找到this comment 来自@MikeSchinkel,他在那里教授并演示了如何删除匿名对象过滤器的函数。

这就是我在我的案例中实现它的方式。首先,Mike评论中的原始功能:

if ( ! function_exists( \'remove_anonymous_object_filter\' ) ) {
  /**
   * Remove an anonymous object filter.
   *
   * @param string $tag Hook name.
   * @param string $class Class name
   * @param string $method Method name
   *
   * @return void
   *
   */
  function remove_anonymous_object_filter( $tag, $class, $method ) {
    $filters = false;

    if ( isset( $GLOBALS[\'wp_filter\'][$tag] ) )
      $filters = $GLOBALS[\'wp_filter\'][$tag];

    if ( $filters )
      foreach ( $filters as $priority => $filter ) {
        foreach ( $filter as $identifier => $function ) {
          if ( ! is_array( $function ) )
            continue;
          if ( ! $function[\'function\'][0] instanceof $class )
            continue;
          if ( $method == $function[\'function\'][1] ) {
            remove_filter( $tag, array( $function[\'function\'][0], $method ), $priority );
          }
        }
      }
  }
}
最后,调用移除过滤器:

add_filter( \'woocommerce_payment_complete_order_status\', \'unhook_booking_complete_order\', 0 );
function unhook_booking_complete_order($status) {
  remove_anonymous_object_filter( \'woocommerce_payment_complete_order_status\', \'WC_Booking_Order_Manager\', \'complete_order\' );
  return $status;
}
基本上,我们正在过滤woocommerce_payment_complete_order_status 再次以更高的优先级手动移除过滤器(使用remove_anonymous_object_filter 函数)基于其挂钩、类名和方法。

所有这些都归功于Mike和启发他的代码的原始答案。