'; echo '

' . esc_html__( 'When you receive a new order, it will appear here.', 'woocommerce' ) . '

'; echo '' . esc_html__( 'Learn more about orders', 'woocommerce' ) . ''; echo ''; } /** * Define primary column. * * @return array */ protected function get_primary_column() { return 'order_number'; } /** * Get row actions to show in the list table. * * @param array $actions Array of actions. * @param WP_Post $post Current post object. * @return array */ protected function get_row_actions( $actions, $post ) { return array(); } /** * Define hidden columns. * * @return array */ protected function define_hidden_columns() { return array( 'shipping_address', 'billing_address', ); } /** * Define which columns are sortable. * * @param array $columns Existing columns. * @return array */ public function define_sortable_columns( $columns ) { $custom = array( 'order_number' => 'ID', 'order_total' => 'order_total', 'order_date' => 'date', ); unset( $columns['comments'] ); return wp_parse_args( $custom, $columns ); } /** * Define which columns to show on this screen. * * @param array $columns Existing columns. * @return array */ public function define_columns( $columns ) { $show_columns = array(); $show_columns['cb'] = $columns['cb']; $show_columns['order_number'] = __( 'Order', 'woocommerce' ); $show_columns['billing_address'] = __( 'Billing', 'woocommerce' ); $show_columns['shipping_address'] = __( 'Ship to', 'woocommerce' ); $show_columns['order_date'] = __( 'Date', 'woocommerce' ); $show_columns['order_status'] = __( 'Status', 'woocommerce' ); $show_columns['order_total'] = __( 'Total', 'woocommerce' ); if ( has_action( 'woocommerce_admin_order_actions_start' ) || has_action( 'woocommerce_admin_order_actions_end' ) || has_filter( 'woocommerce_admin_order_actions' ) ) { $show_columns['order_actions'] = __( 'Actions', 'woocommerce' ); } wp_enqueue_script( 'wc-orders' ); return $show_columns; } /** * Define bulk actions. * * @param array $actions Existing actions. * @return array */ public function define_bulk_actions( $actions ) { if ( isset( $actions['edit'] ) ) { unset( $actions['edit'] ); } $actions['mark_processing'] = __( 'Mark processing', 'woocommerce' ); $actions['mark_on-hold'] = __( 'Mark on-hold', 'woocommerce' ); $actions['mark_completed'] = __( 'Mark complete', 'woocommerce' ); return $actions; } /** * Pre-fetch any data for the row each column has access to it. the_order global is there for bw compat. * * @param int $post_id Post ID being shown. */ protected function prepare_row_data( $post_id ) { global $the_order; if ( empty( $this->object ) || $this->object->get_id() !== $post_id ) { $this->object = $the_order = wc_get_order( $post_id ); } } /** * Render columm: order_number. */ protected function render_order_number_column() { $buyer = ''; if ( $this->object->get_billing_first_name() || $this->object->get_billing_last_name() ) { /* translators: 1: first name 2: last name */ $buyer = trim( sprintf( _x( '%1$s %2$s', 'full name', 'woocommerce' ), $this->object->get_billing_first_name(), $this->object->get_billing_last_name() ) ); } elseif ( $this->object->get_billing_company() ) { $buyer = trim( $this->object->get_billing_company() ); } elseif ( $this->object->get_customer_id() ) { $user = get_user_by( 'id', $this->object->get_customer_id() ); $buyer = ucwords( $user->display_name ); } if ( $this->object->get_status() === 'trash' ) { echo '#' . esc_attr( $this->object->get_order_number() ) . ' ' . esc_html( $buyer ) . ''; } else { echo '' . esc_html( __( 'Preview', 'woocommerce' ) ) . ''; echo '#' . esc_attr( $this->object->get_order_number() ) . ' ' . esc_html( $buyer ) . ''; } } /** * Render columm: order_status. */ protected function render_order_status_column() { $tooltip = ''; $comment_count = absint( get_comment_count( $this->object->get_id() )['approved'] ); if ( $comment_count ) { $latest_notes = wc_get_order_notes( array( 'order_id' => $this->object->get_id(), 'limit' => 1, 'orderby' => 'date_created_gmt', ) ); $latest_note = current( $latest_notes ); if ( isset( $latest_note->content ) && 1 === $comment_count ) { $tooltip = wc_sanitize_tooltip( $latest_note->content ); } elseif ( isset( $latest_note->content ) ) { /* translators: %d: notes count */ $tooltip = wc_sanitize_tooltip( $latest_note->content . '
' . sprintf( _n( 'Plus %d other note', 'Plus %d other notes', ( $comment_count - 1 ), 'woocommerce' ), $comment_count - 1 ) . '' ); } else { /* translators: %d: notes count */ $tooltip = wc_sanitize_tooltip( sprintf( _n( '%d note', '%d notes', $comment_count, 'woocommerce' ), $comment_count ) ); } } if ( $tooltip ) { printf( '%s', esc_attr( sanitize_html_class( 'status-' . $this->object->get_status() ) ), wp_kses_post( $tooltip ), esc_html( wc_get_order_status_name( $this->object->get_status() ) ) ); } else { printf( '%s', esc_attr( sanitize_html_class( 'status-' . $this->object->get_status() ) ), esc_html( wc_get_order_status_name( $this->object->get_status() ) ) ); } } /** * Render columm: order_date. */ protected function render_order_date_column() { $order_timestamp = $this->object->get_date_created()->getTimestamp(); if ( $order_timestamp > strtotime( '-1 day', current_time( 'timestamp', true ) ) ) { $show_date = sprintf( _x( '%s ago', '%s = human-readable time difference', 'woocommerce' ), human_time_diff( $this->object->get_date_created()->getTimestamp(), current_time( 'timestamp', true ) ) ); } else { $show_date = $this->object->get_date_created()->date_i18n( apply_filters( 'woocommerce_admin_order_date_format', get_option( 'date_format' ) ) ); } printf( '', esc_attr( $this->object->get_date_created()->date( 'c' ) ), esc_html( $this->object->get_date_created()->date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ) ) ), esc_html( $show_date ) ); } /** * Render columm: order_total. */ protected function render_order_total_column() { if ( $this->object->get_payment_method_title() ) { /* translators: %s: method */ echo '' . wp_kses_post( $this->object->get_formatted_order_total() ) . ''; } else { echo wp_kses_post( $this->object->get_formatted_order_total() ); } } /** * Render columm: order_actions. */ protected function render_order_actions_column() { echo '

