Woocommerce - external/affiliate 产品图片到外部 link(购买 URL)

Woocommerce - external/affiliate product image to external link (buy URL)

(警告:我不是程序员)开门见山。

我有一个产品目录 http://adidassuperstar.cz,我希望图像(缩略图)指向附属公司 link - 与购买的 link 相同 link图片下方的按钮。

我用谷歌搜索了所有内容,但 none 的答案确实对我有用。但是,我发现了一些对我有一半帮助的东西。当我将此代码插入 functions.php 时,它会变成这样: 每个 link 都指向关联公司 link - 我什至是指产品的标题。我只希望图像有关联 link,而不是标题。标题应指向我网站上的产品页面。

代码如下:

// Do not include this if already open!
/**
* Code goes in theme functions.php.
*/
add_action('template_redirect', 'redirect_external_products');
function redirect_external_products() {
    global $post;
    if (is_singular( 'product' ) &&
        ! empty( $post ) &&
        ($product = wc_get_product($post)) &&
         $product->is_type('external' )) {

        wp_redirect( $product->get_product_url() );
        exit;
    }
}

我只需要指定代码以仅重定向图像(缩略图)。如果你知道如何做到这一点。请告诉我。

*附加信息(2016 年 12 月 6 日更改):

文件:Product-thumbnails.php

<?php
    /**
     * Single Product Thumbnails
     *
     * @author         WooThemes
     * @package     WooCommerce/Templates
     * @version     2.3.0
     */

    if (! defined('ABSPATH'))
        exit; // Exit if accessed directly

    global $post, $product, $woocommerce;

    if (! Avada()->settings->get('disable_woo_gallery')) {
        include WC()->plugin_path() . '/templates/single-product/product-thumbnails.php';
        return;
    }

    $attachment_ids = $product->get_gallery_attachment_ids();

    if ($attachment_ids) {

?>

    <div id="carousel" class="flexslider">
        <ul class="slides">
            <?php
                // From product-image.php
                if (has_post_thumbnail()) {

                    $image_title = esc_attr(get_the_title(get_post_thumbnail_id()));
                    $image_link  = wp_get_attachment_url(get_post_thumbnail_id());
                    $image       = get_the_post_thumbnail
                                       ($post->ID,
                                        apply_filters('single_product_large_thumbnail_size',
                                                      'shop_thumbnail'),
                                            array(
                                                'title' => $image_title
                                            )
                                        );
                    $attachment_count = count($product->get_gallery_attachment_ids());

                    if ($attachment_count > 0) {
                        $gallery = '[product-gallery]';
                    }
                    else {
                        $gallery = '';
                    }

                    // Avada Edit
                    echo apply_filters(
                        'woocommerce_single_product_image_thumbnail_html',
                        sprintf('<li>%s</li>', $image),
                        $post->ID);

                } else {
                    echo apply_filters(
                             'woocommerce_single_product_image_html',
                             sprintf('<li><img src="%s" alt="Placeholder" /></li>',
                             wc_placeholder_img_src()),
                             $post->ID);
                }

                $loop = 0;
                // Avada Edit
                $columns = apply_filters('woocommerce_product_thumbnails_columns', 3);

                foreach ($attachment_ids as $attachment_id) {

                    // Avada Edit
                    /*$classes = array('zoom');

                    if ($loop == 0 || $loop % $columns == 0)
                        $classes[] = 'first';

                    if (($loop + 1) % $columns == 0)
                        $classes[] = 'last';
                    */
                    $classes[] = 'image-' . $attachment_id;

                    $image_link = wp_get_attachment_url($attachment_id);

                    if (! $image_link)
                        continue;

                    $image       = wp_get_attachment_image(
                                       $attachment_id,
                                       apply_filters('single_product_small_thumbnail_size',
                                                     'shop_thumbnail'));
                    $image_class = esc_attr(implode(' ', $classes));
                    $image_title = esc_attr(get_the_title($attachment_id));

                    // Avada Edit
                    echo apply_filters(
                        'woocommerce_single_product_image_thumbnail_html',
                        sprintf('<li>%s</li>', $image),
                        $attachment_id,
                        $post->ID,
                        $image_class);

                    $loop++;
                }
   ?>

        </ul>
    </div>

    <?php
}

// Omit closing PHP tag to avoid "Headers already sent" issues.

文件:product-image.php

<?php
/**
 * Single Product Image
 *
 * @author         WooThemes
 * @package     WooCommerce/Templates
 * @version     2.0.14
 */

if (! defined('ABSPATH'))
    exit; // Exit if accessed directly

global $post, $woocommerce, $product;

if (! Avada()->settings->get('disable_woo_gallery')) {
    include WC()->plugin_path() . '/templates/single-product/product-image.php';
    return;
}

