2012-11-20 50 views
13

我創建woocommerce主題,我有產品變體,即顯示在產品詳細信息頁面上的大小,但問題是我想通過使用產品ID獲取我的自定義PHP頁面中的所有變體,任何人都可以幫助我。woocommerce變體

在此先感謝。

回答

0

試試這個,

<?php 
$name_size = get_post_meta($_GET['pr_id'],'product_size', true); 
$t_shirt_sizes_array = wp_get_post_terms($_GET['pr_id'],'pa_size'); 
$t_shirt_size = array(); 
$t_shirt_price = array(); 
for($scnt = 0; $scnt < count($t_shirt_sizes_array); $scnt++){ 
$t_shirt_size[] = $t_shirt_sizes_array[$scnt]->name; 
$t_shirt_price[] = $t_shirt_sizes_array[$scnt]->slug; 
$t_shirt_size_id[] = $t_shirt_sizes_array[$scnt]->term_id; 
} 
$cnt = 1; 
for($i = 0; $i < count($t_shirt_size); $i++){ 
$name_size = $t_shirt_size[$i]; 

$result = $wpdb->get_col("SELECT slug FROM {$wpdb->prefix}terms WHERE name = 
'".$t_shirt_size[$i]."'"); 
$term_slug = (!empty($result)) ? $result[0] : $term; 
$query = "SELECT postmeta.post_id AS product_id 
    FROM {$wpdb->prefix}postmeta AS postmeta 
LEFT JOIN {$wpdb->prefix}posts AS products ON (products.ID = postmeta.post_id) 
    WHERE postmeta.meta_key LIKE 'attribute_%' 
     AND postmeta.meta_value = '$term_slug' 
     AND products.post_parent = ".$_GET['pr_id'];  
$variation_id = $wpdb->get_col($query); 

$parent = wp_get_post_parent_id($variation_id[0]); 
if ($parent > 0) {      
    echo $name_size; 
    $_product = new WC_Product_Variation($variation_id[0]); 
    echo $_product->get_price(); 
} 
$price = $t_shirt_price[$i]; 
$cnt++; 
} 
?> 
26

您可以使用:$available_variations = $product->get_available_variations();

如果這是一個樣式模板,請確保您添加global $product;接近頂部。

從那裏,你可以通過變化foreach並做你想要的...因爲你沒有任何具體的輸出,我希望這使你在正確的軌道上。

+6

需要指出的比在某些情況下,你可以得到一個「調用未定義的方法」致命錯誤,所以最好先檢查一下是否你調用一個方法在一個正確的對象(一個WC_Product_Variable而不是WC_Product_Simple)上,如下所示: if($ product-> product_type =='variable')... –

+0

@EugeneSue請注意,從WC 3.0開始,您將收到以下錯誤: :產品類型調用不正確。產品屬性不應直接訪問.',@Deveoo的答案是現在運行檢查的正確方法 – cameronjonesweb

5

下面的代碼:

$variations = $product->get_available_variations(); 

將返回產品的所有variantion

您展示所有的變化,此功能被放在:

\wp-content\plugins\woocommerce\templates\single-product\add-to-cart\variable.php 
11

您可以使用下面的代碼:

global $woocommerce, $product, $post; 
// test if product is variable 
if ($product->is_type('variable')) 
{ 
    $available_variations = $product->get_available_variations(); 
    foreach ($available_variations as $key => $value) 
    { 
     //get values HERE 
    } 
} 
1

常見問題通常始於更改單個產品的「庫存」或「缺貨」標籤。有幾個解決方案,那裏你需要改變functions.php文件並添加一個新的過濾器。

當您需要修改產品版本時,問題會變得更加複雜。

這可能是您的解決方案:http://bucketpress.com/changing-stock-availability-text-for-product-variations

爲了顯示你需要修改variable.php文件中的產品,它可以在 /可溼性粉劑內容/插件/ woocommerce /模板中發現的可用的變化/單品/添加到購物車/

找到這個:

<form class="variations_form cart" method="post" enctype='multipart/form-data' data-product_id="<?php echo absint($product->id); ?>" data-product_variations="<?php echo htmlspecialchars(json_encode($available_variations)) ?>"> 

和標籤粘貼在此之前代碼:

foreach($available_variations as $i => $variation) { 
//check if variation has stock or not 
if ($variation['is_in_stock']) { 
    // Get max qty that user can purchase 
    $max_qty = $variation['max_qty']; 

    // Prepare availability html for stock available instance 
    $availability_html = '<p class="stock in-stock">' . $max_qty . ' units available for your purchase.' . '</p>'; 
} else { 
    // Prepare availability html for out of stock instance 
    $availability_html = '<p class="stock out-of-stock">Oops, we have no stock left.</p>'; 
} 
$available_variations[$i]['availability_html'] = $availability_html; } 

不要忘記你的新代碼後,移動php結束標籤 「?>」 從這一行

do_action('woocommerce_before_add_to_cart_form'); ?> 

所以完整的variable.php文件應該像這樣(WooCommerce 3.2。4):

<?php 
/** 
* Variable product add to cart 
* 
* This template can be overridden by copying it to yourtheme/woocommerce/single-product/add-to-cart/variable.php. 
* 
* HOWEVER, on occasion WooCommerce will need to update template files and you 
* (the theme developer) will need to copy the new files to your theme to 
* maintain compatibility. We try to do this as little as possible, but it does 
* happen. When this occurs the version of the template file will be bumped and 
* the readme will list any important changes. 
* 
* @see  https://docs.woocommerce.com/document/template-structure/ 
* @author WooThemes 
* @package WooCommerce/Templates 
* @version 3.0.0 
*/ 
if (! defined('ABSPATH')) { 
    exit; 
} 

global $product; 

$attribute_keys = array_keys($attributes); 

do_action('woocommerce_before_add_to_cart_form'); 

// Your New Code goes here: 
foreach($available_variations as $i => $variation) { 
    // check if variation has stock or not 
    if ($variation['is_in_stock']) { 
     // Get max qty that user can purchase 
     $max_qty = $variation['max_qty']; 

     // Prepare availability html for stock available instance 
     $availability_html = '<p class="stock in-stock">Available: ' . $max_qty . '</p>'; 
    } else { 
     // Prepare availability html for out of stock instance 
     $availability_html = '<p class="stock out-of-stock">Out of stock!</p>'; 
    } 
    $available_variations[$i]['availability_html'] = $availability_html; 
} ?> 

<form class="variations_form cart" method="post" enctype='multipart/form-data' data-product_id="<?php echo absint($product->get_id()); ?>" data-product_variations="<?php echo htmlspecialchars(wp_json_encode($available_variations)) ?>"> 
    <?php do_action('woocommerce_before_variations_form'); ?> 

    <?php if (empty($available_variations) && false !== $available_variations) : ?> 
     <p class="stock out-of-stock"><?php _e('This product is currently out of stock and unavailable.', 'woocommerce'); ?></p> 
    <?php else : ?> 
     <table class="variations" cellspacing="0"> 
      <tbody> 
       <?php foreach ($attributes as $attribute_name => $options) : ?> 
        <tr> 
         <td class="label"><label for="<?php echo sanitize_title($attribute_name); ?>"><?php echo wc_attribute_label($attribute_name); ?></label></td> 
         <td class="value"> 
          <?php 
           $selected = isset($_REQUEST[ 'attribute_' . sanitize_title($attribute_name) ]) ? wc_clean(stripslashes(urldecode($_REQUEST[ 'attribute_' . sanitize_title($attribute_name) ]))) : $product->get_variation_default_attribute($attribute_name); 
           wc_dropdown_variation_attribute_options(array('options' => $options, 'attribute' => $attribute_name, 'product' => $product, 'selected' => $selected)); 
           echo end($attribute_keys) === $attribute_name ? apply_filters('woocommerce_reset_variations_link', '<a class="reset_variations" href="#">' . esc_html__('Clear', 'woocommerce') . '</a>') : ''; 
          ?> 
         </td> 
        </tr> 
       <?php endforeach;?> 
      </tbody> 
     </table> 

     <?php do_action('woocommerce_before_add_to_cart_button'); ?> 

     <div class="single_variation_wrap"> 
      <?php 
       /** 
       * woocommerce_before_single_variation Hook. 
       */ 
       do_action('woocommerce_before_single_variation'); 

       /** 
       * woocommerce_single_variation hook. Used to output the cart button and placeholder for variation data. 
       * @since 2.4.0 
       * @hooked woocommerce_single_variation - 10 Empty div for variation data. 
       * @hooked woocommerce_single_variation_add_to_cart_button - 20 Qty and cart button. 
       */ 
       do_action('woocommerce_single_variation'); 

       /** 
       * woocommerce_after_single_variation Hook. 
       */ 
       do_action('woocommerce_after_single_variation'); 
      ?> 
     </div> 

     <?php do_action('woocommerce_after_add_to_cart_button'); ?> 
    <?php endif; ?> 

    <?php do_action('woocommerce_after_variations_form'); ?> 
</form> 

<?php 
do_action('woocommerce_after_add_to_cart_form'); 

所有學分「凱文」來源:http://bucketpress.com/author/base-admin