php 在WooCommerce商店页面上显示库存中的产品属性值

7gcisfzg  于 2023-10-15  发布在  PHP
关注(0)|答案(1)|浏览(119)

我使用的代码在商店页面上显示产品属性。

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>';
    
    }

}

现在产品显示属性“大小”的所有值。如何显示可用产品的属性值(数量大于1),并隐藏属性值(数量等于0)?
例如,一个可变产品有大小- 116(0件),122(0件),128(1件)。只有一种尺寸可用- 128(1件),应显示。

nwnhqdif

nwnhqdif1#

要仅显示库存变化中可变产品的特定属性术语名称,请使用以下内容:

// 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) );
        }
    }
}

代码放在子主题的functions.php文件中(或插件中)。测试和工作。

相关问题