Woocommerce — изображение внешнего / аффилированного продукта с внешней ссылкой (купить URL)

(Внимание: я не программист) Прямо к делу.

У меня есть каталог продукции 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;
}
}

Мне нужно только указать код, чтобы перенаправить только изображения (эскизы). Если у вас есть подсказка, как это сделать. Пожалуйста, дайте мне знать.

* Дополнительная информация (изменено 6.12.2016):

Файл: 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 Весь импорт

Если вам нужна дополнительная информация, я передам ее вам. Просто спроси 🙂

1

Решение

WooCommerce использует шаблон для этих изображений. Они есть product-thumbnails.php и файлы ‘product-image.php’, расположенные в single-product папка в вашей папке шаблонов WooCommerce.

Для меня эти файлы находятся в theme/woocommerce/single-product/ и «тема» — это ваша тема (в данном случае Avada).

Исходя из того, что ваша тема делает с шаблонами WooCommerce (некоторые темы переписывают их полностью), вы можете просто изменить некоторые из этих файлов шаблонов напрямую и добавить свои ссылки.

Но более чистым способом было бы использовать действия, которые широко используются в WooCommerce, и добавить свою ссылку на изображения, используя их. На мой взгляд, в более старой версии Avada темы изменяют фильтр-фильтр ‘woocommerce_single_product_image_html’, который показывает основное изображение продукта.

Если вы поделитесь файлами product-thumbnails.php а также product-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>';
}

Вторые изменения смешались с Авада content-product.php файл (я настоятельно рекомендую удалить изменения # 2 из functions.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')) {
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>
0

Другие решения

Других решений пока нет …