settings();
if ( empty( $settings['enabled'] ) ) {
return;
}
if ( class_exists( 'OM_CE_Repeat_Order' ) ) {
return;
}
$this->init_hooks();
}
private function settings() {
$defaults = array(
'enabled' => true,
'show_on_order_list' => true,
'create_order_note' => true,
'reactivate_order_again' => false,
'show_reorder_from_column' => false,
'cart_notice' => '',
'button_label' => '',
'allowed_statuses' => array( 'completed', 'processing' ),
);
if ( ! class_exists( 'AIEO_DMM_Settings' ) ) {
return $defaults;
}
$out = array();
foreach ( $defaults as $key => $default ) {
$out[ $key ] = AIEO_DMM_Settings::get( 'repeat_order_' . $key, $default );
}
return $out;
}
private function init_hooks() {
add_filter( 'woocommerce_my_account_my_orders_actions', array( $this, 'add_order_again_action' ), 10, 2 );
add_action( 'woocommerce_ordered_again', array( $this, 'ordered_again' ) );
add_action( 'woocommerce_thankyou', array( $this, 'create_order_note' ), 10, 1 );
add_action( 'woocommerce_cart_is_empty', array( $this, 'reset_session_flag' ) );
add_action( 'init', array( $this, 'reactivate_action' ), 9999 );
add_filter( 'woocommerce_admin_order_actions', array( $this, 'add_admin_order_action_button' ), 100, 2 );
add_filter( 'woocommerce_account_orders_columns', array( $this, 'add_my_account_orders_column' ) );
add_action( 'woocommerce_my_account_my_orders_column_reorder', array( $this, 'my_orders_reorder_column' ) );
add_filter( 'woocommerce_valid_order_statuses_for_order_again', array( $this, 'valid_order_statuses_for_order_again' ), 10 );
}
public function reactivate_action() {
$settings = $this->settings();
if ( ! empty( $settings['reactivate_order_again'] ) ) {
add_action( 'woocommerce_order_details_after_order_table', 'woocommerce_order_again_button', 9999 );
}
}
public function ordered_again( $order_id ) {
if ( ! WC()->session ) {
return;
}
WC()->session->set( 'reorder_from_orderid', $order_id );
$settings = $this->settings();
$notice = isset( $settings['cart_notice'] ) ? $settings['cart_notice'] : '';
if ( ! empty( $notice ) ) {
wc_add_notice( $notice, 'notice' );
}
}
public function create_order_note( $order_id ) {
if ( ! WC()->session ) {
return;
}
$reorder_id = WC()->session->get( 'reorder_from_orderid' );
if ( empty( $reorder_id ) ) {
return;
}
$order = wc_get_order( $order_id );
if ( ! is_a( $order, 'WC_Order' ) ) {
WC()->session->set( 'reorder_from_orderid', '' );
return;
}
$order->add_meta_data( '_reorder_from_id', $reorder_id, true );
$order->save();
$settings = $this->settings();
if ( empty( $settings['create_order_note'] ) ) {
WC()->session->set( 'reorder_from_orderid', '' );
return;
}
$url = get_edit_post_link( $reorder_id );
$note = sprintf(
wp_kses(
__( 'This is a reorder of order #%2$s.', 'ai-eshop-optimizer' ),
array(
'a' => array(
'href' => array(),
),
)
),
esc_url( $url ),
(int) $reorder_id
);
$order->add_order_note( apply_filters( 'aieo_repeat_order_note', $note, $reorder_id, $order_id ) );
WC()->session->set( 'reorder_from_orderid', '' );
}
public function add_order_again_action( $actions, $order ) {
$settings = $this->settings();
if ( empty( $settings['show_on_order_list'] ) ) {
return $actions;
}
if ( ! $order || ! is_user_logged_in() ) {
return $actions;
}
$valid_statuses = $this->get_allowed_statuses();
if ( ! $order->has_status( $valid_statuses ) ) {
return $actions;
}
$label = isset( $settings['button_label'] ) ? trim( (string) $settings['button_label'] ) : '';
if ( $label === '' ) {
$label = __( 'Order again', 'woocommerce' );
}
$actions['order-again'] = array(
'url' => wp_nonce_url( add_query_arg( 'order_again', $order->get_id() ), 'woocommerce-order_again' ),
'name' => $label,
);
return $actions;
}
private function get_allowed_statuses() {
$settings = $this->settings();
$statuses = isset( $settings['allowed_statuses'] ) ? $settings['allowed_statuses'] : array( 'completed', 'processing' );
if ( empty( $statuses ) ) {
$statuses = array( 'completed', 'processing' );
}
return (array) $statuses;
}
public function valid_order_statuses_for_order_again( $statuses ) {
return $this->get_allowed_statuses();
}
public function add_admin_order_action_button( $actions, $order ) {
if ( ! is_a( $order, 'WC_Order' ) ) {
return $actions;
}
$reorder_from = $order->get_meta( '_reorder_from_id', true );
if ( $reorder_from > 0 ) {
$actions['pr_repeat'] = array(
'url' => wp_nonce_url( admin_url( 'post.php?post=' . (int) $reorder_from . '&action=edit' ), '' ),
'name' => __( 'Show original order', 'ai-eshop-optimizer' ),
'action' => 'view-original-order',
);
}
return $actions;
}
public function add_my_account_orders_column( $columns ) {
$settings = $this->settings();
if ( empty( $settings['show_reorder_from_column'] ) ) {
return $columns;
}
$new_columns = array();
foreach ( $columns as $key => $name ) {
if ( 'order-actions' === $key ) {
$new_columns['reorder'] = __( 'Reorder from', 'ai-eshop-optimizer' );
}
$new_columns[ $key ] = $name;
}
return $new_columns;
}
public function my_orders_reorder_column( $order ) {
$settings = $this->settings();
if ( empty( $settings['show_reorder_from_column'] ) ) {
return;
}
if ( ! is_a( $order, 'WC_Order' ) ) {
return;
}
$reorder_from = $order->get_meta( '_reorder_from_id', true );
if ( $reorder_from > 0 ) {
$reorder = wc_get_order( $reorder_from );
if ( $reorder ) {
?>
get_order_number() ) );
?>
session ) {
WC()->session->set( 'reorder_from_orderid', '' );
}
}
}
}