如何在woocommerce_product_get_image过滤器钩子中获取产品ID
解决WooCommerce过滤器中获取产品ID替换缩略图的问题
我看了你的代码和WooCommerce get_image() 的源码,问题出在你没有正确接收过滤器的全部参数,尤其是产品实例对象。这个过滤器默认会传递多个参数,其中第二个参数就是当前的产品对象,你可以通过它直接获取产品ID。
修正后的代码
function offsite_product_images($image_html, $product, $size, $attr, $placeholder, $original_image) { // 通过产品实例获取当前产品ID $product_id = $product->get_id(); // 读取ACF设置的外部缩略图URL if ($thumbnail_url = get_field('thumbnail_url', $product_id)) { // 生成符合WooCommerce规范的img HTML标签 // 保留原有的图片属性(比如class、alt等),保证样式一致 $alt_text = isset($attr['alt']) ? $attr['alt'] : $product->get_name(); $image_class = isset($attr['class']) ? $attr['class'] : 'attachment-' . $size . ' size-' . $size; $image_html = sprintf( '<img src="%s" alt="%s" class="%s" %s>', esc_url($thumbnail_url), esc_attr($alt_text), esc_attr($image_class), wc_get_image_size($size) ? 'width="' . wc_get_image_size($size)['width'] . '" height="' . wc_get_image_size($size)['height'] . '"' : '' ); } return $image_html; } // 这里必须指定接收6个参数(第3个参数是优先级,第4个是参数数量) add_filter( 'woocommerce_product_get_image', 'offsite_product_images', 10, 6 );
关键要点说明
- 正确接收过滤器参数:
woocommerce_product_get_image过滤器一共传递6个参数,你需要在add_filter的第4个参数声明接收6个参数,才能拿到$product对象。 - 避免直接返回URL:原
get_image()函数返回的是完整的<img>HTML标签,不是纯URL,所以你需要把ACF的URL转换成符合规范的img标签,保证页面样式和功能正常。 - 保留原有属性:代码里保留了原图片的alt文本、class类名和尺寸属性,确保替换后的缩略图和原生样式一致。
为什么你的原代码无法获取ID?
你的原函数只接收了第一个参数$image_url,没有接收$product对象,而且没有在add_filter中声明参数数量,所以无法拿到当前产品的实例,自然获取不到ID。
内容的提问来源于stack exchange,提问作者justin
相关产品推荐
相关产品推荐

