id = 'order_custom_statuses'; $this->short_desc = __( 'Order Custom Statuses', 'woocommerce-jetpack' ); $this->desc = __( 'Custom statuses for WooCommerce orders.', 'woocommerce-jetpack' ); $this->link_slug = 'woocommerce-order-custom-statuses'; parent::__construct(); $this->add_tools( array( 'custom_statuses' => array( 'title' => __( 'Custom Statuses', 'woocommerce-jetpack' ), 'desc' => __( 'Tool lets you add, edit or delete any custom status for WooCommerce orders.', 'woocommerce-jetpack' ), ), ) ); if ( $this->is_enabled() ) { add_filter( 'wc_order_statuses', array( $this, 'add_custom_statuses_to_filter' ), PHP_INT_MAX ); add_action( 'init', array( $this, 'register_custom_post_statuses' ) ); add_action( 'admin_head', array( $this, 'hook_statuses_icons_css' ) ); if ( 'yes' === apply_filters( 'booster_option', 'no', get_option( 'wcj_orders_custom_statuses_column_colored', 'no' ) ) ) { add_action( 'admin_head', array( $this, 'hook_statuses_column_css' ) ); } add_filter( 'woocommerce_default_order_status', array( $this, 'set_default_order_status' ), PHP_INT_MAX ); if ( 'yes' === get_option( 'wcj_orders_custom_statuses_add_to_reports' ) ) { add_filter( 'woocommerce_reports_order_statuses', array( $this, 'add_custom_order_statuses_to_reports' ), PHP_INT_MAX ); } if ( 'yes' === get_option( 'wcj_orders_custom_statuses_add_to_bulk_actions' ) ) { add_action( 'admin_footer', array( $this, 'bulk_admin_footer' ), 11 ); } if ( 'yes' === apply_filters( 'booster_option', 'no', get_option( 'wcj_orders_custom_statuses_add_to_order_list_actions', 'no' ) ) ) { add_filter( 'woocommerce_admin_order_actions', array( $this, 'add_custom_status_actions_buttons' ), PHP_INT_MAX, 2 ); add_action( 'admin_head', array( $this, 'add_custom_status_actions_buttons_css' ) ); } if ( 'hide' != apply_filters( 'booster_option', 'hide', get_option( 'wcj_orders_custom_statuses_processing_and_completed_actions', 'hide' ) ) ) { add_filter( 'woocommerce_admin_order_actions', array( $this, 'add_custom_status_to_processing_and_completed_actions' ), PHP_INT_MAX, 2 ); } // Is order editable if ( 'yes' === apply_filters( 'booster_option', 'no', get_option( 'wcj_orders_custom_statuses_is_order_editable', 'no' ) ) ) { add_filter( 'wc_order_is_editable', array( $this, 'add_custom_order_statuses_to_order_editable' ), PHP_INT_MAX, 2 ); } // "Order Statuses" tool include_once( 'tools/class-wcj-order-statuses-tool.php' ); $this->custom_statuses_tool = new WCJ_Order_Statuses_Tool( 'custom_statuses', $this ); } } /** * get_custom_order_statuses. * * @version 3.1.2 * @since 3.1.2 */ function get_custom_order_statuses( $cut_prefix = false ) { $orders_custom_statuses = get_option( 'wcj_orders_custom_statuses_array', '' ); if ( empty( $orders_custom_statuses ) ) { return array(); } else { if ( $cut_prefix ) { $orders_custom_statuses_no_prefix = array(); foreach( $orders_custom_statuses as $status => $status_name ) { $orders_custom_statuses_no_prefix[ substr( $status, 3 ) ] = $status_name; } return $orders_custom_statuses_no_prefix; } else { return $orders_custom_statuses; } } } /** * add_custom_order_statuses_to_order_editable. * * @version 3.1.2 * @since 3.1.2 */ function add_custom_order_statuses_to_order_editable( $is_editable, $_order ) { return ( in_array( $_order->get_status(), array_keys( $this->get_custom_order_statuses( true ) ) ) ? true : $is_editable ); } /** * add_custom_status_to_processing_and_completed_actions. * * @version 3.2.2 * @since 2.8.0 */ function add_custom_status_to_processing_and_completed_actions( $actions, $_order ) { $custom_order_statuses = $this->get_custom_order_statuses(); if ( ! empty( $custom_order_statuses ) && is_array( $custom_order_statuses ) ) { $custom_order_statuses_without_wc_prefix = array(); foreach ( $custom_order_statuses as $slug => $label ) { $custom_order_statuses_without_wc_prefix[] = substr( $slug, 3 ); } global $post; $default_actions = array(); $show = apply_filters( 'booster_option', 'hide', get_option( 'wcj_orders_custom_statuses_processing_and_completed_actions', 'hide' ) ); if ( ( 'show_both' === $show || 'show_processing' === $show ) && $_order->has_status( array_merge( array( 'pending', 'on-hold' ), $custom_order_statuses_without_wc_prefix ) ) ) { $default_actions['processing'] = array( 'url' => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_status&status=processing&order_id=' . $post->ID ), 'woocommerce-mark-order-status' ), 'name' => __( 'Processing', 'woocommerce' ), 'action' => "processing", ); } if ( ( 'show_both' === $show || 'show_complete' === $show ) && $_order->has_status( array_merge( array( 'pending', 'on-hold', 'processing' ), $custom_order_statuses_without_wc_prefix ) ) ) { $default_actions['complete'] = array( 'url' => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_status&status=completed&order_id=' . $post->ID ), 'woocommerce-mark-order-status' ), 'name' => __( 'Complete', 'woocommerce' ), 'action' => "complete", ); } $actions = array_merge( $default_actions, $actions ); } return $actions; } /** * add_custom_status_actions_buttons. * * @version 3.2.2 * @since 2.6.0 */ function add_custom_status_actions_buttons( $actions, $_order ) { $custom_order_statuses = $this->get_custom_order_statuses(); if ( ! empty( $custom_order_statuses ) && is_array( $custom_order_statuses ) ) { foreach ( $custom_order_statuses as $slug => $label ) { $custom_order_status = substr( $slug, 3 ); if ( ! $_order->has_status( array( $custom_order_status ) ) ) { // if order status is not $custom_order_status $actions[ $custom_order_status ] = array( 'url' => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_status&status=' . $custom_order_status . '&order_id=' . wcj_get_order_id( $_order ) ), 'woocommerce-mark-order-status' ), 'name' => $label, 'action' => "view " . $custom_order_status, // setting "view" for proper button CSS ); } } } return $actions; } /** * get_status_icon_data. * * @version 3.6.0 * @since 3.2.2 */ function get_status_icon_data( $status_slug_without_wc_prefix ) { $return = array( 'content' => 'e011', 'color' => '#999999', 'text_color' => '#000000', ); if ( '' != ( $icon_data = get_option( 'wcj_orders_custom_status_icon_data_' . $status_slug_without_wc_prefix, '' ) ) ) { $return['content'] = $icon_data['content']; $return['color'] = $icon_data['color']; if ( isset( $icon_data['text_color'] ) ) { $return['text_color'] = $icon_data['text_color']; } } return $return; } /** * add_custom_status_actions_buttons_css. * * @version 3.2.2 * @since 2.6.0 */ function add_custom_status_actions_buttons_css() { $custom_order_statuses = $this->get_custom_order_statuses( true ); foreach ( $custom_order_statuses as $slug => $label ) { $icon_data = $this->get_status_icon_data( $slug ); $color_style = ( 'yes' === apply_filters( 'booster_option', 'no', get_option( 'wcj_orders_custom_statuses_add_to_order_list_actions_colored', 'no' ) ) ) ? ' color: ' . $icon_data['color'] . ' !important;' : ''; echo ''; } } /** * add_custom_order_statuses_to_reports. * * @version 3.2.2 */ function add_custom_order_statuses_to_reports( $order_statuses ) { if ( is_array( $order_statuses ) && in_array( 'completed', $order_statuses ) ) { return array_merge( $order_statuses, array_keys( $this->get_custom_order_statuses( true ) ) ); } else { return $order_statuses; } } /** * set_default_order_status. * * @version 3.2.2 */ function set_default_order_status( $status ) { return ( 'wcj_no_changes' != ( $default_status = get_option( 'wcj_orders_custom_statuses_default_status', 'pending' ) ) ? $default_status : $status ); } /** * register_custom_post_statuses. * * @version 3.2.2 */ function register_custom_post_statuses() { $custom_statuses = $this->get_custom_order_statuses(); foreach ( $custom_statuses as $slug => $label ) register_post_status( $slug, array( 'label' => $label, 'public' => true, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, 'label_count' => _n_noop( $label . ' (%s)', $label . ' (%s)' ), ) ); } /** * add_custom_statuses_to_filter. * * @version 3.2.2 */ function add_custom_statuses_to_filter( $order_statuses ) { return array_merge( ( '' == $order_statuses ? array() : $order_statuses ), $this->get_custom_order_statuses() ); } /** * hook_statuses_column_css. * * @version 3.6.0 * @since 3.6.0 */ function hook_statuses_column_css() { $output = ''; $statuses = $this->get_custom_order_statuses( true ); foreach( $statuses as $status => $status_name ) { $icon_data = $this->get_status_icon_data( $status ); $output .= 'mark.order-status.status-' . $status . ' { color: ' . $icon_data['text_color'] . '; background-color: ' . $icon_data['color'] . '; }'; } if ( '' != $output ) { echo ''; } } /** * hook_statuses_icons_css. * * @version 3.2.2 */ function hook_statuses_icons_css() { $output = ''; $statuses = $this->get_custom_order_statuses( true ); foreach( $statuses as $status => $status_name ) { $icon_data = $this->get_status_icon_data( $status ); $output .= 'mark.' . $status . '::after { content: "\\' . $icon_data['content'] . '"; color: ' . $icon_data['color'] . '; }'; $output .= 'mark.' . $status . ':after {font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;' . 'line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center}'; } if ( '' != $output ) { echo ''; } } /** * create_custom_statuses_tool. * * @version 3.2.2 */ function create_custom_statuses_tool() { return $this->custom_statuses_tool->create_tool(); } /** * Add extra bulk action options to mark orders as complete or processing * * Using Javascript until WordPress core fixes: http://core.trac.wordpress.org/ticket/16031 * * @version 3.2.2 * @since 2.2.7 */ function bulk_admin_footer() { global $post_type; if ( 'shop_order' == $post_type ) { ?>