woocommerce变化

时间:2012-11-20 05:04:40

标签: php wordpress woocommerce

我正在创建一个woocommerce主题,我有产品变化,即大小,显示在产品详细信息页面上,但问题是我想通过使用产品ID获取我的自定义php页面中的所有变体,任何人都可以帮助我。< / p>

提前致谢。

5 个答案:

答案 0 :(得分:39)

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

如果这是单一样式模板,请务必在顶部附近添加global $product;

从那里开始,您可以通过各种变化进行预测并按照您的意愿行事......因为您没有任何具体的输出,我希望这能让您走上正确的轨道。

答案 1 :(得分:19)

您可以使用以下代码:

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

答案 2 :(得分:8)

以下代码:

$variations = $product->get_available_variations();

将返回产品的所有变体

此功能放在您显示所有变体的位置:

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

答案 3 :(得分: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结束标记“?&gt;”从这一行

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

的所有“Kevin”积分

答案 4 :(得分: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++;
}
?>