Moved variation dropdowns logic into wc_dropdown_variation_attribute_options()
This commit is contained in:
parent
2ea6a2efab
commit
9a7893ba23
|
@ -373,7 +373,7 @@ class WC_Product_Variable extends WC_Product {
|
|||
if ( in_array( '', $values ) ) {
|
||||
$values = $attribute['is_taxonomy'] ? wp_get_post_terms( $this->id, $attribute['name'], array( 'fields' => 'slugs' ) ) : wc_get_text_attributes( $attribute['value'] );
|
||||
|
||||
// Order custom attributes (non taxonomy) as defined
|
||||
// Get custom attributes (non taxonomy) as defined
|
||||
} elseif ( ! $attribute['is_taxonomy'] ) {
|
||||
$text_attributes = wc_get_text_attributes( $attribute['value'] );
|
||||
$assigned_text_attributes = $values;
|
||||
|
@ -414,6 +414,18 @@ class WC_Product_Variable extends WC_Product {
|
|||
return apply_filters( 'woocommerce_product_default_attributes', (array) maybe_unserialize( $default ), $this );
|
||||
}
|
||||
|
||||
/**
|
||||
* If set, get the default attributes for a variable product.
|
||||
*
|
||||
* @param string $attribute_name
|
||||
* @return string
|
||||
*/
|
||||
public function get_variation_default_attribute( $attribute_name ) {
|
||||
$defaults = $this->get_variation_default_attributes();
|
||||
$attribute_name = sanitize_title( $attribute_name );
|
||||
return isset( $defaults[ $attribute_name ] ) ? $defaults[ $attribute_name ] : '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Match a variation to a given set of attributes using a WP_Query
|
||||
* @since 2.4.0
|
||||
|
|
|
@ -1865,3 +1865,59 @@ if ( ! function_exists( 'woocommerce_output_auth_footer' ) ) {
|
|||
wc_get_template( 'auth/footer.php' );
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! function_exists( 'wc_dropdown_variation_attribute_options' ) ) {
|
||||
|
||||
/**
|
||||
* Output a list of variation attributes for use in the cart forms.
|
||||
*
|
||||
* @param array $args
|
||||
* @since 2.4.0
|
||||
*/
|
||||
function wc_dropdown_variation_attribute_options( $args = array() ) {
|
||||
$args = wp_parse_args( $args, array(
|
||||
'options' => false,
|
||||
'attribute' => false,
|
||||
'product' => false,
|
||||
'selected' => false,
|
||||
'name' => '',
|
||||
'id' => '',
|
||||
'show_option_none' => __( 'Choose an option', 'woocommerce' )
|
||||
) );
|
||||
|
||||
extract( $args );
|
||||
|
||||
if ( empty( $options ) && ! empty( $product ) && ! empty( $attribute ) ) {
|
||||
$attributes = $product->get_variation_attributes();
|
||||
$options = $attributes[ $attribute ];
|
||||
}
|
||||
|
||||
$name = $name ? $name : 'attribute_' . sanitize_title( $attribute );
|
||||
$id = $id ? $id : sanitize_title( $attribute );
|
||||
|
||||
echo '<select id="' . esc_attr( $id ) . '" name="' . esc_attr( $name ) . '" data-attribute_name="attribute_' . esc_attr( sanitize_title( $attribute ) ) . '">';
|
||||
|
||||
if ( $show_option_none ) {
|
||||
echo '<option value="">' . esc_html( $show_option_none ) . '</option>';
|
||||
}
|
||||
|
||||
if ( ! empty( $options ) ) {
|
||||
if ( $product && taxonomy_exists( $attribute ) ) {
|
||||
// Get terms if this is a taxonomy - ordered. We need the names too.
|
||||
$terms = wc_get_product_terms( $product->id, $attribute, array( 'fields' => 'all' ) );
|
||||
|
||||
foreach ( $terms as $term ) {
|
||||
if ( in_array( $term->slug, $options ) ) {
|
||||
echo '<option value="' . esc_attr( $term->slug ) . '" ' . selected( sanitize_title( $selected ), $term->slug, false ) . '>' . apply_filters( 'woocommerce_variation_option_name', $term->name ) . '</option>';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
foreach ( $options as $option ) {
|
||||
// This handles < 2.4.0 bw compatibility where text attributes were not sanitized.
|
||||
$selected = sanitize_title( $selected ) === $selected ? selected( $selected, sanitize_title( $option ), false ) : selected( $selected, $option, false );
|
||||
echo '<option value="' . esc_attr( $option ) . '" ' . $selected . '>' . esc_html( apply_filters( 'woocommerce_variation_option_name', $option ) ) . '</option>';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,60 +12,30 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||
}
|
||||
|
||||
global $product, $post;
|
||||
?>
|
||||
|
||||
<?php do_action( 'woocommerce_before_add_to_cart_form' ); ?>
|
||||
do_action( 'woocommerce_before_add_to_cart_form' ); ?>
|
||||
|
||||
<form class="variations_form cart" method="post" enctype='multipart/form-data' data-product_id="<?php echo $post->ID; ?>" data-product_variations="<?php echo esc_attr( json_encode( $available_variations ) ) ?>">
|
||||
|
||||
<?php do_action( 'woocommerce_before_variations_form' ); ?>
|
||||
|
||||
<?php if ( ! empty( $available_variations ) || false === $available_variations ) : ?>
|
||||
<table class="variations" cellspacing="0">
|
||||
<tbody>
|
||||
<?php $loop = 0; foreach ( $attributes as $name => $options ) : $loop++; ?>
|
||||
<?php foreach ( $attributes as $attribute_name => $options ) : ?>
|
||||
<tr>
|
||||
<td class="label"><label for="<?php echo sanitize_title( $name ); ?>"><?php echo wc_attribute_label( $name ); ?></label></td>
|
||||
<td class="value"><select id="<?php echo esc_attr( sanitize_title( $name ) ); ?>" name="attribute_<?php echo sanitize_title( $name ); ?>" data-attribute_name="attribute_<?php echo sanitize_title( $name ); ?>">
|
||||
<option value=""><?php echo __( 'Choose an option', 'woocommerce' ) ?>…</option>
|
||||
<td class="label"><label for="<?php echo sanitize_title( $attribute_name ); ?>"><?php echo wc_attribute_label( $attribute_name ); ?></label></td>
|
||||
<td class="value">
|
||||
<?php
|
||||
if ( is_array( $options ) ) {
|
||||
|
||||
if ( isset( $_REQUEST[ 'attribute_' . sanitize_title( $name ) ] ) ) {
|
||||
$selected_value = $_REQUEST[ 'attribute_' . sanitize_title( $name ) ];
|
||||
} elseif ( isset( $selected_attributes[ sanitize_title( $name ) ] ) ) {
|
||||
$selected_value = $selected_attributes[ sanitize_title( $name ) ];
|
||||
} else {
|
||||
$selected_value = '';
|
||||
}
|
||||
|
||||
// Get terms if this is a taxonomy - ordered
|
||||
if ( taxonomy_exists( $name ) ) {
|
||||
|
||||
$terms = wc_get_product_terms( $post->ID, $name, array( 'fields' => 'all' ) );
|
||||
|
||||
foreach ( $terms as $term ) {
|
||||
if ( ! in_array( $term->slug, $options ) ) {
|
||||
continue;
|
||||
}
|
||||
echo '<option value="' . esc_attr( $term->slug ) . '" ' . selected( sanitize_title( $selected_value ), sanitize_title( $term->slug ), false ) . '>' . apply_filters( 'woocommerce_variation_option_name', $term->name ) . '</option>';
|
||||
}
|
||||
|
||||
} else {
|
||||
foreach ( $options as $option ) {
|
||||
$selected = sanitize_title( $selected_value ) === $selected_value ? selected( sanitize_title( $selected_value ), sanitize_title( $option ), false ) : selected( $selected_value, $option, false );
|
||||
echo '<option value="' . esc_attr( $option ) . '" ' . $selected . '>' . esc_html( apply_filters( 'woocommerce_variation_option_name', $option ) ) . '</option>';
|
||||
}
|
||||
}
|
||||
}
|
||||
$selected = isset( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ? $_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 ) );
|
||||
?>
|
||||
</select> <?php
|
||||
if ( sizeof( $attributes ) === $loop ) {
|
||||
echo '<a class="reset_variations" href="#">' . __( 'Clear selection', 'woocommerce' ) . '</a>';
|
||||
}
|
||||
?></td>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach;?>
|
||||
<tr class="woocommerce-reset-row">
|
||||
<th> </th>
|
||||
<td><a class="reset_variations" href="#"><?php _e( 'Clear selection', 'woocommerce' ); ?></a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
@ -77,13 +47,11 @@ global $product, $post;
|
|||
<div class="single_variation"></div>
|
||||
|
||||
<?php do_action( 'woocommerce_before_variations_button' ); ?>
|
||||
|
||||
<div class="variations_button">
|
||||
<?php woocommerce_quantity_input( array(
|
||||
'input_value' => ( isset( $_POST['quantity'] ) ? wc_stock_amount( $_POST['quantity'] ) : 1 )
|
||||
) ); ?>
|
||||
<?php woocommerce_quantity_input( array( 'input_value' => isset( $_POST['quantity'] ) ? wc_stock_amount( $_POST['quantity'] ) : 1 ) ); ?>
|
||||
<button type="submit" class="single_add_to_cart_button button alt"><?php echo esc_html( $product->single_add_to_cart_text() ); ?></button>
|
||||
</div>
|
||||
<?php do_action( 'woocommerce_after_variations_button' ); ?>
|
||||
|
||||
<input type="hidden" name="add-to-cart" value="<?php echo $product->id; ?>" />
|
||||
<input type="hidden" name="product_id" value="<?php echo esc_attr( $post->ID ); ?>" />
|
||||
|
@ -95,11 +63,10 @@ global $product, $post;
|
|||
<?php do_action( 'woocommerce_after_add_to_cart_button' ); ?>
|
||||
|
||||
<?php else : ?>
|
||||
|
||||
<p class="stock out-of-stock"><?php _e( 'This product is currently out of stock and unavailable.', 'woocommerce' ); ?></p>
|
||||
|
||||
<?php endif; ?>
|
||||
|
||||
<?php do_action( 'woocommerce_after_variations_form' ); ?>
|
||||
</form>
|
||||
|
||||
<?php do_action( 'woocommerce_after_add_to_cart_form' ); ?>
|
||||
|
|
Loading…
Reference in New Issue