Tutorial: Color Swatches
If you’ve ever wanted to have color swatches with your theme, here’s a guide and some sample code to turn this feature on. This method allows you to set HTML color codes and/or set color swatches for each color. Then it looks for any variation called “Color” and turns it into a clickable color swatch list. If you set ikeys, the main image will change also!
Step 1: Set Your Colors
If you want to use thumbnails, you should build your image files as swatch-color-name.jpg and the image should be placed in your theme’s images folder. If you want to use HTML color codes, set them up like this in your theme’s functions.php file:
global $custom_colors; $custom_colors = array( "dark-green" => "#395D01", "red" => "#7A0000", "green" => "#427A00", "blue" => "#1A007A", "black" => "#000000", );
You can use HTML colors and themes at the same time, but if a thumbnail is found, it will take precedence.
Step 2: Set Your Style
You need a little bit of custom CSS to make your list look good. This is what I recommend:
#colors { margin: 14px 0; clear: both; } #colors li { float: left; margin: 0 7px 11px 0; } #colors li a { width: 42px; height: 42px; display: block; text-indent: -99999px; border: 2px solid #BBBBBB; } #colors li a:hover { border-color: #000; } #colors li a.selected-swatch { border-color: #000; }
Adjust as you like.
Step 3: Add To Your Template
Open up your foxyshop-single-product.php file and put the following code in the section where you want the color swatches to appear (probably right before the variations):
//Custom Color Swatches global $custom_colors; $swatch_image_path = "/images/swatch-"; $swatch_ext = ".jpg"; $swatch_backup = "#fff"; foreach ($product['variations'] as $key=>$val) { if ($val['name'] == "Color") { echo '<ul id="colors">'; $colors = preg_split("/(\r\n|\n)/", $val['value']); $swatch_count = 0; foreach ($colors as $color) { if (!$color) continue; $color = str_replace("*", "", $color); if (strpos($color,"{") !== false) $color = substr($color,0,strpos($color,"{")); $color_style = $swatch_backup; if (isset($custom_colors[sanitize_title($color)])) $color_style = $custom_colors[sanitize_title($color)]; if (file_exists(get_stylesheet_directory() . $swatch_image_path . sanitize_title($color) . $swatch_ext)) $color_style = "url('" . get_bloginfo("stylesheet_directory") . $swatch_image_path . sanitize_title($color) . $swatch_ext . "')"; echo '<li><a href="#" rel="' . $swatch_count . '" style="background: ' . $color_style . ';" title="' . esc_attr($color) . '">' . $color . '</a></li>'; $swatch_count++; } echo '</ul>'; } }
Step 4: Add Javascript
This Javascript controls what happens once the swatch is clicked. It should go at the bottom of your foxyshop-single-product.php right before the get_footer(); function.
<script type="text/javascript"> jQuery(document).ready(function($){ <?php if (isset($_GET['color'])) : ?> $("select.variation-color").prop('selectedIndex', <?php echo (int)$_GET['color']; ?>).trigger("change"); <?php endif; ?> $("#colors li a").click(function() { var rel = $(this).attr("rel"); $("#colors a.selected-swatch").removeClass("selected-swatch"); $(this).addClass("selected-swatch"); $("select.variation-color").prop('selectedIndex', rel).trigger("change"); return false; }); $("select.variation-color").change(function() { $("#colors a.selected-swatch").removeClass("selected-swatch"); $(this).addClass("selected-swatch"); currentindex = $("select.variation-color")[0].selectedIndex + 1; $("#colors li:nth-child(" + currentindex + ") a").addClass("selected-swatch"); return false; }); }); </script>
With a little bit of adjustment, your swatches can be placed on the category page as well. You may even want to link them to the product with a querystring of “color=2” which will load the second color when the product page is loaded.