?>

<div class="images">

    <div id="slider" class="fusion-flexslider">
        <ul class="slides">
            <?php
                $attachment_count = count($product->get_gallery_attachment_ids());

                if ($attachment_count > 0) {
                    $gallery = '[product-gallery]';
                }
                else {
                    $gallery = '[]';
                }

                if (has_post_thumbnail()) {

                    $image_title = esc_attr(get_the_title(get_post_thumbnail_id()));
                    $image_link  = wp_get_attachment_url(get_post_thumbnail_id());
                    $image       = get_the_post_thumbnail(
                                       $post->ID,
                                       apply_filters('single_product_large_thumbnail_size',
                                                     'shop_single' ),
                                       array(
                                           'title' => $image_title
                                       ));
                    $image_caption = get_post_field('post_excerpt',
                                                    get_post_thumbnail_id());

                    // Avada Edit
                    echo apply_filters('woocommerce_single_product_image_html',
                                       sprintf(
                                           '<li><a href="%s" itemprop="image" class="woocommerce-main-image zoom" title="%s" data-rel="iLightbox' .
                                             $gallery .
                                             '" data-title="%s" data-caption="%s">%s</a></li>',
                                           $image_link,
                                           $image_title,
                                           $image_title,
                                           $image_caption,
                                           $image),
                                       $post->ID);

                }
                else {
                    echo apply_filters('woocommerce_single_product_image_html',
                                       sprintf('<li><img src="%s" alt="Placeholder" /></li>',
                                               wc_placeholder_img_src()),
                                       $post->ID);

                }

                /**
                 * From product-thumbnails.php
                 */
                $attachment_ids = $product->get_gallery_attachment_ids();

                $loop = 0;
                // Avada Edit
                //$columns = apply_filters('woocommerce_product_thumbnails_columns', 3);

                foreach ($attachment_ids as $attachment_id ) {

                    // Avada Edit
                    /*
                    $classes = array('zoom');

                    if ($loop == 0 || $loop % $columns == 0)
                        $classes[] = 'first';

                    if (( $loop + 1 ) % $columns == 0)
                        $classes[] = 'last';
                    */
                    $classes[] = 'image-'.$attachment_id;

                    $image_link = wp_get_attachment_url($attachment_id);

                    if (! $image_link)
                        continue;

                    // Avada Edit
                    // modified image size to shop_single from thumbnail
                    $image       = wp_get_attachment_image(
                                       $attachment_id,
                                       apply_filters('single_product_small_thumbnail_size',
                                                     'shop_single'));
                    $image_class = esc_attr(implode(' ', $classes));
                    $image_title = esc_attr(get_the_title($attachment_id));
                    $image_caption = get_post_field('post_excerpt', $attachment_id);

                    // Avada Edit
                    echo apply_filters('woocommerce_single_product_image_html',
                                       sprintf(
                                           '<li><a href="%s" itemprop="image" class="woocommerce-main-image zoom" title="%s" data-rel="iLightbox' .
                                               $gallery .
                                               '" data-title="%s" data-caption="%s">%s</a></li>',
                                           $image_link,
                                           $image_title,
                                           $image_title,
                                           $image_caption,
                                           $image),
                                       $attachment_id,
                                       $post->ID,
                                       $image_class);
                    //echo apply_filters(
                    //         'woocommerce_single_product_image_thumbnail_html',
                    //          sprintf(
                    //              '<a href="%s" class="%s" title="%s" data-rel="prettyPhoto[product-gallery]">%s</a>',
                    //              $image_link,
                    //              $image_class,
                    //              $image_title,
                    //              $image),
                    //          $attachment_id,
                    //          $post->ID,
                    //          $image_class);

                    $loop++;
                }
            ?>
        </ul>
    </div>

    <?php do_action('woocommerce_product_thumbnails'); ?>

</div>

文件:Content-product.php

