PluginProbe
Orderable – Restaurant & Food Ordering System / 1.12.2
Orderable – Restaurant & Food Ordering System v1.12.2
0.1.4 0.1.5 0.2.0 1.0.0 1.1.0 1.1.1 1.10.0 1.10.1 1.11.0 1.12.0 1.12.1 1.12.2 1.13.0 1.14.0 1.15.0 1.16.0 1.17.0 1.17.1 1.18.0 1.19.0 1.19.1 1.19.2 1.2.0 1.20.0 1.20.1 All 44 releases
orderable / inc / modules / services / class-services-order.php

class-services-order.php in Orderable – Restaurant & Food Ordering System 1.12.2, at inc/modules/services/class-services-order.php

227 lines 6.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Module: Services order.
4 *
5 * @package Orderable/Classes
6 */
7
8 defined( 'ABSPATH' ) || exit;
9
10 /**
11 * Services order class.
12 */
13 class Orderable_Services_Order {
14 /**
15 * Init.
16 */
17 public static function run() {
18 add_action( 'restrict_manage_posts', array( __CLASS__, 'services_filter' ), 50 );
19 add_action( 'woocommerce_order_list_table_restrict_manage_orders', array( __CLASS__, 'services_filter' ), 50 );
20 add_action( 'pre_get_posts', array( __CLASS__, 'update_query_to_filter_admin_orders' ), 100 );
21 add_filter( 'woocommerce_shop_order_list_table_prepare_items_query_args', array( __CLASS__, 'update_query_args_to_filter_admin_orders' ), 100 );
22 add_filter( 'manage_edit-shop_order_columns', array( __CLASS__, 'add_admin_order_columns' ), 10 );
23 add_action( 'manage_shop_order_posts_custom_column', array( __CLASS__, 'add_admin_order_columns_content' ), 10, 2 );
24 add_filter( 'orderable_get_order_date_time', array( __CLASS__, 'modify_order_date_time_labels' ), 10, 2 );
25 add_action( 'woocommerce_before_order_object_save', array( __CLASS__, 'before_save_order' ), 10, 2 );
26
27 // HPOS Compatibility.
28 add_action( 'admin_init', array( __CLASS__, 'add_service_custom_column' ) );
29 }
30
31 /**
32 * Services filter.
33 */
34 public static function services_filter() {
35 $service = self::get_filtered_service();
36 ?>
37 <select name="orderable_service">
38 <option value=""><?php esc_attr_e( 'All services', 'orderable' ); ?></option>
39 <option value="delivery" <?php selected( $service, 'delivery' ); ?>><?php esc_attr_e( 'Delivery', 'orderable' ); ?></option>
40 <option value="pickup" <?php selected( $service, 'pickup' ); ?>><?php esc_attr_e( 'Pickup', 'orderable' ); ?></option>
41 </select>
42 <?php
43 }
44
45 /**
46 * Get filtered service.
47 *
48 * @return mixed
49 */
50 public static function get_filtered_service() {
51 // phpcs:ignore WordPress.Security.NonceVerification
52 $service = empty( $_GET['orderable_service'] ) ? '' : sanitize_text_field( wp_unslash( $_GET['orderable_service'] ) );
53
54 if ( ! $service ) {
55 return '';
56 }
57
58 return $service;
59 }
60
61 /**
62 * Update the query object to filter orders.
63 *
64 * @param WP_Query $query The query to retrieve the orders.
65 */
66 public static function update_query_to_filter_admin_orders( $query ) {
67 if ( ! Orderable_Orders::is_orders_page() || 'shop_order' !== $query->get( 'post_type' ) ) {
68 return;
69 }
70
71 $meta_query = (array) $query->get( 'meta_query' );
72 $service = self::get_filtered_service();
73
74 if ( ! empty( $service ) ) {
75 $meta_query[] = array(
76 'key' => '_orderable_service_type',
77 'value' => $service,
78 );
79 }
80
81 $query->set( 'meta_query', $meta_query );
82 }
83
84 /**
85 * Update the query args to filter orders.
86 *
87 * @param array $query_args The query args used to retrieve the orders.
88 * @return array
89 */
90 public static function update_query_args_to_filter_admin_orders( $query_args ) {
91 if ( ! Orderable_Orders::is_orders_page() ) {
92 return $query_args;
93 }
94
95 $meta_query = empty( $query_args['meta_query'] ) || ! is_array( $query_args['meta_query'] ) ? array() : $query_args['meta_query'];
96 $service = self::get_filtered_service();
97
98 if ( empty( $service ) ) {
99 return $query_args;
100 }
101
102 $meta_query[] = array(
103 'key' => '_orderable_service_type',
104 'value' => $service,
105 );
106
107 $query_args['meta_query'] = $meta_query; // phpcs:ignore WordPress.DB.SlowDBQuery
108
109 return $query_args;
110 }
111
112 /**
113 * Get service type for an order.
114 *
115 * @param WC_Order $order
116 *
117 * @return bool|string
118 */
119 public static function get_service_type( $order ) {
120 $shipping_methods = $order->get_shipping_methods();
121 $type = false;
122
123 if ( empty( $shipping_methods ) ) {
124 return apply_filters( 'orderable_get_service_type', $type, $order );
125 }
126
127 $shipping_method = array_shift( $shipping_methods );
128 $shipping_method_id = $shipping_method->get_method_id();
129
130 $type = Orderable_Services::is_pickup_method( $shipping_method_id ) ? 'pickup' : 'delivery';
131
132 return apply_filters( 'orderable_get_service_type', $type, $order );
133 }
134
135 /**
136 * Add columns to admin orders screen.
137 *
138 * @param array $columns
139 *
140 * @return array
141 */
142 public static function add_admin_order_columns( $columns ) {
143 $columns['orderable_service_type'] = __( 'Service', 'orderable' );
144
145 return $columns;
146 }
147
148 /**
149 * Add columns content to admin orders screen.
150 *
151 * @param $column_name
152 * @param $post_id
153 */
154 public static function add_admin_order_columns_content( $column_name, $post_id ) {
155 if ( 'orderable_service_type' === $column_name ) {
156 $order = wc_get_order( $post_id );
157 $type = self::get_service_type( $order );
158
159 if ( empty( $type ) ) {
160 echo '&mdash;';
161
162 return;
163 }
164
165 $background = 'pickup' === $type ? '#C6C7E1' : '#c5e2df';
166 $color = 'pickup' === $type ? '#5457a0' : '#356964';
167
168 $background = apply_filters( 'orderable_service_type_column_background_color', $background, $column_name, $post_id, $order, $type );
169 $color = apply_filters( 'orderable_service_type_column_text_color', $color, $column_name, $post_id, $order, $type );
170
171 printf( '<mark class="order-status order-status--%s" style="background-color: %s; color: %s;"><span>%s</span></mark>', esc_attr( $type ), esc_attr( $background ), esc_attr( $color ), Orderable_Services::get_service_label( $type ) );
172 }
173 }
174
175 /**
176 * Modify order date/time labels.
177 *
178 * @param array $labels
179 * @param WC_Order $order
180 *
181 * @return array
182 */
183 public static function modify_order_date_time_labels( $labels, $order ) {
184 $type = Orderable_Services_Order::get_service_type( $order );
185 $type_label = Orderable_Services::get_service_label( $type );
186
187 /* translators: 1: service name; 2: date label. E.g.: "Pickup Date", "Delivery Date" */
188 $labels['order_date']['label'] = sprintf( _x( '%1$s %2$s', 'Order date', 'orderable' ), $type_label, $labels['order_date']['label'] );
189 /* translators: 1: service name; 2: time label. E.g.: "Pickup Time", "Delivery Time" */
190 $labels['order_time']['label'] = sprintf( _x( '%1$s %2$s', 'Order time', 'orderable' ), $type_label, $labels['order_time']['label'] );
191
192 return $labels;
193 }
194
195 /**
196 * Save order meta.
197 *
198 * @param WC_Abstract_Order $abstract_order
199 * @param WC_Data_Store $data_store
200 *
201 * @return string
202 */
203 public static function before_save_order( $abstract_order, $data_store ) {
204 if ( empty( $abstract_order ) ) {
205 return;
206 }
207
208 $type = Orderable_Services_Order::get_service_type( $abstract_order );
209
210 $abstract_order->update_meta_data( '_orderable_service_type', $type );
211 }
212
213 /**
214 * Add Service custom column.
215 *
216 * Compatible with HPOS.
217 *
218 * @return void
219 */
220 public static function add_service_custom_column() {
221 $shop_order_page_screen_id = wc_get_page_screen_id( 'shop-order' );
222
223 add_filter( "manage_{$shop_order_page_screen_id}_columns", array( __CLASS__, 'add_admin_order_columns' ), 10 );
224 add_action( "manage_{$shop_order_page_screen_id}_custom_column", array( __CLASS__, 'add_admin_order_columns_content' ), 10, 2 );
225 }
226 }
227