在新标签中打开外部WooCommerce产品 - 添加属性target =" _blank"

时间:2016-06-14 01:59:14

标签: php jquery wordpress woocommerce hook

我已设法将属性target="_blank"添加到我的外部产品页面,但我似乎无法更改父级(分组产品)页面上的链接。

我能够通过修改external.php并将标记添加到实际链接本身来实现此目的。

<p class="cart">
<?php sdnetwork(); sdcondition(); parent_permalink_button(); ?><a href="<?php echo esc_url( $product_url ); ?>" target="_blank" rel="nofollow" class="single_add_to_cart_button button alt"><img src="/wp-content/themes/wootique-child/images/icons/new_tab_icon.gif" alt="Opens in New Tab"> <?php echo esc_html( $button_text ); ?></a>
</p>

如何更改分组产品父页面上的链接以添加此属性,我首先想到的是修改groups.php,但链接的生成方式不同。

<?php woocommerce_template_loop_add_to_cart(); ?>

如何将我的标记添加到上面生成的链接?我考虑过使用钩子,但我需要一些帮助。

编辑:

只是想知道我是否可以像这样使用jQuery .....

jQuery(document).ready(function($) {
  $(".button.product_type_external").each(function() {
    $(this).find("a").attr("target", "_blank");
  });
});

问题是,当页面加载时,大多数链接都被隐藏了,我担心这会占用很多资源,还是会这样? jQuery的新手。

http://mobilereactor.co.uk/shop/mobile-phones/sony-xperia-z5-compact-coral-deals/

EDIT解决了感谢cale_b:

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

function add_target_blank( $link, $product ){
    global $post;
    $product = get_product( $post->ID );
        if( $product->is_type( 'external' ) ){
            // I simply added target="_blank" in the line below
            $link = sprintf( '<a rel="nofollow" href="%s" target="_blank" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s">%s</a>',
                    esc_url( $product->add_to_cart_url() ),
                    esc_attr( isset( $quantity ) ? $quantity : 1 ),
                    esc_attr( $product->id ),
                    esc_attr( $product->get_sku() ),
                    esc_attr( isset( $class ) ? $class : 'button' ),
                    esc_html( $product->add_to_cart_text() )
                );
            return $link;
        } else {
            // I simply remove target="_blank" in the line below
            $link = sprintf( '<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s">%s</a>',
                    esc_url( $product->add_to_cart_url() ),
                    esc_attr( isset( $quantity ) ? $quantity : 1 ),
                    esc_attr( $product->id ),
                    esc_attr( $product->get_sku() ),
                    esc_attr( isset( $class ) ? $class : 'button' ),
                    esc_html( $product->add_to_cart_text() )
                );
            return $link;
        }
}

2 个答案:

答案 0 :(得分:1)

如果您跟踪代码,该函数会执行某些操作,然后加载模板loop/add-to-cart.php

如果您打开loop/add-to-cart.php,您将找到看起来像这样的代码:

echo apply_filters( 'woocommerce_loop_add_to_cart_link',
    sprintf( '<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s">%s</a>',
        esc_url( $product->add_to_cart_url() ),
        esc_attr( isset( $quantity ) ? $quantity : 1 ),
        esc_attr( $product->id ),
        esc_attr( $product->get_sku() ),
        esc_attr( isset( $class ) ? $class : 'button' ),
        esc_html( $product->add_to_cart_text() )
    ),
$product );

要修改链接,请使用过滤器(woocommerce_loop_add_to_cart_link)。

注意:永远不要直接在插件文件夹中修改WooCommerce模板。使用他们出色的Template Structure将模板复制到您的主题并在那里进行修改,否则您的更改将在下次更新WooCommerce时丢失。

最后注意:使用好的IDE时,跟踪代码 easy 并且很有趣。我是PHPStorm的忠实粉丝(https://www.jetbrains.com/phpstorm/)。

编辑

为外部产品添加,您将采取不同的方法。

你会利用过滤器,正如你在评论中提到的那样,在你的functions.php中编写一个函数来执行这样的操作:

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

function my_external_product_links( $link, $product ) {
    // Set up the $target variable to contain the correct text depending on the product
    $target = ( 'external' == $product->product_type  ) ? 'target="_blank"' : '';
    // Use the code from the core function here, but with our modification to include target
    echo sprintf( '<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s" %s>%s</a>',
            esc_url( $product->add_to_cart_url() ),
            esc_attr( isset( $quantity ) ? $quantity : 1 ),
            esc_attr( $product->id ),
            esc_attr( $product->get_sku() ),
            esc_attr( isset( $class ) ? $class : 'button' ),
            esc_html( $product->add_to_cart_text() ),
            $target
        );
}

在上面的代码中,密切关注%s声明中的新sprintf

// Watch for this --->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->--->-->--->--->-vv
'<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s" %s>

答案 1 :(得分:0)

这是将target="_blank"添加到a​​dd_to_cart链接以在新标签中打开它们的一种更简洁的方法:

function ns_open_in_new_tab($args, $product) 
{
    if( $product->is_type('external') ) {
        // Inject target="_blank" into the attributes array
        $args['attributes']['target'] = '_blank';
    }    

    return $args;
}
add_filter( 'woocommerce_loop_add_to_cart_args', 'ns_open_in_new_tab', 10, 2 );

用您自己的名称空间缩写替换ns_部分。