【问题标题】:Woocommerce - external/affiliate product image to external link (buy URL)Woocommerce - 外部/附属产品图片到外部链接(购买 URL)
【发布时间】:2016-12-03 09:58:21
【问题描述】:

(警告:我不是程序员)直奔主题。

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

我用谷歌搜索了所有内容,但没有一个答案对我真正有用。但是,我发现了一些对我有帮助的东西。当我将此代码插入到functions.php 时,它会这样: 每个链接都指向附属链接——我的意思是甚至是产品的标题。我只希望图片有附属链接,而不是标题。标题应指向我网站上的产品页面。

代码如下:

// 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

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

【问题讨论】:

    标签: php wordpress woocommerce woothemes affiliate


    【解决方案1】:

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

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

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

    但更简洁的方法是使用在 WooCommerce 中广泛使用的操作,并将您的链接添加到使用它们的图像。我在旧版本的 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;
      }
    }
    

    要添加外部链接以存档产品图像,您可以将此代码放入您的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>
    

    【讨论】:

    • 谢谢!我将这两个文件添加到原始帖子中。 :)
    • @DanielSpongeHanuš 你确定这些是你的主题文件吗?它们看起来像原始的 WooCommerce 文件。
    • 哦,对不起! :) 现在有正确的文件。好吧,我插入了代码,它有所帮助,但只是一半。现在,我在单个产品页面上有一个附属链接(在图片上)。这太棒了,我想要这个。但是,我还需要对缩略图(在产品提要上)做同样的事情。你知道怎么做吗? PS:你救了我的命:D
    • @DanielSpongeHanuš 你的意思是在存档页面上?哪里有产品列表或提要,您的意思是您的 RSS 提要?因为目前我在您的 RSS 提要中没有看到任何产品。
    • 是的。存档页面。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多