我正在使用在store 页面上显示产品属性的代码.

add_action( 'woocommerce_after_shop_loop_item', 'custom_loop_product_meta', 50 );
function custom_loop_product_meta() {
    global $product;
    
    if( ! is_object( $product ) ) { 
        $product = wc_get_product( get_the_id() );
    } 
    
    if( $product->is_type('variable') ) {
        
        echo '<div class="pa-block">';
        echo esc_html( pll__( 'Sizes' ) );
        echo '<span class="pa-block-text">: ' . $product->get_attribute('pa_size') . '</span>';
        echo '</div>';
    
    }

}

现在,该产品显示了属性"Size"的所有值.如何显示可用产品的属性值(数量大于1)并隐藏属性值(数量等于0)?

例如,可变产品的大小为-116(0个)、122(0个)、128(1个).只有一种尺寸可供 Select -128(1件),应该显示出来.

推荐答案

要仅在库存变体中显示变量产品的特定属性术语名称,请使用以下方法:

// Utility function: Lightweight SQL query to get instock attribute term names
function get_instock_attribute_term_names( $product_id, $taxonomy ) {
    global $wpdb; 
    return $wpdb->get_col( $wpdb->prepare( "
        SELECT DISTINCT t.name FROM {$wpdb->prefix}posts p 
        LEFT JOIN {$wpdb->prefix}postmeta pm ON p.ID = pm.post_id 
        LEFT JOIN {$wpdb->prefix}postmeta pm2 ON p.ID = pm2.post_id 
        LEFT JOIN {$wpdb->prefix}terms t ON pm2.meta_value = t.slug
        LEFT JOIN {$wpdb->prefix}term_taxonomy tt ON t.term_id = tt.term_taxonomy_id
        WHERE p.post_type = 'product_variation' AND p.post_status = 'publish'
        AND p.post_parent = %d AND pm2.meta_key = '%s'
        AND pm.meta_key = '_stock' AND pm.meta_value > 0 
        AND tt.taxonomy = '%s'
    ", $product_id, 'attribute_'.$taxonomy, $taxonomy ) );
}

add_action( 'woocommerce_after_shop_loop_item', 'custom_loop_product_meta', 50 );
function custom_loop_product_meta() {
    global $product;
    
    if( ! is_object( $product ) ) { 
        $product = wc_get_product( get_the_id() );
    } 
    
    if( $product->is_type('variable') ) {
        $taxonomy   = 'pa_size';
        $term_names =  get_instock_attribute_term_names( $product->get_id(), $taxonomy );

        if ( ! empty($term_names) ) {
            printf( '<div class="pa-block">%s:<span class="pa-block-text"> %s</span></div>', 
            esc_html( pll__( 'Sizes' ) ), implode(', ', $term_names) );
        }
    }
}

代码位于您的子主题的unctions.php文件中(或在插件中).经过测试,效果良好.

Php相关问答推荐

Postgrid Webhook不叫laravel

在WooCommerce Checkout帐单地址字段后插入自定义按钮

管理员订单列表中的自定义列与WooCommerce 8.6.1一起消失

使用PHP和WebSockets或SSE实现实时通知

使用.htaccess将任何路由重定向到文件

在AJAX请求后,Laravel重定向.(不允许使用方法)

PHP测试字符串的所有POST值

在Symfony 6.4中将工作流动态添加到服务

当配置的URL为空时禁用Laravel Slack日志(log)记录

在WooCommerce中添加特定产品类型的百分比费用和固定费用

在WP工具中页面加载时可短暂看到的JavaScript生成的字段

随机显示WordPress快捷代码功能时出现问题

有没有办法像引用枚举一样引用注册表中的对象?

WooCommerce 相关产品(按 children 类别)作为排名数学主要类别的后备

将 WooCommerce 0 销售价格替换为自定义文本,并保留常规价格删除线

注册命名空间后如何获取xml node 值?

Laravel路由中的符号在slug中会创建额外的斜杠

PDO 和 SQL 查询结果中日期格式不同的原因可能是什么?

在帖子内容中使用短代码触发 Woocommerce 挂钩

Laravel Docker 几个数据库