1

これまで、特定の製品のバリエーションを追加するまで、うまく機能している次のコードを使用してきました。

<?php if ( is_user_logged_in() ) if ( wpsc_has_purchases() )    if ( wpsc_bought_product(wpsc_the_product_id()) ) $bought_product = true; else $bought_product = false; ?>

コードの後半で、buyed_product変数を使用して、製品が購入されたかどうかを確認し、特別なメッセージを出力できるようにしました。

私の問題:多くの製品にバリエーションを入れているため、このコードは機能しなくなり、バリエーションのない製品でのみ機能します...何が間違っているのですか?(ところで、wp eコマースの使用を考えている場合は、使用しないでください-それはジャンクです)

wpsc_bought_productのコードは次のとおりです。

function wpsc_bought_product($prodid) {
    global $wpdb, $user_ID, $wpsc_purchlog_statuses, $gateway_checkout_form_fields, $purchase_log, $col_count;

    do_action( 'wpsc_pre_purchase_logs' );

    foreach ( (array)$purchase_log as $purchase ) {


        // 2 = order received, 3 = accepted payment
        if ($purchase['processed'] == 2) {

            $cartsql = $wpdb->prepare( "SELECT * FROM `" . WPSC_TABLE_CART_CONTENTS . "` WHERE `purchaseid`= %d", $purchase['id'] );
            $cart_log = $wpdb->get_results( $cartsql, ARRAY_A );
            if ( $cart_log != null ) {
                foreach ( (array)$cart_log as $cart_row ) {

                    //if product is in the order
                    if ($prodid == $cart_row['prodid'])
                        return true;

                }
            }

        }
    }

    return false;
}

データベースを見ると、製品のバリエーションごとに異なるIDがあることがわかります。そのため、購入済みとして登録されません。では、バリエーションが購入されたかどうかを確認するにはどうすればよいですか?

4

1 に答える 1

3

誰かがこの質問に出くわした場合に備えて、私は答えを見つけました.

function wpsc_bought_product($prodid) {
    global $wpdb, $user_ID, $wpsc_purchlog_statuses, $gateway_checkout_form_fields, $purchase_log, $col_count;

    $prod_children_sql = $wpdb->prepare( "SELECT `id` FROM `wp_posts` WHERE `post_parent`= %d", $prodid );
    $prod_children_result = $wpdb->get_results( $prod_children_sql, ARRAY_A );

    $i=0;
    foreach($prod_children_result as $inner) {
        $prod_children[$i] = current($inner);
        $i++;        
    }

    do_action( 'wpsc_pre_purchase_logs' );

    foreach ( (array)$purchase_log as $purchase ) {


        // 2 = order received, 3 = accepted payment - probably 3 should be here
        if ($purchase['processed'] == 2) {

            $cartsql = $wpdb->prepare( "SELECT * FROM `" . WPSC_TABLE_CART_CONTENTS . "` WHERE `purchaseid`= %d", $purchase['id'] );
            $cart_log = $wpdb->get_results( $cartsql, ARRAY_A );
            if ( $cart_log != null ) {
                foreach ( (array)$cart_log as $cart_row ) {

                    //if product is in the order
                    if ($prod_children != null) {
                        if (in_array($cart_row['prodid'],$prod_children)) {
                            return true;
                        }
                    } else if ($prodid == $cart_row['prodid']) {                    
                        return true;
                    }

                }
            }

        }
    }

    return false;
}
于 2012-06-03T22:43:40.707 に答える