Funcție personalizată pentru imagini și miniaturi de produse WooCommerce
Caut să modific imaginile și miniaturile de produs WooCommerce.
Scopul meu este să adaug un atribut la tag-ul <a>
. Vreau să adaug: data-lightbox="Gallery"
, dar nu văd cum aș putea face acest lucru.
Fișierele de template par locul evident, dar codul nu are structura de anchor pe care o speram:
woocommerce\single-product\product-image.php
defined( 'ABSPATH' ) || exit;
// Notă: `wc_get_gallery_image_html` a fost adăugat în WC 3.3.2 și nu exista înainte. Această verificare protejează împotriva utilizării suprascrierilor de temă pe versiuni mai vechi de WC.
if ( ! function_exists( 'wc_get_gallery_image_html' ) ) {
return;
}
global $product;
$columns = apply_filters( 'woocommerce_product_thumbnails_columns', 4 );
$post_thumbnail_id = $product->get_image_id();
$wrapper_classes = apply_filters(
'woocommerce_single_product_image_gallery_classes',
array(
'woocommerce-product-gallery',
'woocommerce-product-gallery--' . ( $product->get_image_id() ? 'with-images' : 'without-images' ),
'woocommerce-product-gallery--columns-' . absint( $columns ),
'images',
)
);
?>
<div class="<?php echo esc_attr( implode( ' ', array_map( 'sanitize_html_class', $wrapper_classes ) ) ); ?>" data-columns="<?php echo esc_attr( $columns ); ?>" style="opacity: 0; transition: opacity .25s ease-in-out;">
<figure class="woocommerce-product-gallery__wrapper">
<?php
if ( $product->get_image_id() ) {
$html = wc_get_gallery_image_html( $post_thumbnail_id, true );
} else {
$html = '<div class="woocommerce-product-gallery__image--placeholder">';
$html .= sprintf( '<img src="%s" alt="%s" class="wp-post-image" />', esc_url( wc_placeholder_img_src( 'woocommerce_single' ) ), esc_html__( 'Așteptând imaginea produsului', 'woocommerce' ) );
$html .= '</div>';
}
echo apply_filters( 'woocommerce_single_product_image_thumbnail_html', $html, $post_thumbnail_id ); // phpcs:disable WordPress.XSS.EscapeOutput.OutputNotEscaped
do_action( 'woocommerce_product_thumbnails' );
?>
</figure>
</div>
și miniaturile sunt la fel.
woocommerce\single-product\product-thumbnails.php
defined( 'ABSPATH' ) || exit;
// Notă: `wc_get_gallery_image_html` a fost adăugat în WC 3.3.2 și nu exista înainte. Această verificare protejează împotriva utilizării suprascrierilor de temă pe versiuni mai vechi de WC.
if ( ! function_exists( 'wc_get_gallery_image_html' ) ) {
return;
}
global $product;
$attachment_ids = $product->get_gallery_image_ids();
if ( $attachment_ids && $product->get_image_id() ) {
foreach ( $attachment_ids as $attachment_id ) {
echo apply_filters( 'woocommerce_single_product_image_thumbnail_html', wc_get_gallery_image_html( $attachment_id ), $attachment_id ); // phpcs:disable WordPress.XSS.EscapeOutput.OutputNotEscaped
}
}
Presupun că trebuie să folosesc un filtru, dar nu am folosit asta până acum. Sau ar trebui să elimin acțiunea pentru imagine și miniaturi și să adaug propria funcție?
remove_action( 'woocommerce_product_thumbnails', 'woocommerce_show_product_thumbnails', 20 );
remove_action( 'woocommerce_before_single_product_summary', 'woocommerce_show_product_images', 20 );
function my_plugin_show_product_image() {
// codul meu personalizat pentru imagine unde pot folosi propriile atribute, structură div etc
// nu am idee ce cod PHP este necesar pentru a afișa imaginile
}
add_action( 'woocommerce_product_thumbnails', 'my_plugin_show_product_image', 20 );
function my_plugin_show_product_image() {
// codul meu personalizat pentru imagine unde pot folosi propriile atribute, structură div etc
// nu am idee ce cod PHP este necesar pentru a afișa imaginile
}
add_action( 'woocommerce_before_single_product_summary', 'my_plugin_show_product_image', 10 );
Idei?

Pe scurt:
Vom suprascrie șablonul implicit și vom modifica funcția care este apelată pentru a genera tag-ul nostru și imaginea din interiorul acestuia. Apoi, vom crea această funcție în fișierul nostru functions.php și vom adăuga atributul dorit la tag.
- copiază/lipește șablonul
woocommerce/templates/single-product/product-image.php
în directorul tău:your-child-theme/woocommerce/single-product/product-image.php
pentru a-i suprascrie funcționalitatea - schimbă
$html = wc_get_gallery_image_html( $post_thumbnail_id, true );
în$html = my_custom_img_function( $post_thumbnail_id, true );
- copiază/lipește următoarele în fișierul tău
functions.php
/**
* suprascris de la https://woocommerce.wp-a2z.org/oik_api/wc_get_gallery_image_html/
*/
function my_custom_img_function($attachment_id, $main_image = false)
{
$flexslider = (bool) apply_filters('woocommerce_single_product_flexslider_enabled', get_theme_support('wc-product-gallery-slider'));
$gallery_thumbnail = wc_get_image_size('gallery_thumbnail');
$thumbnail_size = apply_filters('woocommerce_gallery_thumbnail_size', array($gallery_thumbnail['width'], $gallery_thumbnail['height']));
$image_size = apply_filters('woocommerce_gallery_image_size', $flexslider || $main_image ? 'woocommerce_single' : $thumbnail_size);
$full_size = apply_filters('woocommerce_gallery_full_size', apply_filters('woocommerce_product_thumbnails_large_size', 'full'));
$thumbnail_src = wp_get_attachment_image_src($attachment_id, $thumbnail_size);
$full_src = wp_get_attachment_image_src($attachment_id, $full_size);
$alt_text = trim(wp_strip_all_tags(get_post_meta($attachment_id, '_wp_attachment_image_alt', true)));
$image = wp_get_attachment_image(
$attachment_id,
$image_size,
false,
apply_filters(
'woocommerce_gallery_image_html_attachment_image_params',
array(
'title' => _wp_specialchars(get_post_field('post_title', $attachment_id), ENT_QUOTES, 'UTF-8', true),
'data-caption' => _wp_specialchars(get_post_field('post_excerpt', $attachment_id), ENT_QUOTES, 'UTF-8', true),
'data-src' => esc_url($full_src[0]),
'data-large_image' => esc_url($full_src[0]),
'data-large_image_width' => esc_attr($full_src[1]),
'data-large_image_height' => esc_attr($full_src[2]),
'class' => esc_attr($main_image ? 'wp-post-image' : ''),
),
$attachment_id,
$image_size,
$main_image
)
);
return '<div data-thumb="' . esc_url( $thumbnail_src[0] ) . '" data-thumb-alt="' . esc_attr( $alt_text ) . '" class="woocommerce-product-gallery__image"><a data-lightbox="Gallery" href="' . esc_url($full_src[0]) . '">' . $image . '</a></div>';
}
După cum poți vedea, singurul lucru pe care l-am adăugat la funcția implicită este atributul dorit în ultima linie din instrucțiunea return.
