# orderable/0.2.0/inc/modules/services/class-services-order.php

Orderable – Restaurant &amp; Food Ordering System, version 0.2.0. 164 lines.

- Page: https://pluginprobe.com/plugins/orderable/0.2.0/code/inc/modules/services/class-services-order.php
- Raw: https://pluginprobe.com/plugins/orderable/0.2.0/raw/inc/modules/services/class-services-order.php
- Modified: 2021-06-16T17:04:06+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/orderable/0.2.0/code/inc/modules/services/class-services-order.php#L10-L20`.

```php
<?php
/**
 * Module: Services order.
 *
 * @package Orderable/Classes
 */

defined( 'ABSPATH' ) || exit;

/**
 * Services order class.
 */
class Orderable_Services_Order {
	/**
	 * Init.
	 */
	public static function run() {
		add_action( 'restrict_manage_posts', array( __CLASS__, 'services_filter' ), 50 );
		add_action( 'pre_get_posts', array( __CLASS__, 'filter_admin_orders' ), 100 );
		add_filter( 'manage_edit-shop_order_columns', array( __CLASS__, 'add_admin_order_columns' ), 10 );
		add_action( 'manage_shop_order_posts_custom_column', array( __CLASS__, 'add_admin_order_columns_content' ), 10, 2 );
		add_filter( 'orderable_get_order_date_time', array( __CLASS__, 'modify_order_date_time_labels' ), 10, 2 );
		add_action( 'woocommerce_before_order_object_save', array( __CLASS__, 'before_save_order' ), 10, 2 );
	}

	/**
	 * Services filter.
	 */
	public static function services_filter() {
		$service = self::get_filtered_service();
		?>
		<select name="orderable_service">
			<option value=""><?php esc_attr_e( 'All services', 'orderable' ); ?></option>
			<option value="delivery" <?php selected( $service, 'delivery' ); ?>><?php esc_attr_e( 'Delivery', 'orderable' ); ?></option>
			<option value="pickup" <?php selected( $service, 'pickup' ); ?>><?php esc_attr_e( 'Pickup', 'orderable' ); ?></option>
		</select>
		<?php
	}

	/**
	 * Get filtered service.
	 *
	 * @return mixed
	 */
	public static function get_filtered_service() {
		$service = filter_input( INPUT_GET, 'orderable_service', FILTER_SANITIZE_STRING );

		if ( ! $service ) {
			return '';
		}

		return $service;
	}

	/**
	 * Filter orders.
	 *
	 * @param WP_Query $query
	 */
	public static function filter_admin_orders( $query ) {
		if ( ! Orderable_Orders::is_orders_page() || 'shop_order' !== $query->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 );
	}

	/**
	 * 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 $type;
		}

		$shipping_method    = array_shift( $shipping_methods );
		$shipping_method_id = $shipping_method->get_method_id();

		return Orderable_Services::is_pickup_method( $shipping_method_id ) ? 'pickup' : 'delivery';
	}

	/**
	 * 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       = Orderable_Services_Order::get_service_type( $order );
			$background = 'pickup' === $type ? '#C6C7E1' : '#c5e2df';
			$color      = 'pickup' === $type ? '#6264ac' : '#3e7a74';

			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 ) );
		}
	}

	/**
	 * 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       = Orderable_Services_Order::get_service_type( $order );
		$type_label = Orderable_Services::get_service_label( $type );

		$labels['order_date']['label'] = sprintf( '%s %s', $type_label, $labels['order_date']['label'] );
		$labels['order_time']['label'] = sprintf( '%s %s', $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 = Orderable_Services_Order::get_service_type( $abstract_order );

		$abstract_order->update_meta_data( '_orderable_service_type', $type );
	}
}
```