<?php
    /**
     * The template for displaying product content within loops
     *
     * This template can be overridden by copying it to
     * yourtheme/woocommerce/content-product.php.
     *
     * HOWEVER, on occasion WooCommerce will need to update template
     * files and you (the theme developer) will need to copy the
     * new files to your theme to maintain compatibility. We try
     * to do this as little as possible, but it does happen. When
     * this occurs the version of the template file will be bumped and
     * the readme will list any important changes.
     *
     * @see     http://docs.woothemes.com/document/template-structure/
     * @author  WooThemes
     * @package WooCommerce/Templates
     * @version 2.5.0
     */

    if (! defined( 'ABSPATH')) {
        exit; // Exit if accessed directly
    }

    global $product, $woocommerce_loop;

    // Store loop count we're currently on
    if (empty( $woocommerce_loop['loop'])) {
        $woocommerce_loop['loop'] = 0;
    }

    // Store column count for displaying the grid
    if (empty( $woocommerce_loop['columns'])) {
        $woocommerce_loop['columns'] = apply_filters('loop_shop_columns', 4);
    }

    // Ensure visibility
    if (! $product || ! $product->is_visible()) {
        return;
    }

    // Increase loop count
    $woocommerce_loop['loop']++;

    // Extra post classes
    $classes = array();
    if ( 0 === ($woocommerce_loop['loop'] - 1) % $woocommerce_loop['columns'] ||
         1 === $woocommerce_loop['columns'] ) {

        $classes[] = 'first';
    }
    if ( 0 === $woocommerce_loop['loop'] % $woocommerce_loop['columns'] ) {
        $classes[] = 'last';
    }

?>

<li <?php post_class( $classes ); ?>>

    <?php
        /**
         * woocommerce_before_shop_loop_item hook.
         *
         * @hooked woocommerce_template_loop_product_link_open - 10
         */
        do_action('woocommerce_before_shop_loop_item');

    ?>

    <?php if ('clean' != Avada()->settings->get('woocommerce_product_box_design')) : ?>
        <a href="<?php the_permalink(); ?>" class="product-images">
    <?php endif;?>

    <?php
        /**
         * woocommerce_before_shop_loop_item_title hook.
         *
         * @hooked woocommerce_show_product_loop_sale_flash - 10
         * @hooked woocommerce_template_loop_product_thumbnail - 10
         */
        do_action('woocommerce_before_shop_loop_item_title');
    ?>
    <?php if ('clean' != Avada()->settings->get('woocommerce_product_box_design')) : ?>
        </a>
    <?php endif; ?>

    <div class="product-details">
        <div class="product-details-container">
            <?php
                /**
                 * woocommerce_shop_loop_item_title hook.
                 *
                 * @hooked woocommerce_template_loop_product_title - 10
                 */
                do_action('woocommerce_shop_loop_item_title');
            ?>

            <div class="clearfix">
                <?php
                    /**
                     * woocommerce_after_shop_loop_item_title hook.
                     *
                     * @hooked woocommerce_template_loop_rating - 5
                     * @hooked woocommerce_template_loop_price - 10
                     */
                    do_action('woocommerce_after_shop_loop_item_title');
                ?>

            </div>
        </div>
    </div>

    <?php
        /**
         * woocommerce_after_shop_loop_item hook.
         *
         * @hooked woocommerce_template_loop_product_link_close - 5
         * @hooked woocommerce_template_loop_add_to_cart - 10
         */
        do_action('woocommerce_after_shop_loop_item');
    ?>

</li>

我使用 WordPress 主题:Avada

产品是使用插件导入的:WP All import

如果您需要更多信息,我会提供给您。问问 :)

WooCommerce 为这些图像使用模板。它们是 product-thumbnails.php 和 'product-image.php' 文件,位于 WooCommerce 模板文件夹的 single-product 文件夹中。

对我而言,这些文件位于 theme/woocommerce/single-product/,"theme" 是您的主题(在本例中为 Avada)。

根据您的主题对 WooCommerce 模板的作用(一些主题完全重写它们),您可以直接更改其中一些模板文件并添加您的 links。

但更简洁的方法是使用 WooCommerce 中广泛使用的操作,并将您的 link 添加到使用它们的图像中。我在旧版 Avada 中看到的方式是,主题修改了 'woocommerce_single_product_image_html' 显示产品主图像的过滤器挂钩。

如果您与我们共享文件 product-thumbnails.phpproduct-image.php,我们可以找到一个简单的解决方案。

我个人无法访问您的主题,无法查看它对图像的具体作用。

现在,您可以将此代码放入 functions.php 文件中,看看结果如何:

add_filter('woocommerce_single_product_image_html', 'change_product_image_link', 10, 2);

function change_product_image_link( $html, $product_id) {
  $product = wc_get_product($product_id);
  if (is_singular('product') &&
      $product &&
      $product->is_type('external')){

    $attachment_count = count($product->get_gallery_attachment_ids());
    $gallery          = $attachment_count > 0 ? '[product-gallery]' : '';
    $props            = wc_get_product_attachment_props(get_post_thumbnail_id(), $post);
    $image            = get_the_post_thumbnail(
                            $post->ID,
                            apply_filters('single_product_large_thumbnail_size',
                                          'shop_single'),
                            array(
                                'title' => $props['title'],
                                'alt'   => $props['alt'],
                            ));
    return sprintf(
        '<a href="%s" itemprop="image" class="woocommerce-main-image zoom" title="%s">%s</a>',
        $product->get_product_url(),
        esc_attr($props['caption']),
        $image
    );
  }
  else {
    return $html;
  }
}

