将外部产品URL覆盖为“添加到购物车”产品按钮

时间:2017-05-12 20:50:01

标签: php wordpress woocommerce external product

我在使用亚马逊外部产品的网站上工作,但希望将用户指向该外部网址,首先要将该产品添加到购物车。我有这个功能,它将每个产品的默认按钮文本更改为添加到购物车。

function sv_wc_external_product_button( $button_text, $product ) {

    if ( 'external' === $product->get_type() ) {
        // enter the default text for external products
        return $product->button_text ? $product->button_text : 'Add To Cart';
    }
    return $button_text;
}
add_filter( 'woocommerce_product_single_add_to_cart_text', 
'sv_wc_external_product_button', 10, 2 );

但是此功能不会将产品添加到购物车。

如何使此功能将所选产品添加到购物车?

感谢。

3 个答案:

答案 0 :(得分:1)

您应该尝试使用 woocommerce_product_add_to_cart_url 过滤器挂钩更改添加到购物车的链接(此处为分组产品),这样:

add_filter( 'woocommerce_product_add_to_cart_url', 'override_external_product_url', 10, 2 );
function override_external_product_url( $url, $product ){
    if ( 'external' === $product->get_type() ) {
        //Get product ID -- WooCommerce compatibility
        if ( method_exists( $product, 'get_id' ) ) {
            $product_id = $product->get_id();
        } else {
            $product_id = $product->id;
        }
        // custom add to cart url example
        $url = home_url( "/product/?add-to-cart=$product_id");
    }
    return $url;
}

代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

  

更新但是,在重定向到外部网址之前,这不会将此外部产品添加到购物车中,即使它正常显示添加到购物车网址(作为添加到购物车)是ajax驱动的。)

答案 1 :(得分:0)

我修好了自己。对于外部产品,更换默认"购买此产品"与其他通用文本一起,将这些函数添加到functions.php文件中的主题:

[a-zA-Z]{3}\\s[\\d]{4}

和这一个:

add_filter( 'woocommerce_product_add_to_cart_text' , 
'wpf_custom_add_cart_text_archive',11);


function wpf_custom_add_cart_text_archive() {

   global $product;


   $product_type = $product->product_type;


   switch ( $product_type ) {

          case 'external':

                 return __( 'Add to Cart', 'woocommerce' );

                 break;

          case 'grouped':

                 return __( 'View products', 'woocommerce' );

                 break;

          case 'simple':

                 return __( 'Add to cart', 'woocommerce' );

                 break;

          case 'variable':

                 return __( 'Select options', 'woocommerce' );

                 break;

          default:

                 return __( 'Read more', 'woocommerce' );

   }

}

   add_filter( 'woocommerce_product_single_add_to_cart_text', 
'wpf_custom_add_cart_text',11);

到处替换文字。

答案 2 :(得分:0)

  

这是一种完全不同的方式,包括简单的产品和自定义字段外部链接。

     

在这个答案中,我们将使用简单的产品而不是外部产品。

     

1)我们在产品选项设置中添加“外部URL”自定义字段,然后保存数据。

     

enter image description here

在简单的产品常规选项设置中添加自定义字段:

add_action( 'woocommerce_product_options_general_product_data', 'simple_product_with_external_url' );
function simple_product_with_external_url() {
    global $woocommerce, $post;

    // only WC products
    if( $post->post_type != 'product' )
        return;

    // Get an instance of WC_Product object
    $product = wc_get_product( $post->ID );

    // Only for simple products
    if ( 'simple' == $product->get_type() ):

        echo '<div class="options_group">';

        // External Url
        woocommerce_wp_text_input(
            array(
                'id'          => '_ext_url_cust',
                'label'       => 'External Url',
                'description' => 'Custom external URL',
                'desc_tip'    => 'true',
                'placeholder' => 'Enter here your custom external URL'
            )
        );

        echo '</div>';

    endif;
}

保存自定义字段数据,如果它是一个简单的产品而不是空的:

add_action( 'woocommerce_process_product_meta', 'save_simple_product_with_external_url' , 10, 1);
function save_simple_product_with_external_url( $post_id ) {

    // Get an instance of WC_Product object
    $product = wc_get_product( $post_id );

    $external_url = $_POST['_ext_url_cust'];

    // Save data if it's not empty and only a simple product
    if( !empty( $external_url ) && 'simple' == $product->get_type() )
        update_post_meta( $post_id, '_ext_url_cust', $external_url );
}
  

2)这不适用于商店页面和存档页面,如果我们在向购物车添加产品时未在WooCommerce中设置购物车重定向。

     

因此,我们将通过链接的自定义按钮将商店页面和存档页面上的添加到购物车按钮(仅适用于带有自定义链接重定向的简单产品)替换为单个产品页面。

更换商店页面和存档页面中的“添加到购物车”按钮(对于带有自定义外部网址的简单产品):

add_filter( 'woocommerce_loop_add_to_cart_link',
'quantity_inputs_for_woocommerce_loop_add_to_cart_link', 10, 2 );

function quantity_inputs_for_woocommerce_loop_add_to_cart_link( $html, $product ) {

    if ( method_exists( $product, 'get_id' ) ) {
        $product_id = $product->get_id();
    } else {
        $product_id = $product->id;
    }

    $external_url = get_post_meta( $product_id, '_ext_url_cust', true );

    if ( ! empty( $external_url ) ) {
        // Set HERE your button link
        $link = get_permalink($product_id);
        $html = '<a href="'.$link.'" class="button alt add_to_cart_button">'.__("Read More", "woocommerce").'</a>';
    }
    return $html;
}
  

3)如果自定义字段值不为空,则首先将产品添加到购物车,然后重定向到外部网址(我们在单个商品页面中的自定义字段值)

添加到购物车后的外部URL重定向(当简单产品中的自定义字段不为空时):

add_filter( 'woocommerce_add_to_cart_redirect', 'redirect_simple_product_with_external_url', 10, 1 );
function redirect_simple_product_with_external_url( $url ) {

    $product_id = absint( $_REQUEST['add-to-cart'] );

    $external_url = get_post_meta( $product_id, '_ext_url_cust', true );
    $product = wc_get_product( $product_id );

    if ( 'simple' == $product->get_type() && ! empty( $external_url ) )
        $url = $external_url;

    return $url;
}

代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

此代码已经过测试,适用于WooCommerce版本2.6.x