Last active
April 3, 2020 12:44
-
-
Save zoerooney/8969dfb91947e5327481 to your computer and use it in GitHub Desktop.
Shopify Collection Embedded in WordPress
This file contains hidden or 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 | |
/** | |
* Template Name: Shopify Collection Demo | |
* | |
*/ | |
get_header(); ?> | |
<div id="primary" class="full-width"> | |
<?php while ( have_posts() ) : the_post(); ?> | |
<style> | |
.product-feed-item { | |
display: inline-block; | |
vertical-align: top; | |
width: 31%; | |
margin-right: 2%; | |
text-align: center; | |
} | |
.product-feed-item img { | |
max-width: 100%; | |
height: auto; | |
} | |
</style> | |
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>> | |
<header class="entry-header"> | |
<h1 class="page-title"><?php the_title(); ?></h1> | |
</header><!-- .entry-header --> | |
<div class="entry-content"> | |
<?php the_content(); ?> | |
</div><!-- .entry-content --> | |
<div class="row product-feed"> | |
<?php | |
// Set variables | |
$api_url = get_field( 'shopify_app_api_url' ); | |
$shop_url = get_field( 'shopify_site_url' ); | |
$collection_id = get_field( 'collection_id' ); | |
// Create the API URL for the Shopify collect | |
$collects_url = $api_url . '/admin/collects.json?collection_id=' . $collection_id . '&limit=3'; | |
// Use a transient for the feed URL (performance boost) | |
if ( false === ( $collects_content = get_transient( 'shopify_product_feed' ) ) ) { | |
$collects_content = @file_get_contents( $collects_url ); | |
// Put the results in a transient. Expire after 4 hours. | |
set_transient( 'shopify_product_feed', $collects_content, 4 * HOUR_IN_SECONDS ); | |
} | |
// Decode the JSON in the file | |
$collects = json_decode( $collects_content, true ); | |
// Reset variant inventory count | |
$variant_inventory = 0; | |
// Loop through products in the collection | |
for ( $prod = 0; $prod < 3; $prod++ ) { | |
// Get the product ID for the current product | |
$product_id = $collects['collects'][$prod]['product_id']; | |
// Get the product data from the API (using the ID) | |
$product_url = $api_url . '/admin/products/' . $product_id . '.json?fields=images,title,variants,handle'; | |
// Decode the JSON for the product data | |
$product_json = json_decode( @file_get_contents( $product_url ), true ); | |
// Set some variables for product data | |
$current_product = $product_json['product']; | |
$product_handle = $current_product['handle']; | |
$product_title = $current_product['title']; | |
// Get the product image and modify the file name to get a thumbnail | |
$image_src_parts = pathinfo( $current_product['images'][0]['src'] ); | |
$product_image_src = $image_src_parts['dirname'] . '/' . $image_src_parts['filename'] . '_large.' . $image_src_parts['extension']; | |
// Get product variant information, including inventory and pricing | |
$variants = $current_product['variants']; | |
$variant_count = count( $variants ); | |
$variant_price = 0; | |
$variant_prices = array(); | |
if ( $variant_count > 1 ) : | |
for ( $v = 0; $v < $variant_count; $v++ ) { | |
$variant_inventory += $variants[$v]['inventory_quantity']; | |
$variant_prices[] = $variants[$v]['price']; | |
} | |
$price_min = min( $variant_prices ); | |
$price_max = max( $variant_prices ); | |
else : | |
$variant_price = $variants[0]['price']; | |
$variant_inventory = $variants[0]['inventory_quantity']; | |
endif; | |
// Display the product: | |
?> | |
<div class="product-feed-item"> | |
<a href="<?php echo $shop_url; ?>/products/<?php echo $product_handle; ?>"> | |
<img src="<?php echo $product_image_src; ?>" alt="<?php echo $product_title; ?>"/> | |
<h3><?php echo $product_title; ?></h3> | |
<?php if ( $variant_inventory > 0 ) : ?> | |
<?php if ( $variant_price > 0 ) : ?> | |
<span class="price small"><?php if ( $variant_price > 0 ) : ?>$<?php echo $variant_price; ?><?php else : ?>FREE<?php endif; ?></span> | |
<?php elseif ( ( $price_min > 0 ) && ( $price_max > 0 ) ) : ?> | |
<span class="price small">$<?php echo $price_min; ?> - $<?php echo $price_max; ?></span> | |
<?php endif; ?> | |
<?php else : ?> | |
<span class="sold-out">OUT OF STOCK</span> | |
<?php endif; ?> | |
</a> | |
</div> | |
<?php | |
} ?> | |
</div><!-- end product feed --> | |
</article> | |
<?php endwhile; ?> | |
</div><!-- #primary --> | |
<?php get_footer(); ?> |
Great Tutorial! . I also want add to cart button. Can you Help Me?
Thanks @zoerooney, planning to use this technique very soon.
Did you imply to use the wp_remote_get function somewhere in the code, by commenting that? I assume instead of file_get_contents? Which means, it's a better option..?
Hi Zoe,
something goes wrong ..displaying error ..Warning: count(): Parameter must be an array or an object that implements Countable in ...on line 82
do you have any idea?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi Zoe,
Found your tutorial: http://www.sitepoint.com/using-the-shopify-api-with-wordpress/ and used it to set up a Shopify/Wordpress site for my client at www.rainiersun.com. Thank you so much for writing this tutorial -- it was a huge help.
I did find one issue with the transient variable, and reusing the page template for different collections. I found if I named the transient 'shopify_product_feed_' . $collection_id . '', instead of just 'shopify_product_feed', I could use the the template for multiple collections -- otherwise only one collection would show up if I used the template on separate pages linked to separate collections.
Here's one: http://www.rainiersun.com/style-5063-childrens-sun-hat/
And another: http://www.rainiersun.com/adult-sun-hat-collection/
Thanks again!
LeeAnne Egge
Writecraft Enterprises
Olympia, WA USA