Search code examples
phpwordpresswoocommerceproducthook-woocommerce

Replace add to cart button for unlogged users in WooCommerce


In WooCommerce, I don't want to show product add to cart button for unlogged users. I am using the code bellow changing add to cart button:

// Replace add to cart button with link for users who aren't logged in
add_filter( 'woocommerce_loop_add_to_cart_link', 'replace_loop_add_to_cart_button', 10, 2 );
function replace_loop_add_to_cart_button( $button, $product  ) {
    // Logged in users see add to cart button
    if( is_user_logged_in() ) return;

    $button_text = __( "Sign up for pricing", "woocommerce" );
    $button = '<div><a class="button" href="https://example.com/link">' . $button_text . '</a></div>';

    return $button;
}

It works on all pages except on single product pages. The product page continues to show the default add to cart button. What am I missing?


Solution

  • Update: Added button link on single products to My account login URL

    The following will do it all you want in a better way (replacing your code):

    // Replacing the button add to cart by a link to the product page in Shop and archives pages
    add_filter( 'woocommerce_loop_add_to_cart_link', 'replace_loop_add_to_cart_button', 10, 2 );
    function replace_loop_add_to_cart_button( $button, $product  ) {
        // Only for unlogged user
        if( ! is_user_logged_in() ){
            $button_text = __( "Sign up for pricing", "woocommerce" );
            // $button_link = get_permalink( wc_get_page_id( 'myaccount' ) ); // Login Url
            $button_link = $product->get_permalink(); // Single product Url
            $button = '<a class="button" href="' . $product->get_permalink() . '">' . $button_text . '</a>';
        }
    
        return $button;
    }
    
    // Replacing the single product button add to cart by a custom button
    add_action( 'woocommerce_single_product_summary', 'disabled_single_add_to_cart_button', 1 );
    function disabled_single_add_to_cart_button() {
        global $product;
    
        // Only for unlogged user
        if( ! is_user_logged_in() ){
    
            // 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_variation', 'custom_product_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_product_button', 30 );
            }
        }
    }
    
    // The custom replacement button function inked to loggin page
    function custom_product_button(){
        $login_url = get_permalink( wc_get_page_id( 'myaccount' ) );
        echo '<a class="button" href="'.$login_url.'">' . __( "Sign up for pricing", "woocommerce" ) . '</a>';
    }
    

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

    To make a disabled button on single product page use instead:

    // The custom replacement button function with a disabled button
    function custom_product_button(){
        echo '<a class="button disabled">' . __( "Sign up for pricing", "woocommerce" ) . '</a>';
    }
    

    To Hide prices on shop and archive pages:

    add_filter( 'woocommerce_after_shop_loop_item_title', 'remove_woocommerce_loop_price', 2 );
    function remove_woocommerce_loop_price() {
        // Only for unlogged user
        if( ! is_user_logged_in() )
            remove_action( 'woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10 );
    }
    

    To remove product price from single product pages:

    add_filter( 'woocommerce_single_product_summary', 'remove_woocommerce_single_price', 2 );
    function remove_woocommerce_single_price() {
        // Only for unlogged user
        if( ! is_user_logged_in() )
            remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
    }
    
    
    // Hide variations price for variable products
    add_filter( 'woocommerce_available_variation', 'hide_variations_price_html', 10, 3) ;
    function hide_variations_price_html( $data, $product, $variation ) {
        // Only for unlogged user
        if( ! is_user_logged_in() )
            $data['price_html'] = ' ';
    
        return $data;
    }
    

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