You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 );

关键要点说明

  1. 正确接收过滤器参数:woocommerce_product_get_image 过滤器一共传递6个参数,你需要在add_filter的第4个参数声明接收6个参数,才能拿到$product对象。
  2. 避免直接返回URL:原get_image()函数返回的是完整的<img> HTML标签,不是纯URL,所以你需要把ACF的URL转换成符合规范的img标签,保证页面样式和功能正常。
  3. 保留原有属性:代码里保留了原图片的alt文本、class类名和尺寸属性,确保替换后的缩略图和原生样式一致。

为什么你的原代码无法获取ID?

你的原函数只接收了第一个参数$image_url,没有接收$product对象,而且没有在add_filter中声明参数数量,所以无法拿到当前产品的实例,自然获取不到ID。

内容的提问来源于stack exchange,提问作者justin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:55:39