我創建woocommerce主題,我有產品變體,即顯示在產品詳細信息頁面上的大小,但問題是我想通過使用產品ID獲取我的自定義PHP頁面中的所有變體,任何人都可以幫助我。woocommerce變體
在此先感謝。
我創建woocommerce主題,我有產品變體,即顯示在產品詳細信息頁面上的大小,但問題是我想通過使用產品ID獲取我的自定義PHP頁面中的所有變體,任何人都可以幫助我。woocommerce變體
在此先感謝。
試試這個,
<?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++;
}
?>
您可以使用:$available_variations = $product->get_available_variations();
如果這是一個樣式模板,請確保您添加global $product;
接近頂部。
從那裏,你可以通過變化foreach並做你想要的...因爲你沒有任何具體的輸出,我希望這使你在正確的軌道上。
下面的代碼:
$variations = $product->get_available_variations();
將返回產品的所有variantion
您展示所有的變化,此功能被放在:
\wp-content\plugins\woocommerce\templates\single-product\add-to-cart\variable.php
您可以使用下面的代碼:
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
}
}
常見問題通常始於更改單個產品的「庫存」或「缺貨」標籤。有幾個解決方案,那裏你需要改變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
需要指出的比在某些情況下,你可以得到一個「調用未定義的方法」致命錯誤,所以最好先檢查一下是否你調用一個方法在一個正確的對象(一個WC_Product_Variable而不是WC_Product_Simple)上,如下所示: if($ product-> product_type =='variable')... –
@EugeneSue請注意,從WC 3.0開始,您將收到以下錯誤: :產品類型調用不正確。產品屬性不應直接訪問.',@Deveoo的答案是現在運行檢查的正確方法 – cameronjonesweb