Advertisement
ikamal7

get_order_report_data

Jul 9th, 2021
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.96 KB | None | 0 0
  1. function get_order_report_data( $args = array() ) {
  2.         global $wpdb;
  3.  
  4.         $default_args = array(
  5.             'data'                => array(),
  6.             'where'               => array(),
  7.             'where_meta'          => array(),
  8.             'query_type'          => 'get_row',
  9.             'group_by'            => '',
  10.             'order_by'            => '',
  11.             'limit'               => '',
  12.             'filter_range'        => false,
  13.             'nocache'             => false,
  14.             'debug'               => false,
  15.             'order_types'         => wc_get_order_types( 'reports' ),
  16.             'order_status'        => array( 'completed', 'processing', 'on-hold' ),
  17.             'parent_order_status' => false,
  18.         );
  19.         $args         = apply_filters( 'woocommerce_reports_get_order_report_data_args', $args );
  20.         $args         = wp_parse_args( $args, $default_args );
  21.  
  22.         extract( $args );
  23.  
  24.         if ( empty( $data ) ) {
  25.             return '';
  26.         }
  27.  
  28.         $order_status = apply_filters( 'woocommerce_reports_order_statuses', $order_status );
  29.  
  30.         $query  = array();
  31.         $select = array();
  32.  
  33.         foreach ( $data as $raw_key => $value ) {
  34.             $key      = sanitize_key( $raw_key );
  35.             $distinct = '';
  36.  
  37.             if ( isset( $value['distinct'] ) ) {
  38.                 $distinct = 'DISTINCT';
  39.             }
  40.  
  41.             switch ( $value['type'] ) {
  42.                 case 'meta':
  43.                     $get_key = "meta_{$key}.meta_value";
  44.                     break;
  45.                 case 'parent_meta':
  46.                     $get_key = "parent_meta_{$key}.meta_value";
  47.                     break;
  48.                 case 'post_data':
  49.                     $get_key = "posts.{$key}";
  50.                     break;
  51.                 case 'order_item_meta':
  52.                     $get_key = "order_item_meta_{$key}.meta_value";
  53.                     break;
  54.                 case 'order_item':
  55.                     $get_key = "order_items.{$key}";
  56.                     break;
  57.             }
  58.  
  59.             if ( empty( $get_key ) ) {
  60.                 // Skip to the next foreach iteration else the query will be invalid.
  61.                 continue;
  62.             }
  63.  
  64.             if ( $value['function'] ) {
  65.                 $get = "{$value['function']}({$distinct} {$get_key})";
  66.             } else {
  67.                 $get = "{$distinct} {$get_key}";
  68.             }
  69.  
  70.             $select[] = "{$get} as {$value['name']}";
  71.         }
  72.  
  73.         $query['select'] = 'SELECT ' . implode( ',', $select );
  74.         $query['from']   = "FROM {$wpdb->posts} AS posts";
  75.  
  76.         // Joins
  77.         $joins = array();
  78.  
  79.         foreach ( ( $data + $where ) as $raw_key => $value ) {
  80.             $join_type = isset( $value['join_type'] ) ? $value['join_type'] : 'INNER';
  81.             $type      = isset( $value['type'] ) ? $value['type'] : false;
  82.             $key       = sanitize_key( $raw_key );
  83.  
  84.             switch ( $type ) {
  85.                 case 'meta':
  86.                     $joins[ "meta_{$key}" ] = "{$join_type} JOIN {$wpdb->postmeta} AS meta_{$key} ON ( posts.ID = meta_{$key}.post_id AND meta_{$key}.meta_key = '{$raw_key}' )";
  87.                     break;
  88.                 case 'parent_meta':
  89.                     $joins[ "parent_meta_{$key}" ] = "{$join_type} JOIN {$wpdb->postmeta} AS parent_meta_{$key} ON (posts.post_parent = parent_meta_{$key}.post_id) AND (parent_meta_{$key}.meta_key = '{$raw_key}')";
  90.                     break;
  91.                 case 'order_item_meta':
  92.                     $joins['order_items'] = "{$join_type} JOIN {$wpdb->prefix}woocommerce_order_items AS order_items ON (posts.ID = order_items.order_id)";
  93.  
  94.                     if ( ! empty( $value['order_item_type'] ) ) {
  95.                         $joins['order_items'] .= " AND (order_items.order_item_type = '{$value['order_item_type']}')";
  96.                     }
  97.  
  98.                     $joins[ "order_item_meta_{$key}" ] = "{$join_type} JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS order_item_meta_{$key} ON " .
  99.                                                         "(order_items.order_item_id = order_item_meta_{$key}.order_item_id) " .
  100.                                                         " AND (order_item_meta_{$key}.meta_key = '{$raw_key}')";
  101.                     break;
  102.                 case 'order_item':
  103.                     $joins['order_items'] = "{$join_type} JOIN {$wpdb->prefix}woocommerce_order_items AS order_items ON posts.ID = order_items.order_id";
  104.                     break;
  105.             }
  106.         }
  107.  
  108.         if ( ! empty( $where_meta ) ) {
  109.             foreach ( $where_meta as $value ) {
  110.                 if ( ! is_array( $value ) ) {
  111.                     continue;
  112.                 }
  113.                 $join_type = isset( $value['join_type'] ) ? $value['join_type'] : 'INNER';
  114.                 $type      = isset( $value['type'] ) ? $value['type'] : false;
  115.                 $key       = sanitize_key( is_array( $value['meta_key'] ) ? $value['meta_key'][0] . '_array' : $value['meta_key'] );
  116.  
  117.                 if ( 'order_item_meta' === $type ) {
  118.  
  119.                     $joins['order_items']              = "{$join_type} JOIN {$wpdb->prefix}woocommerce_order_items AS order_items ON posts.ID = order_items.order_id";
  120.                     $joins[ "order_item_meta_{$key}" ] = "{$join_type} JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS order_item_meta_{$key} ON order_items.order_item_id = order_item_meta_{$key}.order_item_id";
  121.  
  122.                 } else {
  123.                     // If we have a where clause for meta, join the postmeta table
  124.                     $joins[ "meta_{$key}" ] = "{$join_type} JOIN {$wpdb->postmeta} AS meta_{$key} ON posts.ID = meta_{$key}.post_id";
  125.                 }
  126.             }
  127.         }
  128.  
  129.         if ( ! empty( $parent_order_status ) ) {
  130.             $joins['parent'] = "LEFT JOIN {$wpdb->posts} AS parent ON posts.post_parent = parent.ID";
  131.         }
  132.  
  133.         $query['join'] = implode( ' ', $joins );
  134.  
  135.         $query['where'] = "
  136.             WHERE   posts.post_type     IN ( '" . implode( "','", $order_types ) . "' )
  137.             ";
  138.  
  139.         if ( ! empty( $order_status ) ) {
  140.             $query['where'] .= "
  141.                 AND     posts.post_status   IN ( 'wc-" . implode( "','wc-", $order_status ) . "')
  142.             ";
  143.         }
  144.  
  145.         if ( ! empty( $parent_order_status ) ) {
  146.             if ( ! empty( $order_status ) ) {
  147.                 $query['where'] .= " AND ( parent.post_status IN ( 'wc-" . implode( "','wc-", $parent_order_status ) . "') OR parent.ID IS NULL ) ";
  148.             } else {
  149.                 $query['where'] .= " AND parent.post_status IN ( 'wc-" . implode( "','wc-", $parent_order_status ) . "') ";
  150.             }
  151.         }
  152.  
  153.         if ( $filter_range ) {
  154.             $query['where'] .= "
  155.                 AND     posts.post_date >= '" . date( 'Y-m-d H:i:s', $this->start_date ) . "'
  156.                 AND     posts.post_date < '" . date( 'Y-m-d H:i:s', strtotime( '+1 DAY', $this->end_date ) ) . "'
  157.             ";
  158.         }
  159.  
  160.         if ( ! empty( $where_meta ) ) {
  161.  
  162.             $relation = isset( $where_meta['relation'] ) ? $where_meta['relation'] : 'AND';
  163.  
  164.             $query['where'] .= ' AND (';
  165.  
  166.             foreach ( $where_meta as $index => $value ) {
  167.  
  168.                 if ( ! is_array( $value ) ) {
  169.                     continue;
  170.                 }
  171.  
  172.                 $key = sanitize_key( is_array( $value['meta_key'] ) ? $value['meta_key'][0] . '_array' : $value['meta_key'] );
  173.  
  174.                 if ( strtolower( $value['operator'] ) == 'in' || strtolower( $value['operator'] ) == 'not in' ) {
  175.  
  176.                     if ( is_array( $value['meta_value'] ) ) {
  177.                         $value['meta_value'] = implode( "','", $value['meta_value'] );
  178.                     }
  179.  
  180.                     if ( ! empty( $value['meta_value'] ) ) {
  181.                         $where_value = "{$value['operator']} ('{$value['meta_value']}')";
  182.                     }
  183.                 } else {
  184.                     $where_value = "{$value['operator']} '{$value['meta_value']}'";
  185.                 }
  186.  
  187.                 if ( ! empty( $where_value ) ) {
  188.                     if ( $index > 0 ) {
  189.                         $query['where'] .= ' ' . $relation;
  190.                     }
  191.  
  192.                     if ( isset( $value['type'] ) && 'order_item_meta' === $value['type'] ) {
  193.  
  194.                         if ( is_array( $value['meta_key'] ) ) {
  195.                             $query['where'] .= " ( order_item_meta_{$key}.meta_key   IN ('" . implode( "','", $value['meta_key'] ) . "')";
  196.                         } else {
  197.                             $query['where'] .= " ( order_item_meta_{$key}.meta_key   = '{$value['meta_key']}'";
  198.                         }
  199.  
  200.                         $query['where'] .= " AND order_item_meta_{$key}.meta_value {$where_value} )";
  201.                     } else {
  202.  
  203.                         if ( is_array( $value['meta_key'] ) ) {
  204.                             $query['where'] .= " ( meta_{$key}.meta_key   IN ('" . implode( "','", $value['meta_key'] ) . "')";
  205.                         } else {
  206.                             $query['where'] .= " ( meta_{$key}.meta_key   = '{$value['meta_key']}'";
  207.                         }
  208.  
  209.                         $query['where'] .= " AND meta_{$key}.meta_value {$where_value} )";
  210.                     }
  211.                 }
  212.             }
  213.  
  214.             $query['where'] .= ')';
  215.         }
  216.  
  217.         if ( ! empty( $where ) ) {
  218.  
  219.             foreach ( $where as $value ) {
  220.  
  221.                 if ( strtolower( $value['operator'] ) == 'in' || strtolower( $value['operator'] ) == 'not in' ) {
  222.  
  223.                     if ( is_array( $value['value'] ) ) {
  224.                         $value['value'] = implode( "','", $value['value'] );
  225.                     }
  226.  
  227.                     if ( ! empty( $value['value'] ) ) {
  228.                         $where_value = "{$value['operator']} ('{$value['value']}')";
  229.                     }
  230.                 } else {
  231.                     $where_value = "{$value['operator']} '{$value['value']}'";
  232.                 }
  233.  
  234.                 if ( ! empty( $where_value ) ) {
  235.                     $query['where'] .= " AND {$value['key']} {$where_value}";
  236.                 }
  237.             }
  238.         }
  239.  
  240.         if ( $group_by ) {
  241.             $query['group_by'] = "GROUP BY {$group_by}";
  242.         }
  243.  
  244.         if ( $order_by ) {
  245.             $query['order_by'] = "ORDER BY {$order_by}";
  246.         }
  247.  
  248.         if ( $limit ) {
  249.             $query['limit'] = "LIMIT {$limit}";
  250.         }
  251.  
  252.         $query = apply_filters( 'woocommerce_reports_get_order_report_query', $query );
  253.         $query = implode( ' ', $query );
  254.  
  255.         if ( $debug ) {
  256.             echo '<pre>';
  257.             wc_print_r( $query );
  258.             echo '</pre>';
  259.         }
  260.  
  261.         if ( $debug || $nocache ) {
  262.             self::enable_big_selects();
  263.  
  264.             $result = apply_filters( 'woocommerce_reports_get_order_report_data', $wpdb->$query_type( $query ), $data );
  265.         } else {
  266.             $query_hash = md5( $query_type . $query );
  267.             $result     = $this->get_cached_query( $query_hash );
  268.             if ( $result === null ) {
  269.                 self::enable_big_selects();
  270.  
  271.                 $result = apply_filters( 'woocommerce_reports_get_order_report_data', $wpdb->$query_type( $query ), $data );
  272.             }
  273.             $this->set_cached_query( $query_hash, $result );
  274.         }
  275.  
  276.         return $result;
  277.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement