簡體   English   中英

從 WooCommerce 中的最后訂單中獲取產品

[英]Get products from last orders in WooCommerce

我想顯示用戶過去訂購的最后 10 種產品。

問題是,我不知道最后一個訂單中有多少產品。 所以我可能需要獲得不止一份訂單。

我想顯示購物車中的所有內容。 讓用戶再次購買產品。 稍后我想排除當前購物車中的產品。

對於最后一個訂單,我在這里找到了一個片段: https ://stackoverflow.com/a/71501798/1788961

// For logged in users only
if ( is_user_logged_in() ) {

    // The current user ID
    $user_id = get_current_user_id();

    // Get the last WC_Order Object instance from current customer
    $last_order = wc_get_customer_last_order( $user_id );

    // NOT empty
    if ( ! empty( $last_order ) ) {
        // Initalize
        $product_ids = array();

        // Loop
        foreach ( $last_order->get_items() as $item ) {
            // Get product ID
            $product_id = $item->get_product_id();
            $product_ids[] = $product_id;
        }

        echo '<pre>';
        var_dump( $product_ids );
        echo '</pre>';
    }
}

有沒有辦法將功能擴展到更多訂單?

您確實可以使用wc_get_orders() ,您將在其中根據參數檢索訂單,例如用戶 ID 和按日期排序。

另請注意,使用的限制為 10。 這是因為我們可以假設每個訂單至少包含 1 件產品。 因此,如果您想收集 10 個產品,則限制永遠不會超過 10 個訂單:

// Args
$args = array(
    'customer_id'   => get_current_user_id(),
    'limit'         => 10,
    'orderby'       => 'date',
    'order'         => 'DESC',
    'status'        => array( 'wc-on-hold','wc-processing','wc-completed' ),
);

// Get orders
$orders = wc_get_orders( $args );

// NOT empty
if ( ! empty ( $orders ) ) {
    // Initalize
    $product_ids = array();

    foreach ( $orders as $order ) {
        // Loop through order items
        foreach ( $order->get_items() as $item ) {
            // Get product ID
            $product_id = $item->get_product_id();

            // Limit of 10 products
            if ( count( $product_ids ) < 10 ) {
                // Push to array
                $product_ids[] = $product_id;
            } else {
                break;
            }
        }
    }

    // The output
    echo '<pre>', print_r( $product_ids, 1 ), '</pre>';
}

一個更輕、更快的解決方案是使用自定義 SQL 查詢:

global $wpdb;

$current_user = wp_get_current_user();
$customer_email = $current_user->user_email;

$result = $wpdb->get_col( "
    SELECT oim.meta_value FROM {$wpdb->prefix}posts AS p
    INNER JOIN {$wpdb->prefix}postmeta AS pm ON p.ID = pm.post_id
    INNER JOIN {$wpdb->prefix}woocommerce_order_items AS oi ON p.ID = oi.order_id
    INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS oim ON oi.order_item_id = oim.order_item_id
    WHERE p.post_status IN ( 'wc-on-hold','wc-processing','wc-completed' )
    AND pm.meta_key = '_billing_email'
    AND pm.meta_value = '$customer_email'
    AND oim.meta_key = '_product_id'
    AND oim.meta_value != 0
    ORDER BY p.post_date DESC LIMIT 0, 10
" );

// The raw output
echo '<pre>', print_r( $result, 1 ), '</pre>';

無論您喜歡哪個選項。 在任何情況下,這些都可以通過變量、可變產品或基於多個訂單狀態進行擴展。 排除重復產品等。所以這取決於您的需求

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM