get_view_order();
if ( false === $order ) {
return;
}
$can_view = false;
if ( current_user_can( ADMIN_ROLE ) ) {
$can_view = true;
} elseif ( (int) $order->get_user_id() === get_current_user_id() ) {
$can_view = true;
}
if ( ! $can_view ) {
return;
}
if ( ! isset( $order ) ) {
echo esc_html__( 'Invalid order', 'learnpress' );
return;
}
$args = array(
'id_url' => 'lp-profile-view-order-details',
'order_id' => $order->get_id(),
'paged' => 1,
);
$call_back = array(
'class' => self::class,
'method' => 'render_order_details',
);
echo TemplateAJAX::load_content_via_ajax( $args, $call_back );
}
/**
* Allow callback for AJAX.
*
* @use self::render_order_details
*
* @param array $callbacks
*
* @return array
*/
public function allow_callback( array $callbacks ): array {
$callbacks[] = get_class( $this ) . ':render_order_details';
return $callbacks;
}
/**
* Render order details content via AJAX.
*
* @param array $args
*
* @return stdClass
* @since 4.3.2
* @version 1.0.1
*/
public static function render_order_details( array $args ): stdClass {
$content = new stdClass();
$order_id = $args['order_id'] ?? 0;
$paged = $args['paged'] ?? 1;
$can_view = false;
$user_id = get_current_user_id();
if ( current_user_can( UserModel::ROLE_ADMINISTRATOR ) ) {
$can_view = true;
} else {
$order = learn_press_get_order( $order_id );
if ( $order && (int) $order->get_user_id() === $user_id ) {
$can_view = true;
}
}
if ( ! $can_view ) {
return $content;
}
$limit = 10;
$lp_order_db = LP_Order_DB::getInstance();
$filter = new LP_Filter();
$filter->limit = $limit;
$filter->page = $paged;
$total_row = 0;
$items = $lp_order_db->get_items( $filter, $order_id, $total_row );
$html_items = '';
$order = learn_press_get_order( $order_id );
if ( empty( $items ) ) {
$html_items = sprintf(
'
| %s |
',
__( 'No items found', 'learnpress' )
);
} else {
foreach ( $items as $item ) {
$item_course_id_meta = learn_press_get_order_item_meta( $item->order_item_id, '_course_id' );
// For old data, the data not migrated yet to new column.
if ( ( empty( $item->item_type ) || empty( $item->item_id ) )
&& ! empty( $item_course_id_meta ) ) {
$item->item_id = $item_course_id_meta;
$item->item_type = LP_COURSE_CPT;
}
$html_items .= self::order_item_row_html( $order, $item );
}
}
$total_pages = $lp_order_db::get_total_pages( $limit, $total_row );
$html_pagination = Template::instance()->html_pagination(
[
'total_pages' => $total_pages,
'paged' => $paged,
]
);
if ( ! empty( $html_pagination ) ) {
$html_pagination = sprintf(
'
| %s |
',
$html_pagination
);
}
$section = array(
'header' => sprintf(
'%s
',
esc_html__( 'Order Details', 'learnpress' )
),
'table' => '',
'table-header' => self::table_header(),
'table-body' => '',
'items' => $html_items,
'pagination' => $html_pagination,
'do_action_items' => self::action_table_items( $order ),
'table-body-end' => '',
'table-footer' => self::table_footer( $order ),
'table-end' => '
',
'footer' => self::order_detail_content_footer( $order ),
);
$content->content = Template::combine_components( $section );
return $content;
}
public static function table_header() {
$section = array(
'wrap' => '',
'row' => sprintf(
'
| %s |
%s |
',
__( 'Item', 'learnpress' ),
__( 'Total', 'learnpress' )
),
'wrap-end' => '',
);
return Template::combine_components( $section );
}
/**
* HTML for table footer in order detail page.
*
* @param LP_Order $order
*
* @return string
* @since 4.3.2
* @version 1.0.1
*/
public static function table_footer( $order ): string {
ob_start();
do_action( 'learn-press/order/items-table-foot', $order );
$html_after_subtotal_row = ob_get_clean();
$section = array(
'wrap' => '',
'subtotal_row' => sprintf(
'| %s | %s |
',
esc_html__( 'Subtotal', 'learnpress' ),
esc_html( $order->get_formatted_order_subtotal() )
),
'action' => $html_after_subtotal_row,
'total_row' => sprintf(
'| %s | %s |
',
esc_html__( 'Total', 'learnpress' ),
esc_html( $order->get_formatted_order_total() )
),
'wrap-end' => '',
);
return Template::combine_components( $section );
}
public static function action_table_items( $order ) {
ob_start();
do_action( 'learn-press/order/items-table', $order );
return ob_get_clean();
}
/**
* HTMl for each order item row in order detail page.
*
* @param LP_Order $order
* @param object $item
*
* @return string
* @since 4.3.2
* @version 1.0.1
*/
public static function order_item_row_html( $order, $item ): string {
$total = learn_press_get_order_item_meta( $item->order_item_id, '_total' );
$total = ! empty( $total ) ? $total : 0;
$quantity = learn_press_get_order_item_meta( $item->order_item_id, '_quantity' );
$currency_symbol = learn_press_get_currency_symbol( $order->get_currency() ?? learn_press_get_currency() );
$item_label = esc_html( $item->order_item_name );
if ( $item->item_type === LP_COURSE_CPT ) {
$item_label = sprintf(
'%s',
esc_url_raw( get_permalink( $item->item_id ) ),
esc_html( $item->order_item_name )
);
}
$item_label = apply_filters(
'learn-press/profile/order/item-label',
$item_label,
(array) $item,
$order
);
$section = apply_filters(
'learn-press/profile/order/item-row-html',
array(
'wrap' => '',
'name-cell' => sprintf(
'| %s | ',
$item_label
),
'total-cell' => sprintf(
'%s | ',
learn_press_format_price( $total, $currency_symbol )
),
'wrap-end' => '
',
)
);
return Template::combine_components( $section );
}
/**
* HTML content footer, below table list items for order detail page.
*
* @param LP_Order $order
*
* @return string
* @since 4.3.2
* @version 1.0.1
*/
public static function order_detail_content_footer( $order ): string {
$section = array(
'order_key' => sprintf(
'%s %s
',
esc_html__( 'Order key:', 'learnpress' ),
esc_html( $order->get_order_key() )
),
'order_status' => sprintf(
'
%s
%s
',
esc_html__( 'Order status:', 'learnpress' ),
esc_attr( $order->get_status() ),
wp_kses_post( $order->get_order_status_html() )
),
);
return Template::combine_components( $section );
}
}