Last active
May 26, 2017 05:51
-
-
Save doubleedesign/e6b87dedd345140c263e3d7e1995e50c to your computer and use it in GitHub Desktop.
Custom display of product attributes for a home builder or property developer site. Used on www.davrose.com.au
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Highly customised output of product attributes | |
These functions can be used in hooks in functions/woocommerce.php or directly in templates | |
Functions: | |
1. doublee_home_room_attributes() gets the number of bedrooms, bathrooms and car spaces and outputs them as a list. | |
2. doublee_duo_home_room_attributes() gets the number of bedrooms, bathrooms and car spaces for both residences and outputs them in a condensed list. Used where doublee_home_room_attributes() is not appropriate | |
2. doublee_home_dimensions_attributes() gets the living area size, total area size, minimum block width and number of storeys and displays them in a table. | |
3. doublee_home_floorplan_image() gets and outputs the floorplan image, which is an ACF field. | |
*/ | |
function doublee_home_room_attributes() { | |
// Get product attribute values | |
global $product; | |
$formatted_attributes = array(); | |
$attributes = $product->get_attributes(); | |
foreach($attributes as $attr=>$attr_deets){ | |
$attribute_label = wc_attribute_label($attr); | |
if ( isset( $attributes[ $attr ] ) || isset( $attributes[ 'pa_' . $attr ] ) ) { | |
$attribute = isset( $attributes[ $attr ] ) ? $attributes[ $attr ] : $attributes[ 'pa_' . $attr ]; | |
if ( $attribute['is_taxonomy'] ) { | |
$formatted_attributes[$attribute_label] = implode( ', ', wc_get_product_terms( $product->id, $attribute['name'], array( 'fields' => 'names' ) ) ); | |
} else { | |
$formatted_attributes[$attribute_label] = $attribute['value']; | |
} | |
} | |
} | |
// The ones we want for this function | |
// Most will be have one value, but we must allow for two and output a second set for the duo homes | |
// So let's turn the string returned into an array so we can split into two sets where relevant. | |
$bedrooms_field = $formatted_attributes['Bedrooms']; | |
$bathrooms_field = $formatted_attributes['Bathrooms']; | |
$carspaces_field = $formatted_attributes['Car spaces']; | |
$bedrooms_array = explode(', ', $bedrooms_field); | |
$bathrooms_array = explode(', ', $bathrooms_field); | |
$carspaces_array = explode(', ', $carspaces_field); | |
$bedrooms = $bedrooms_array[0]; | |
$bathrooms = $bathrooms_array[0]; | |
$carspaces = $carspaces_array[0]; | |
$bedrooms2 = $bedrooms_array[1]; | |
$bathrooms2 = $bathrooms_array[1]; | |
$carspaces2 = $carspaces_array[1]; | |
// Output them | |
?> | |
<?php | |
// Only output label if there's a second set of values | |
if ( (!empty($bedrooms2)) || (!empty($bathrooms2)) || (!empty($bathrooms2)) ){ ?> | |
<span class="residence-1 title">Residence 1</span> | |
<?php } ?> | |
<ul class="room attributes"> | |
<li class="bedrooms"><?php echo $bedrooms; ?></li> | |
<li class="bathrooms"><?php echo $bathrooms; ?></li> | |
<li class="carspaces"><?php echo $carspaces; ?></li> | |
</ul> | |
<?php | |
// Only output label and second table if there's a second set of values | |
if ( (!empty($bedrooms2)) || (!empty($bathrooms2)) || (!empty($bathrooms2)) ){ ?> | |
<span class="residence-2 title">Residence 2</span> | |
<ul class="second room attributes"> | |
<li class="bedrooms"><?php echo $bedrooms2; ?></li> | |
<li class="bathrooms"><?php echo $bathrooms2; ?></li> | |
<li class="carspaces"> | |
<?php // If $carspaces2 doesn't exist, assume Residence 2 has the same number as Residence 1 and use $carspaces | |
if (!empty($carspaces2)) { echo $carspaces2; } else { echo $carspaces; } ?> | |
</li> | |
</ul> | |
<?php } ?> | |
<?php } | |
function doublee_duo_home_room_attributes() { | |
// Get product attribute values | |
global $product; | |
$formatted_attributes = array(); | |
$attributes = $product->get_attributes(); | |
foreach($attributes as $attr=>$attr_deets){ | |
$attribute_label = wc_attribute_label($attr); | |
if ( isset( $attributes[ $attr ] ) || isset( $attributes[ 'pa_' . $attr ] ) ) { | |
$attribute = isset( $attributes[ $attr ] ) ? $attributes[ $attr ] : $attributes[ 'pa_' . $attr ]; | |
if ( $attribute['is_taxonomy'] ) { | |
$formatted_attributes[$attribute_label] = implode( ', ', wc_get_product_terms( $product->id, $attribute['name'], array( 'fields' => 'names' ) ) ); | |
} else { | |
$formatted_attributes[$attribute_label] = $attribute['value']; | |
} | |
} | |
} | |
// The ones we want for this function | |
// Looking for two values, so let's turn the string returned into an array so we can split into two sets where relevant. | |
$bedrooms_field = $formatted_attributes['Bedrooms']; | |
$bathrooms_field = $formatted_attributes['Bathrooms']; | |
$carspaces_field = $formatted_attributes['Car spaces']; | |
$bedrooms_array = explode(', ', $bedrooms_field); | |
$bathrooms_array = explode(', ', $bathrooms_field); | |
$carspaces_array = explode(', ', $carspaces_field); | |
$bedrooms = $bedrooms_array[0]; | |
$bathrooms = $bathrooms_array[0]; | |
$carspaces = $carspaces_array[0]; | |
$bedrooms2 = $bedrooms_array[1]; | |
$bathrooms2 = $bathrooms_array[1]; | |
$carspaces2 = $carspaces_array[1]; | |
// Output them as a condensed list | |
?> | |
<ul class="room attributes"> | |
<li class="bedrooms"><?php echo $bedrooms; ?> / <?php echo $bedrooms2; ?></li> | |
<li class="bathrooms"><?php echo $bathrooms; ?> / <?php echo $bathrooms2; ?></li> | |
<li class="carspaces"><?php echo $carspaces; ?> / <?php echo $carspaces2; ?></li> | |
</ul> | |
<?php } | |
function doublee_home_dimensions_attributes() { | |
// Get product attribute values | |
global $product; | |
$formatted_attributes = array(); | |
$attributes = $product->get_attributes(); | |
foreach($attributes as $attr=>$attr_deets){ | |
$attribute_label = wc_attribute_label($attr); | |
if ( isset( $attributes[ $attr ] ) || isset( $attributes[ 'pa_' . $attr ] ) ) { | |
$attribute = isset( $attributes[ $attr ] ) ? $attributes[ $attr ] : $attributes[ 'pa_' . $attr ]; | |
if ( $attribute['is_taxonomy'] ) { | |
$formatted_attributes[$attribute_label] = implode( ', ', wc_get_product_terms( $product->id, $attribute['name'], array( 'fields' => 'names' ) ) ); | |
} else { | |
$formatted_attributes[$attribute_label] = $attribute['value']; | |
} | |
} | |
} | |
// The ones we want for this function | |
// Most will be have one value, but we must allow for two and output a second set for the duo homes | |
// So let's turn the string returned into an array so we can split into two sets where relevant. | |
$living_field = $formatted_attributes['living-area']; | |
$total_field = $formatted_attributes['total-area']; | |
$minblock_field = $formatted_attributes['minimum-block-width']; | |
$storeys_field = $formatted_attributes['Storeys']; | |
$living_array = explode('| ', $living_field); | |
$total_array = explode('| ', $total_field); | |
$minblock_array = explode('| ', $minblock_field); | |
$storeys_array = explode('| ', $storeys_field); | |
$living = $living_array[0]; | |
$total = $total_array[0]; | |
$minblock = $minblock_array[0]; | |
$storeys = $storeys_array[0]; | |
$living2 = $living_array[1]; | |
$total2 = $total_array[1]; | |
$minblock2 = $minblock_array[1]; | |
$storeys2 = $storeys_array[1]; | |
// Output them | |
?> | |
<?php | |
// Only output heading and second table if there's a second set of values | |
if ( (!empty($living2)) || (!empty($total2)) || (!empty($minblock2)) || (!empty($storeys2)) ) { ?> | |
<h3 class="residence-1">Residence 1</h3> | |
<?php } ?> | |
<table class="dimension attributes"> | |
<tbody> | |
<?php if(!empty($living)) { ?> | |
<tr> | |
<th scope="row">Living area</th> | |
<td><?php echo $living; ?>m<sup>2</sup></td> | |
</tr> | |
<?php } ?> | |
<?php if(!empty($total)) { ?> | |
<tr> | |
<th scope="row">Total area</th> | |
<td><?php echo $total; ?>m<sup>2</sup></td> | |
</tr> | |
<?php } ?> | |
<?php if(!empty($minblock)) { ?> | |
<tr> | |
<th scope="row">Minimum block width</th> | |
<td><?php echo $minblock; ?>m</td> | |
</tr> | |
<?php } ?> | |
<?php if(!empty($storeys)) { ?> | |
<tr> | |
<th scope="row">Storeys</th> | |
<td><?php echo $storeys; ?></td> | |
</tr> | |
<?php } ?> | |
</tbody> | |
</table> | |
<?php | |
// Only output heading and second table if there's a second set of values | |
if ( (!empty($living2)) || (!empty($total2)) || (!empty($minblock2)) || (!empty($storeys2)) ) { ?> | |
<h3 class="residence-2">Residence 2</h3> | |
<table class="second dimension attributes"> | |
<tbody> | |
<?php if(!empty($living2)) { ?> | |
<tr> | |
<th scope="row">Living area</th> | |
<td><?php echo $living2; ?>m<sup>2</sup></td> | |
</tr> | |
<?php } ?> | |
<?php if(!empty($total2)) { ?> | |
<tr> | |
<th scope="row">Total area</th> | |
<td><?php echo $total2; ?>m<sup>2</sup></td> | |
</tr> | |
<?php } ?> | |
<?php if(!empty($minblock2)) { ?> | |
<tr> | |
<th scope="row">Minimum block width</th> | |
<td><?php echo $minblock2; ?>m</td> | |
</tr> | |
<?php } ?> | |
<?php if(!empty($storeys) || (!empty($storeys2))) { ?> | |
<tr> | |
<th scope="row">Storeys</th> | |
<td><?php if(!empty($storeys2)) { echo $storeys2; } else { echo $storeys; } ?></td> | |
</tr> | |
<?php } ?> | |
</tbody> | |
</table> | |
<?php } ?> | |
<?php } | |
function doublee_home_floorplan_image() { | |
global $post; | |
$floorplan_field = get_field('floorplan_image'); | |
$floorplan_preview = $floorplan_field['sizes']['floorplan']; | |
$floorplan_full = $floorplan_field['url']; | |
echo '<div class="floorplan">'; | |
echo '<a href="'. $floorplan_full .'" rel="swipebox"><img src="' . $floorplan_preview . '" alt="' . $post->post_title . ' floorplan" /></a>'; | |
echo '</div>'; | |
} | |
?> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Add custom attributes using hooks and filters rather than overriding templates | |
// Add to product lists (e.g. product category page) | |
add_action( 'woocommerce_after_shop_loop_item_title', 'doublee_home_room_attributes', 10 ); | |
// Add to the single product summary div | |
add_action( 'woocommerce_single_product_summary', 'doublee_home_room_attributes', 5 ); | |
add_action( 'woocommerce_single_product_summary', 'doublee_home_dimensions_attributes', 30 ); | |
// end custom attributes implementation |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Note: This uses Zurb Foundation grid mixins, and a custom mixin for FontAwesome icons. | |
Vanilla SCSS in comments below each mixin. */ | |
/* Attributes */ | |
ul.attributes { | |
list-style: none; | |
margin: 0; | |
@include flex-grid-row(); | |
/* | |
display: flex; | |
flex-flow: row wrap; | |
*/ | |
justify-content: space-between; | |
li { | |
@include flex-grid-column(shrink, 0); | |
/* | |
flex-grow: 0; | |
flex-shrink: 0; | |
flex-basis: auto; | |
padding-left: 0; | |
padding-right: 0; | |
*/ | |
&:before { | |
padding-right: $global-padding/4; | |
/* | |
padding-right: 4px; | |
font-family: "FontAwesome"; | |
*/ | |
font-size: 1.2em; | |
} | |
&.bedrooms { | |
&:before { | |
@include icon('\f236'); | |
/* | |
content: '\f236'; | |
*/ | |
} | |
} | |
&.bathrooms { | |
&:before { | |
@include icon('\f2cd'); | |
/* | |
content: '\f2cd'; | |
*/ | |
} | |
} | |
&.carspaces { | |
&:before { | |
@include icon('\f1b9'); | |
/* | |
content: '\f1b9'; | |
*/ | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment