1
votes

What I would like to do is a this:

A customer buys a product. Instead of "add to cart" it would show "See Digital Product" and have a custom link to a specific page.

I was looking in the database for WooCommerce and trying to figure out how I would know an item is already purchased so I can figure out how to make a function do this automatically:

SELECT * FROM wp_woocommerce_payment_tokens

token_id    gateway_id  token   user_id     type    is_default 

SELECT * FROM wp_woocommerce_order_items

order_item_id   order_item_name     order_item_type     order_id 

But I couldn't figure out their logic yet or the right function in WordPress to make this happen.

The only function I could find online is for redirects but this is only right when you purchase the item, not if you go back to the page where you already bought the item:

add_action( 'template_redirect', 'wc_custom_redirect_after_purchase' );
function wc_custom_redirect_after_purchase() {
   global $wp;

   if ( is_checkout() && ! empty( $wp->query_vars['order-received'] ) ) {
        wp_redirect( get_permalink( get_page_by_title( "About" )->ID ) );
        exit;
    }
} 

Please lead me in the right direction.

1
just to understand your question more, you want to check if specific customer who should be logged in if he brought this product then you want to change the add to cart button am right?kashalo
Yes. If they bought an item, I can check for that then change the button accordingly.Sol

1 Answers

1
votes

The following functions will check if a customer has already bought a product and if it is the case the add to cart button will be replaced by a custom "See Digital Product" linked button to "About" page.

The first function code is made from wc_customer_bought_product() source code, in a lighter way. The code will check for logged in users only, returning false for unlogged users.

function has_bought_item( $product_id ) {
    global $wpdb;

    if( ! is_user_logged_in() )
        return false;

    $customer_id = get_current_user_id();
    $statuses      = array_map( 'esc_sql', wc_get_is_paid_statuses() );

    // Count the number of products
    $count_query = $wpdb->get_var( "
        SELECT COUNT(woim.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 woi ON p.ID = woi.order_id
        INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS woim ON woi.order_item_id = woim.order_item_id
        WHERE p.post_status IN ( 'wc-" . implode( "','wc-", $statuses ) . "' )
        AND pm.meta_key = '_customer_user' AND pm.meta_value = $customer_id
        AND woim.meta_key IN ( '_product_id', '_variation_id' )
        AND woim.meta_value = $product_id
    " );

    // Return true boolean value if count is higher than 0, if not false
    return $count_query > 0 ? true : false;
}

// Shop and archives - Replace add to cart ajax button to a custom linked button
add_filter( 'woocommerce_loop_add_to_cart_link', 'replace_loop_add_to_cart', 20, 2 );
function replace_loop_add_to_cart( $html, $product ) {
    if( has_bought_item( $product->get_id() ) ) {
        $page = get_page_by_title( "About" );
        if ( ! is_object($page) )
            return $html;
        $link = get_permalink( $page->ID );
        $text = __("See Digital Product", "woocommerce");
        $html = '<a href="' . $link . '" class="button alt add_to_cart_button">' . $text . '</a>';
    }
    return $html;
}

// Single products: Replacing the button add to cart by a custom button on single product pages
add_action( 'woocommerce_single_product_summary', 'replace_single_add_to_cart_button', 1 );
function replace_single_add_to_cart_button() {
    global $product;

    if( has_bought_item( $product->get_id() ) && get_page_by_title( "About" ) ) {
        // For variable product types (keeping attribute select fields)
        if( $product->is_type( 'variable' ) ) {
            remove_action( 'woocommerce_single_variation', 'woocommerce_single_variation_add_to_cart_button', 20 );
            add_action( 'woocommerce_single_product_summary', 'custom_single_add_to_cart_button', 20 );
        }
        // For all other product types
        else {
            remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
            add_action( 'woocommerce_single_product_summary', 'custom_single_add_to_cart_button', 30 );
        }
    }
}

// Utility function: displays a custom  button replacement
function custom_single_add_to_cart_button() {
    $page = get_page_by_title( "About" );
    if ( ! is_object($page) )
        return;
    $link = get_permalink( $page->ID );
    $text = __("See Digital Product", "woocommerce");
    echo '<a href="' . $link . '" class="button alt add_to_cart_button">' . $text . '</a>';
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.

based on: