get( 'post_type' ) ) { return; } $meta_query = (array) $query->get( 'meta_query' ); $service = self::get_filtered_service(); if ( ! empty( $service ) ) { $meta_query[] = array( 'key' => '_orderable_service_type', 'value' => $service, ); } $query->set( 'meta_query', $meta_query ); } /** * Update the query args to filter orders. * * @param array $query_args The query args used to retrieve the orders. * @return array */ public static function update_query_args_to_filter_admin_orders( $query_args ) { if ( ! Orderable_Orders::is_orders_page() ) { return $query_args; } $meta_query = empty( $query_args['meta_query'] ) || ! is_array( $query_args['meta_query'] ) ? array() : $query_args['meta_query']; $service = self::get_filtered_service(); if ( empty( $service ) ) { return $query_args; } $meta_query[] = array( 'key' => '_orderable_service_type', 'value' => $service, ); $query_args['meta_query'] = $meta_query; // phpcs:ignore WordPress.DB.SlowDBQuery return $query_args; } /** * Get service type for an order. * * @param WC_Order $order * * @return bool|string */ public static function get_service_type( $order ) { $shipping_methods = $order->get_shipping_methods(); $type = false; if ( empty( $shipping_methods ) ) { return apply_filters( 'orderable_get_service_type', $type, $order ); } $shipping_method = array_shift( $shipping_methods ); $shipping_method_id = $shipping_method->get_method_id(); $type = Orderable_Services::is_pickup_method( $shipping_method_id ) ? 'pickup' : 'delivery'; return apply_filters( 'orderable_get_service_type', $type, $order ); } /** * Add columns to admin orders screen. * * @param array $columns * * @return array */ public static function add_admin_order_columns( $columns ) { $columns['orderable_service_type'] = __( 'Service', 'orderable' ); return $columns; } /** * Add columns content to admin orders screen. * * @param $column_name * @param $post_id */ public static function add_admin_order_columns_content( $column_name, $post_id ) { if ( 'orderable_service_type' === $column_name ) { $order = wc_get_order( $post_id ); $type = self::get_service_type( $order ); if ( empty( $type ) ) { echo '—'; return; } $background = 'pickup' === $type ? '#C6C7E1' : '#c5e2df'; $color = 'pickup' === $type ? '#5457a0' : '#356964'; $background = apply_filters( 'orderable_service_type_column_background_color', $background, $column_name, $post_id, $order, $type ); $color = apply_filters( 'orderable_service_type_column_text_color', $color, $column_name, $post_id, $order, $type ); printf( '%s', esc_attr( $type ), esc_attr( $background ), esc_attr( $color ), Orderable_Services::get_service_label( $type ) ); } } /** * Modify order date/time labels. * * @param array $labels * @param WC_Order $order * * @return array */ public static function modify_order_date_time_labels( $labels, $order ) { $type = self::get_service_type( $order ); $type_label = Orderable_Services::get_service_label( $type ); /* translators: 1: service name; 2: date label. E.g.: "Pickup Date", "Delivery Date" */ $labels['order_date']['label'] = sprintf( _x( '%1$s %2$s', 'Order date', 'orderable' ), $type_label, $labels['order_date']['label'] ); /* translators: 1: service name; 2: time label. E.g.: "Pickup Time", "Delivery Time" */ $labels['order_time']['label'] = sprintf( _x( '%1$s %2$s', 'Order time', 'orderable' ), $type_label, $labels['order_time']['label'] ); return $labels; } /** * Save order meta. * * @param WC_Abstract_Order $abstract_order * @param WC_Data_Store $data_store * * @return string */ public static function before_save_order( $abstract_order, $data_store ) { if ( empty( $abstract_order ) ) { return; } $type = self::get_service_type( $abstract_order ); $abstract_order->update_meta_data( '_orderable_service_type', $type ); } /** * Add Service custom column. * * Compatible with HPOS. * * @return void */ public static function add_service_custom_column() { $shop_order_page_screen_id = wc_get_page_screen_id( 'shop-order' ); add_filter( "manage_{$shop_order_page_screen_id}_columns", array( __CLASS__, 'add_admin_order_columns' ), 10 ); add_action( "manage_{$shop_order_page_screen_id}_custom_column", array( __CLASS__, 'add_admin_order_columns_content' ), 10, 2 ); } }