Guest User

Custom WooCommerce API Endpoint

a guest
Jun 1st, 2024
873
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.97 KB | None | 0 0
  1. <?php
  2. /**
  3.  * Plugin Name: Get Orders by Email Endpoint
  4.  * Description: Adds a custom REST API endpoint to fetch WooCommerce orders by billing email.
  5.  * Version: 1.0.0
  6.  * Author: Con
  7.  */
  8.  
  9. if (!defined('ABSPATH')) {
  10.     exit; // Exit if accessed directly.
  11. }
  12.  
  13. class Get_Orders_By_Email_Endpoint {
  14.     protected $namespace = 'path_to_namespace_here';
  15.     protected $route = 'api_route_here';
  16.  
  17.     public function __construct() {
  18.         add_action('rest_api_init', array($this, 'register_routes'));
  19.     }
  20.  
  21.  
  22.     public function register_routes() {
  23.         register_rest_route($this->namespace, $this->route, array(
  24.             'methods' => 'GET',
  25.             'callback' => array($this, 'get_orders'),
  26.             'permission_callback' => array($this, 'permissions_check'),
  27.             'args' => array(
  28.                 'billing_email' => array(
  29.                     'required' => true,
  30.                     'validate_callback' => array($this, 'validate_email'),
  31.                     'sanitize_callback' => 'sanitize_email',
  32.                 ),
  33.                 'number_of_orders' => array(
  34.                     'required' => false,
  35.                     'default' => 5,
  36.                     'validate_callback' => array($this, 'validate_number_of_orders'),
  37.                     'sanitize_callback' => 'absint',
  38.                 ),
  39.             ),
  40.         ));
  41.     }
  42.  
  43.     public function permissions_check($request) {
  44.         return current_user_can('manage_options');
  45.     }
  46.  
  47.     public function validate_email($param, $request, $key) {
  48.         return is_email($param);
  49.     }
  50.  
  51.     public function validate_number_of_orders($param, $request, $key) {
  52.         return is_numeric($param);
  53.     }
  54.  
  55.     public function get_orders($request) {
  56.         $billing_email = sanitize_email($request['billing_email']);
  57.         $number_of_orders = absint($request['number_of_orders']);
  58.  
  59.         // Fetch orders using WooCommerce functions
  60.         $args = array(
  61.             'billing_email' => $billing_email,
  62.             'limit' => $number_of_orders,
  63.             'orderby' => 'date',
  64.             'order' => 'DESC'
  65.         );
  66.  
  67.         $orders = wc_get_orders($args);
  68.         if (empty($orders)) {
  69.             return new WP_Error('no_orders', 'No orders found', array('status' => 404));
  70.         }
  71.  
  72.         $response_data = array();
  73.         foreach ($orders as $order) {
  74.             $order_data = $order->get_data();
  75.             $order_array = array(
  76.                 'id' => $order_data['id'],
  77.                 'parent_id' => $order_data['parent_id'],
  78.                 'status' => $order_data['status'],
  79.                 'currency' => $order_data['currency'],
  80.                 'version' => $order_data['version'],
  81.                 'prices_include_tax' => $order_data['prices_include_tax'],
  82.                 'date_created' => $order_data['date_created']->date('Y-m-d\TH:i:s'),
  83.                 'date_modified' => $order_data['date_modified']->date('Y-m-d\TH:i:s'),
  84.                 'discount_total' => $order_data['discount_total'],
  85.                 'discount_tax' => $order_data['discount_tax'],
  86.                 'shipping_total' => $order_data['shipping_total'],
  87.                 'shipping_tax' => $order_data['shipping_tax'],
  88.                 'cart_tax' => $order_data['cart_tax'],
  89.                 'total' => $order_data['total'],
  90.                 'total_tax' => $order_data['total_tax'],
  91.                 'customer_id' => $order_data['customer_id'],
  92.                 'order_key' => $order_data['order_key'],
  93.                 'billing' => $order_data['billing'],
  94.                 'shipping' => $order_data['shipping'],
  95.                 'payment_method' => $order_data['payment_method'],
  96.                 'payment_method_title' => $order_data['payment_method_title'],
  97.                 'transaction_id' => $order_data['transaction_id'],
  98.                 'customer_ip_address' => $order_data['customer_ip_address'],
  99.                 'customer_user_agent' => $order_data['customer_user_agent'],
  100.                 'created_via' => $order_data['created_via'],
  101.                 'customer_note' => $order_data['customer_note'],
  102.                 'date_completed' => $order_data['date_completed'] ? $order_data['date_completed']->date('Y-m-d\TH:i:s') : null,
  103.                 'date_paid' => $order_data['date_paid'] ? $order_data['date_paid']->date('Y-m-d\TH:i:s') : null,
  104.                 'cart_hash' => $order_data['cart_hash'],
  105.                 'number' => $order_data['number'],
  106.                 'meta_data' => $this->get_meta_data($order),
  107.                 'line_items' => $this->get_order_items($order, 'line_item'),
  108.                 'tax_lines' => $this->get_order_items($order, 'tax'),
  109.                 'shipping_lines' => $this->get_order_items($order, 'shipping'),
  110.                 'fee_lines' => $this->get_order_items($order, 'fee'),
  111.                 'coupon_lines' => $this->get_order_items($order, 'coupon'),
  112.                 'refunds' => $this->get_order_items($order, 'refund'),
  113.                 'payment_url' => $order->get_checkout_payment_url(),
  114.                 'is_editable' => $order->is_editable(),
  115.                 'needs_payment' => $order->needs_payment(),
  116.                 'needs_processing' => $order->needs_processing(),
  117.                 'date_created_gmt' => $order_data['date_created']->date('Y-m-d\TH:i:s', 0),
  118.                 'date_modified_gmt' => $order_data['date_modified']->date('Y-m-d\TH:i:s', 0),
  119.                 'date_completed_gmt' => $order_data['date_completed'] ? $order_data['date_completed']->date('Y-m-d\TH:i:s', 0) : null,
  120.                 'date_paid_gmt' => $order_data['date_paid'] ? $order_data['date_paid']->date('Y-m-d\TH:i:s', 0) : null,
  121.                 'store_credit_used' => get_post_meta($order_data['id'], '_store_credit_used', true),
  122.                 'currency_symbol' => get_woocommerce_currency_symbol($order_data['currency']),
  123.                 '_links' => array(
  124.                     'self' => array(
  125.                         array(
  126.                             'href' => rest_url('wc/v3/orders/' . $order_data['id'])
  127.                         )
  128.                     ),
  129.                     'collection' => array(
  130.                         array(
  131.                             'href' => rest_url('wc/v3/orders')
  132.                         )
  133.                     )
  134.                 )
  135.             );
  136.             $response_data[] = $order_array;
  137.         }
  138.  
  139.         return rest_ensure_response($response_data);
  140.     }
  141.  
  142.     private function get_meta_data($order) {
  143.         $meta_data = array();
  144.         foreach ($order->get_meta_data() as $meta) {
  145.             $meta_data[] = array(
  146.                 'id' => $meta->id,
  147.                 'key' => $meta->key,
  148.                 'value' => $meta->value,
  149.             );
  150.         }
  151.         return $meta_data;
  152.     }
  153.  
  154.     private function get_order_items($order, $type) {
  155.         $items = array();
  156.         foreach ($order->get_items($type) as $item_id => $item) {
  157.             $items[] = $item->get_data();
  158.         }
  159.         return $items;
  160.     }
  161.    
  162. }
  163.  
  164. new Get_Orders_By_Email_Endpoint();
  165.  
Advertisement
Add Comment
Please, Sign In to add comment