要添加外部 links 以存档产品图片,您可以将此代码放入您的 functions.php:

remove_action('woocommerce_before_shop_loop_item', 'woocommerce_template_loop_product_link_open');
add_action('woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_product_link_open', 15);

add_action('woocommerce_before_shop_loop_item', 'woocommerce_add_aff_link_open', 10);
add_action('woocommerce_before_shop_loop_item_title', 'woocommerce_add_aff_link_close', 10);

function woocommerce_add_aff_link_open(){
  $product = wc_get_product(get_the_ID());
  if ($product->is_type('external'))
    echo '<a href="' .
         $product->get_product_url() .
         '" class="woocommerce-LoopProductImage-link">';
}

function woocommerce_add_aff_link_close(){
  $product = wc_get_product(get_the_ID());
  if ($product->is_type('external'))
    echo '</a>';
}

第二次更改与 Avada 的 content-product.php 文件混合(我强烈建议在使用此编辑之前从 functions.php 中删除 #2 编辑):

<?php
/**
 * The template for displaying product content within loops
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/content-product.php.
 *
 * HOWEVER, on occasion WooCommerce will need to update template
   files and you (the theme developer) will need to copy the new
   files to your theme to maintain compatibility. We try to do this
   as little as possible, but it does happen. When this occurs the
   version of the template file will be bumped and the readme will
   list any important changes.
 *
 * @see     http://docs.woothemes.com/document/template-structure/
 * @author  WooThemes
 * @package WooCommerce/Templates
 * @version 2.5.0
 */

if (! defined('ABSPATH')) {
    exit; // Exit if accessed directly
}

global $product, $woocommerce_loop;

// Store loop count we're currently on
if (empty($woocommerce_loop['loop'])) {
    $woocommerce_loop['loop'] = 0;
}

// Store column count for displaying the grid
if (empty( $woocommerce_loop['columns'])) {
    $woocommerce_loop['columns'] = apply_filters('loop_shop_columns', 4);
}

// Ensure visibility
if (! $product || ! $product->is_visible()) {
    return;
}

// Increase loop count
$woocommerce_loop['loop']++;

// Extra post classes
$classes = array();
if ( 0 === ($woocommerce_loop['loop'] - 1 ) % $woocommerce_loop['columns'] ||
     1 === $woocommerce_loop['columns']) {

    $classes[] = 'first';
}
if ( 0 === $woocommerce_loop['loop'] % $woocommerce_loop['columns']) {
    $classes[] = 'last';
}
?>
<li <?php post_class($classes); ?>>

    <?php
    /**
     * woocommerce_before_shop_loop_item hook.
     *
     * @hooked woocommerce_template_loop_product_link_open - 10
     */
    do_action('woocommerce_before_shop_loop_item');
    ?>

    <?php
        if ('clean' != Avada()->settings->get('woocommerce_product_box_design')) {
          if ($product->is_type('external')) {
            echo '<a href="' .
                 $product->get_product_url() .
                 '" class="product-images">';
          }
          else {
            echo '<a href="' .
                 get_permalink() .
                 '" class="product-images">';
          }
        }
    ?>

    <?php
        /**
         * woocommerce_before_shop_loop_item_title hook.
         *
         * @hooked woocommerce_show_product_loop_sale_flash - 10
         * @hooked woocommerce_template_loop_product_thumbnail - 10
         */
        do_action('woocommerce_before_shop_loop_item_title');
    ?>

    <?php
        if ('clean' != Avada()->settings->get('woocommerce_product_box_design')) :
    ?>
        </a>
    <?php endif; ?>

    <div class="product-details">
        <div class="product-details-container">
            <?php
                /**
                 * woocommerce_shop_loop_item_title hook.
                 *
                 * @hooked woocommerce_template_loop_product_title - 10
                 */
                do_action('woocommerce_shop_loop_item_title');
            ?>

            <div class="clearfix">

                <?php
                    /**
                     * woocommerce_after_shop_loop_item_title hook.
                     *
                     * @hooked woocommerce_template_loop_rating - 5
                     * @hooked woocommerce_template_loop_price - 10
                     */
                    do_action('woocommerce_after_shop_loop_item_title');
                ?>

            </div>
        </div>
    </div>

    <?php
        /**
         * woocommerce_after_shop_loop_item hook.
         *
         * @hooked woocommerce_template_loop_product_link_close - 5
         * @hooked woocommerce_template_loop_add_to_cart - 10
         */
        do_action( 'woocommerce_after_shop_loop_item');
    ?>

</li>