Change “add to cart” button for purchased products in Woocommerce

后端 未结 1 863
感情败类
感情败类 2021-01-26 19:38

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 pa

相关标签:
1条回答
  • 2021-01-26 19:48

    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:

    • Checking if customer has already bought something in WooCommerce
    • Check if a customer has purchased a specific products in WooCommerce
    0 讨论(0)
提交回复
热议问题