여러 주문 상태별로 WooCommerce 주문을 필터링하는 방법은 무엇입니까?

게시 됨: 2019-02-16

고객 중 한 명이 최근 관리자의 WooCommerce 주문 페이지에 대해 다음과 같은 질문을 했습니다 . 주문 백엔드에서 여러 상태를 선택하는 방법이 있습니까?

WooCommerce 상점 소유자는 정기적으로 이 작업을 수행할 필요가 없지만 일부는 확실히 도움이 될 것입니다.

이 게시물에서는 상태가 다른 WooCommerce 주문을 하나의 보기에 표시하는 방법을 설명합니다. 이 게시물의 후반부에서는 모든 주문이 표시될 때 하나 또는 여러 상태를 제외하는 방법도 확인할 것입니다.

WooCommerce의 기본 동작은 모든 주문 또는 하나의 상태에 대한 주문을 볼 수 있다는 것입니다. 그러나 Pending & Refunded 주문과 같이 다른 상태의 주문을 함께 볼 수는 없습니다. 또는 전체 보기에서 상태의 주문을 제외할 수 없습니다.

WooCommerce Orders in Admin
기본 WooCommerce 주문 페이지 보기

기본 주문 상태 외에 맞춤형 주문 상태를 추가했습니다: 배달됨 . 이것은 Custom Order Status 플러그인을 사용하여 추가되었으며 필터링이 기본 상태와 함께 사용자 지정 주문 상태에서도 작동하는지 확인하기 위해 추가되었습니다.

1부: WooCommerce 주문을 필터링하여 한 보기에 여러 상태의 주문을 표시합니다.

이에 대한 솔루션을 찾는 방법에는 여러 가지가 있습니다. 플러그인을 통하거나 코드 스니펫을 사용하여 주문 상태의 다중 선택 드롭다운을 추가할 수 있습니다. 또는 조잡한 방법으로 URL에 원하는 상태를 추가하기만 하면 됩니다.

그것은 확실히 최선의 방법은 아니지만 작동합니다. 나중에 이 게시물로 돌아와 WooCommerce 주문 상태의 다중 선택 드롭다운을 포함하도록 업데이트할 수 있습니다.

먼저 코드를 살펴보자.

 /**
 * 추가 우커머스 상태를 포함하기 위한 필터 처리
 *
 * @param array $query_vars 쿼리 변수.
 * @return 배열
 */
기능 ts_woocommerce_include_order_status( $query_vars ) {
  글로벌 $typenow;

  /**
   * 'shop_order' 대신 wc_get_order_types()를 사용하면 다른 플러그인에서 다른 주문 유형을 추가할 수 있습니다.
   */
  if ( in_array( $typenow, wc_get_order_types( 'order-meta-boxes' ), ​​true ) ) {
    if ( isset( $_GET['include_status'] ) && '' != $_GET['include_status']
       && isset( $query_vars['post_status'] ) ) {
      $include_status = 폭발( ',', $_GET['include_status'] );
      $q_post_status[] = $query_vars['post_status'];
      $query_vars['post_status'] = array_merge( $q_post_status, $include_status );
    }
  }
  반환 $query_vars;
}
add_filter( '요청', 'ts_woocommerce_include_order_status', 20, 1 );

위의 스니펫에서 몇 가지 작업을 수행하고 있습니다.

먼저 WordPress의 요청 필터에 함수를 첨부합니다.

WooCommerce 주문 페이지에 대해서만 코드가 실행되기를 원하기 때문에 wc_get_order_types() 함수에서 반환된 배열에 $typenow 변수가 있는지 확인합니다. 이 경우 $typenow는 shop_order 로 설정됩니다. WooCommerce에서 생성한 주문의 post_type입니다.

include_status 는 표시하려는 다른 주문 상태를 전달해야 하는 GET 변수입니다. 여러 주문 상태를 쉼표로 구분하여 전달할 수 있습니다. 먼저 보고 싶은 1개의 주문 상태로 주문을 필터링해야 합니다. 보류 중인 주문으로 필터링했다고 가정해 보겠습니다.

WooCommerce Orders with Pending status
보류 상태의 WooCommerce 주문

보류 중인 주문과 함께 환불된 주문을 보려면 불가능합니다. 그러나 자식 테마의 functions.php에 위의 코드 조각을 추가한 다음 브라우저에서 Orders 페이지의 URL을 아래 링크로 변경하면:

<your_store_url>/wp-admin/edit.php?post_status=wc-pending&post_type=shop_order&include_status=wc-refunded

보류 중인 주문과 환불된 주문이 모두 표시됩니다.

WooCommerce orders with status as Pending & Refunded being shown
Pending & Refunded 상태의 WooCommerce 주문이 표시됨

include_status 매개변수에서 쉼표로 구분된 여러 주문 상태를 전달할 수도 있습니다. 따라서 Pending, Refunded & Delivered 주문을 보려면 아래와 같이 URL을 변경하면 됩니다.

<your_store_url>/wp-admin/edit.php?post_status=wc-pending&post_type=shop_order&include_status=wc-refunded,wc-delivered

배달됨은 테스트 WooCommerce 설치에 추가한 사용자 지정 상태입니다. 슬러그는 화장실에서 배달됩니다. 상태는 Custom Order Status 플러그인으로 추가됩니다.

위의 링크를 열면 다음 3가지 상태의 주문이 표시됩니다.

WooCommerce orders with status as Pending, Refunded & Delivered being shown
상태가 Pending, Refunded & Delivered인 WooCommerce 주문이 표시됨

URL 인코딩으로 인해 URL의 쉼표가 %2C로 바뀝니다.

2부: WooCommerce 주문을 필터링하여 전체 보기에서 하나 이상의 상태 주문 숨기기

기본적으로 모든 상태의 WooCommerce 주문이 주문 페이지에 표시되는 보기가 표시됩니다.

WooCommerce Orders in Admin

URL에서 변수를 전달할 수 있는 코드 조각을 아래에 만들었습니다. exclude_status . exclude_status 변수에서 전체 보기의 주문 페이지에 표시되지 않도록 제외하려는 상태의 슬러그를 전달할 수 있습니다. 코드는 다음과 같습니다.

 /**
 * 모든 주문 보기에서 우커머스 상태를 제외하기 위한 필터 처리
 *
 * @param array $query_vars 쿼리 변수.
 * @return 배열
 */
기능 ts_woocommerce_exclude_order_status( $query_vars ) {
  글로벌 $typenow;

  /**
   * 'shop_order' 대신 wc_get_order_types()를 사용하면 다른 플러그인에서 다른 주문 유형을 추가할 수 있습니다.
   */
  if ( in_array( $typenow, wc_get_order_types( 'order-meta-boxes' ), ​​true ) ) {
    if ( isset( $_GET['exclude_status'] ) && '' != $_GET['exclude_status']
       && isset( $query_vars['post_status'] ) ) {
      $exclude_status = 폭발( ',', $_GET['exclude_status'] );
      foreach ( $exclude_status as $key => $value ) {
        if ( ( $key = array_search( $value, $query_vars['post_status'] ) ) !== 거짓) {
          unset( $query_vars['post_status'][$key] );
        }
      }
    }
  }
  반환 $query_vars;
}
add_filter( '요청', 'ts_woocommerce_exclude_order_status', 20, 1 );

위의 코드를 자식 테마의 functions.php 파일에 추가하고 WooCommerce 주문 페이지의 URL을 아래와 같이 변경하면:

<your_store_url>/wp-admin/edit.php?post_type=shop_order&exclude_status=wc-pending

그러면 보류 상태의 주문이 모든 주문의 기본 보기에 표시되지 않습니다.

Excludes Pending orders from being displayed from all orders view
모든 주문 보기에서 보류 중인 주문이 표시되지 않도록 제외

제외할 여러 주문 상태를 지정할 수도 있습니다. 쉼표로 구분해야 합니다. 위의 예를 확장하여 전체 보기에서 보류 중 및 배달됨 주문을 숨기려면 주문 페이지 URL을 다음과 같이 변경할 수 있습니다.

<your_store_url>/woocommerce/wp-admin/edit.php?post_type=shop_order&exclude_status=wc-pending,wc-delivered

주문 페이지는 더 이상 전체 보기에서 보류 중 및 배달된 주문을 표시하지 않습니다.

Excludes Pending & Delivered orders from being displayed from all orders view
보류 중 및 배달된 주문은 모든 주문 보기에서 표시되지 않도록 제외

다음은 기본 WooCommerce 주문 상태 및 해당 슬러그에 대한 참조입니다.

  • 지불 보류 – 화장실 보류
  • 실패 – 화장실 실패
  • 처리 – 화장실 처리
  • 완료 – 화장실 완료
  • 대기 중 – wc-on-hold
  • 취소됨 – 화장실 취소됨
  • 환불됨 – 화장실 환불됨

URL에 주문 상태를 직접 추가하는 것은 최선의 방법이 아닙니다. 그러나 이 게시물의 아이디어는 목표를 달성할 수 있는 방법을 보여주는 것입니다.

WooCommerce에서 주문 상태별로 주문을 필터링하는 다른 접근 방식을 시도한 적이 있습니까? 나는 그들을 알고 싶습니다.