'; do_action( 'woocommerce_admin_order_actions_start', $this->object ); $actions = array(); if ( $this->object->has_status( array( 'pending', 'on-hold' ) ) ) { $actions['processing'] = array( 'url' => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_status&status=processing&order_id=' . $this->object->get_id() ), 'woocommerce-mark-order-status' ), 'name' => __( 'Processing', 'woocommerce' ), 'action' => 'processing', ); } if ( $this->object->has_status( array( 'pending', 'on-hold', 'processing' ) ) ) { $actions['complete'] = array( 'url' => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_status&status=completed&order_id=' . $this->object->get_id() ), 'woocommerce-mark-order-status' ), 'name' => __( 'Complete', 'woocommerce' ), 'action' => 'complete', ); } $actions = apply_filters( 'woocommerce_admin_order_actions', $actions, $this->object ); foreach ( $actions as $action ) { printf( '%s', esc_attr( $action['action'] ), esc_url( $action['url'] ), esc_attr( $action['name'] ), esc_attr( $action['name'] ) ); } do_action( 'woocommerce_admin_order_actions_end', $this->object ); echo '

'; } /** * Render columm: billing_address. */ protected function render_billing_address_column() { if ( $address = $this->object->get_formatted_billing_address() ) { echo esc_html( preg_replace( '##i', ', ', $address ) ); } else { echo '–'; } } /** * Render columm: shipping_address. */ protected function render_shipping_address_column() { if ( $address = $this->object->get_formatted_shipping_address() ) { echo '' . esc_html( preg_replace( '##i', ', ', $address ) ) . ''; } else { echo '–'; } } /** * Template for order preview. * * @since 3.3.0 */ public function order_preview_template() { ?> update_status( $new_status, __( 'Order status changed by bulk edit:', 'woocommerce' ), true ); do_action( 'woocommerce_order_edit_status', $id, $new_status ); $changed++; } $redirect_to = add_query_arg( array( 'post_type' => $this->list_table_type, $report_action => true, 'changed' => $changed, 'ids' => join( ',', $ids ), ), $redirect_to ); return esc_url_raw( $redirect_to ); } /** * Show confirmation message that order status changed for number of orders. */ public function bulk_admin_notices() { global $post_type, $pagenow; // Bail out if not on shop order list page. if ( 'edit.php' !== $pagenow || 'shop_order' !== $post_type ) { return; } $order_statuses = wc_get_order_statuses(); // Check if any status changes happened. foreach ( $order_statuses as $slug => $name ) { if ( isset( $_REQUEST[ 'marked_' . str_replace( 'wc-', '', $slug ) ] ) ) { // WPCS: input var ok. $number = isset( $_REQUEST['changed'] ) ? absint( $_REQUEST['changed'] ) : 0; // WPCS: input var ok. /* translators: %s: orders count */ $message = sprintf( _n( '%d order status changed.', '%d order statuses changed.', $number, 'woocommerce' ), number_format_i18n( $number ) ); echo '

' . esc_html( $message ) . '

'; break; } } } /** * See if we should render search filters or not. */ public function restrict_manage_posts() { global $typenow; if ( in_array( $typenow, wc_get_order_types( 'order-meta-boxes' ), true ) ) { $this->render_filters(); } } /** * Render any custom filters and search inputs for the list table. */ protected function render_filters() { $user_string = ''; $user_id = ''; if ( ! empty( $_GET['_customer_user'] ) ) { // WPCS: input var ok. $user_id = absint( $_GET['_customer_user'] ); // WPCS: input var ok, sanitization ok. $user = get_user_by( 'id', $user_id ); /* translators: 1: user display name 2: user ID 3: user email */ $user_string = sprintf( esc_html__( '%1$s (#%2$s – %3$s)', 'woocommerce' ), $user->display_name, absint( $user->ID ), $user->user_email ); } ?> query_filters( $query_vars ); } return $query_vars; } /** * Handle any custom filters. * * @param array $query_vars Query vars. * @return array */ protected function query_filters( $query_vars ) { global $wp_post_statuses; // Filter the orders by the posted customer. if ( ! empty( $_GET['_customer_user'] ) ) { // WPCS: input var ok. // @codingStandardsIgnoreStart $query_vars['meta_query'] = array( array( 'key' => '_customer_user', 'value' => (int) $_GET['_customer_user'], // WPCS: input var ok, sanitization ok. 'compare' => '=', ), ); // @codingStandardsIgnoreEnd } // Sorting. if ( isset( $query_vars['orderby'] ) ) { if ( 'order_total' === $query_vars['orderby'] ) { // @codingStandardsIgnoreStart $query_vars = array_merge( $query_vars, array( 'meta_key' => '_order_total', 'orderby' => 'meta_value_num', ) ); // @codingStandardsIgnoreEnd } } // Status. if ( ! isset( $query_vars['post_status'] ) ) { $post_statuses = wc_get_order_statuses(); foreach ( $post_statuses as $status => $value ) { if ( isset( $wp_post_statuses[ $status ] ) && false === $wp_post_statuses[ $status ]->show_in_admin_all_list ) { unset( $post_statuses[ $status ] ); } } $query_vars['post_status'] = array_keys( $post_statuses ); } return $query_vars; } /** * Change the label when searching orders. * * @param mixed $query Current search query. * @return string */ public function search_label( $query ) { global $pagenow, $typenow; if ( 'edit.php' !== $pagenow || 'shop_order' !== $typenow || ! get_query_var( 'shop_order_search' ) || ! isset( $_GET['s'] ) ) { // WPCS: input var ok. return $query; } return wc_clean( wp_unslash( $_GET['s'] ) ); // WPCS: input var ok, sanitization ok. } /** * Query vars for custom searches. * * @param mixed $public_query_vars Array of query vars. * @return array */ public function add_custom_query_var( $public_query_vars ) { $public_query_vars[] = 'shop_order_search'; return $public_query_vars; } /** * Search custom fields as well as content. * * @param WP_Query $wp Query object. */ public function search_custom_fields( $wp ) { global $pagenow; if ( 'edit.php' !== $pagenow || empty( $wp->query_vars['s'] ) || 'shop_order' !== $wp->query_vars['post_type'] || ! isset( $_GET['s'] ) ) { // WPCS: input var ok. return; } $post_ids = wc_order_search( wc_clean( wp_unslash( $_GET['s'] ) ) ); // WPCS: input var ok, sanitization ok. if ( ! empty( $post_ids ) ) { // Remove "s" - we don't want to search order name. unset( $wp->query_vars['s'] ); // so we know we're doing this. $wp->query_vars['shop_order_search'] = true; // Search by found posts. $wp->query_vars['post__in'] = array_merge( $post_ids, array( 0 ) ); } } } new WC_Admin_List_Table_Orders();