---
title: "SureCart: Dynamic Updating Stock Numbers"
date: 2026-01-22T21:29:03Z
modified: 2026-09-22T19:51:44Z
permalink: "https://techarticles.co.uk/surecart-dynamic-updating-stock-numbers/"
type: post
status: publish
excerpt: ""
wpid: 5869
categories:
  - Blog
  - Coding
  - SureCart
  - Wordpress
timestamp: 2026-09-22T19:51:44Z
tags:
  - Blog
  - Coding
  - SureCart
  - Wordpress
---

SureContact was released this week, and it has a limit of 500 lifetime spots. It has a live countdown of the available numbers, which you can see in the image below

![Earlybird lifetime deal offer](https://techarticles.co.uk/wp-content/uploads/2026/01/surecontact-sales-counter.png)

I wanted to recreate this. Now, I already know that if you limit the number of stock [SureCart](https://ta0.uk/surecart) stores, this is in a postmeta called `available_stock` So I already knew what I wanted to display, and I also know that all SureCart Products are effectively a custom post type, so they have a post id.

This means I had the moving parts; all I needed to do was read it and update it. I decided this was best done by creating a mini rest api point for polling this and writing some front-end JS to look for our wrapped shortcode span and update it dynamically. I settled on updating every 5 seconds, but in reality, you could probably set this to 30 seconds, and you could even make it dynamic so it speeds up as they get closer to being “sold out”.

I added a second code here, which hides the output if there is none left, so our countdown isn’t fake, and could be used to hide a section like the SureContact one above.

Example Page:

![Our SALES page offer text](https://techarticles.co.uk/wp-content/uploads/2026/01/what-our-stock-left-page-looks-like.png)

The below gif shows this in action. We start with it hidden because its Zero, we increase to 10,0 then down to 50, and all the updates happen on the page you

![sales count down in action](https://techarticles.co.uk/wp-content/uploads/2026/01/sales-count-down-in-action.gif)

## The Snippet, edit the post id and your poll interval to your setup

<?php

define( 'SC_STOCK_POST_ID', 24 );                  // your post id
define( 'SC_STOCK_META_KEY', 'available_stock' );  // meta key
define( 'SC_STOCK_POLL_SECONDS', 5 );              // <-- poll interval in SECONDS

function sc_get_available_stock( $post_id = null ) {
	$post_id = (int) ( $post_id ?: SC_STOCK_POST_ID );
	if ( $post_id <= 0 ) return 0;

	$val = get_post_meta( $post_id, SC_STOCK_META_KEY, true );

	// If missing, initialize to 0 so everything "just works"
	if ( $val === '' ) {
		add_post_meta( $post_id, SC_STOCK_META_KEY, 0, true );
		$val = 0;
	}

	return max( 0, (int) $val );
}

/**
 * REST endpoint for stock polling
 * GET /wp-json/sc-stock/v1/available
 */
add_action( 'rest_api_init', function() {
	register_rest_route( 'sc-stock/v1', '/available', [
		'methods'             => 'GET',
		'callback'            => function() {
			return [
				'post_id' => SC_STOCK_POST_ID,
				'stock'   => sc_get_available_stock( SC_STOCK_POST_ID ),
			];
		},
		'permission_callback' => '__return_true', // public read (only exposes the number)
	] );
} );

/**
 * [sc_stock_left] shortcode
 * Wrap output in a span so JS can update it live.
 */
add_shortcode( 'sc_stock_left', function( $atts ) {
	$atts = shortcode_atts(
		[
			'prefix'  => '',
			'suffix'  => '',
			'post_id' => 0, // optional override (not used by polling unless you extend it)
		],
		$atts,
		'sc_stock_left'
	);

	$post_id = (int) ( $atts['post_id'] ?: SC_STOCK_POST_ID );
	$stock   = sc_get_available_stock( $post_id );

	$prefix = esc_html( $atts['prefix'] );
	$suffix = esc_html( $atts['suffix'] );

	// data-sc-stock is used by JS to find/update these nodes
	return sprintf(
		'<span data-sc-stock="1" data-sc-prefix="%s" data-sc-suffix="%s">%s%s%s</span>',
		esc_attr( $atts['prefix'] ),
		esc_attr( $atts['suffix'] ),
		$prefix,
		$stock,
		$suffix
	);
} );

/**
 * [sc_if_in_stock] shortcode
 * Wrap content in a container JS can hide/show live.
 */
add_shortcode( 'sc_if_in_stock', function( $atts, $content = '' ) {
	$atts = shortcode_atts(
		[
			'post_id' => 0,
			'min'     => 1,
		],
		$atts,
		'sc_if_in_stock'
	);

	$post_id = (int) ( $atts['post_id'] ?: SC_STOCK_POST_ID );
	$stock   = sc_get_available_stock( $post_id );
	$min     = (int) $atts['min'];

	$inner = do_shortcode( $content );

	// Always render a wrapper so JS can toggle it without a refresh
	$visible = ( $stock >= $min );

	return sprintf(
		'<div data-sc-in-stock="1" data-sc-min="%d" style="%s">%s</div>',
		(int) $min,
		$visible ? '' : 'display:none;',
		$inner
	);
} );

/**
 * Enqueue inline polling JS on the front-end
 */
add_action( 'wp_enqueue_scripts', function() {
	// Only run on the front-end
	if ( is_admin() ) return;

	wp_register_script( 'sc-stock-poll', '', [], null, true );
	wp_enqueue_script( 'sc-stock-poll' );

	$poll_ms  = max( 1000, (int) SC_STOCK_POLL_SECONDS * 1000 );
	$rest_url = esc_url_raw( rest_url( 'sc-stock/v1/available' ) );

	$js = <<<JS
(function(){
  var pollMs = {$poll_ms};
  var endpoint = "{$rest_url}";
  var lastStock = null;

  function updateStockNodes(stock){
    // Update any [sc_stock_left] outputs
    document.querySelectorAll('[data-sc-stock="1"]').forEach(function(el){
      var prefix = el.getAttribute('data-sc-prefix') || '';
      var suffix = el.getAttribute('data-sc-suffix') || '';
      // Use textContent so it stays safe/plain
      el.textContent = prefix + String(stock) + suffix;
    });

    // Toggle any [sc_if_in_stock] wrappers
    document.querySelectorAll('[data-sc-in-stock="1"]').forEach(function(wrap){
      var min = parseInt(wrap.getAttribute('data-sc-min') || '1', 10);
      if (stock >= min) {
        wrap.style.display = '';
      } else {
        wrap.style.display = 'none';
      }
    });
  }

  function tick(){
    fetch(endpoint, { credentials: 'same-origin' })
      .then(function(r){ return r.json(); })
      .then(function(data){
        if (!data || typeof data.stock === 'undefined') return;
        var stock = parseInt(data.stock, 10);
        if (isNaN(stock)) return;

        if (lastStock === null || stock !== lastStock) {
          lastStock = stock;
          updateStockNodes(stock);
        }
      })
      .catch(function(){ /* silent */ });
  }

  // initial + interval
  tick();
  setInterval(tick, pollMs);
})();
JS;

	wp_add_inline_script( 'sc-stock-poll', $js );
} );
```
<span class="line"><span style="color: #F97583"><?</span><span style="color: #79B8FF">php</span></span>
<span class="line"></span>
<span class="line"><span style="color: #79B8FF">define</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'SC_STOCK_POST_ID'</span><span style="color: #E1E4E8">, </span><span style="color: #79B8FF">24</span><span style="color: #E1E4E8"> );                  </span><span style="color: #6A737D">// your post id</span></span>
<span class="line"><span style="color: #79B8FF">define</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'SC_STOCK_META_KEY'</span><span style="color: #E1E4E8">, </span><span style="color: #9ECBFF">'available_stock'</span><span style="color: #E1E4E8"> );  </span><span style="color: #6A737D">// meta key</span></span>
<span class="line"><span style="color: #79B8FF">define</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'SC_STOCK_POLL_SECONDS'</span><span style="color: #E1E4E8">, </span><span style="color: #79B8FF">5</span><span style="color: #E1E4E8"> );              </span><span style="color: #6A737D">// <-- poll interval in SECONDS</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F97583">function</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">sc_get_available_stock</span><span style="color: #E1E4E8">( $post_id </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">null</span><span style="color: #E1E4E8"> ) {</span></span>
<span class="line"><span style="color: #E1E4E8">	$post_id </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> (</span><span style="color: #F97583">int</span><span style="color: #E1E4E8">) ( $post_id </span><span style="color: #F97583">?:</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">SC_STOCK_POST_ID</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"><span style="color: #E1E4E8">	</span><span style="color: #F97583">if</span><span style="color: #E1E4E8"> ( $post_id </span><span style="color: #F97583"><=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">0</span><span style="color: #E1E4E8"> ) </span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">0</span><span style="color: #E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">	$val </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">get_post_meta</span><span style="color: #E1E4E8">( $post_id, </span><span style="color: #79B8FF">SC_STOCK_META_KEY</span><span style="color: #E1E4E8">, </span><span style="color: #79B8FF">true</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">	</span><span style="color: #6A737D">// If missing, initialize to 0 so everything "just works"</span></span>
<span class="line"><span style="color: #E1E4E8">	</span><span style="color: #F97583">if</span><span style="color: #E1E4E8"> ( $val </span><span style="color: #F97583">===</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">''</span><span style="color: #E1E4E8"> ) {</span></span>
<span class="line"><span style="color: #E1E4E8">		</span><span style="color: #B392F0">add_post_meta</span><span style="color: #E1E4E8">( $post_id, </span><span style="color: #79B8FF">SC_STOCK_META_KEY</span><span style="color: #E1E4E8">, </span><span style="color: #79B8FF">0</span><span style="color: #E1E4E8">, </span><span style="color: #79B8FF">true</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"><span style="color: #E1E4E8">		$val </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">0</span><span style="color: #E1E4E8">;</span></span>
<span class="line"><span style="color: #E1E4E8">	}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">	</span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">max</span><span style="color: #E1E4E8">( </span><span style="color: #79B8FF">0</span><span style="color: #E1E4E8">, (</span><span style="color: #F97583">int</span><span style="color: #E1E4E8">) $val );</span></span>
<span class="line"><span style="color: #E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">/**</span></span>
<span class="line"><span style="color: #6A737D"> * REST endpoint for stock polling</span></span>
<span class="line"><span style="color: #6A737D"> * GET /wp-json/sc-stock/v1/available</span></span>
<span class="line"><span style="color: #6A737D"> */</span></span>
<span class="line"><span style="color: #B392F0">add_action</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'rest_api_init'</span><span style="color: #E1E4E8">, </span><span style="color: #F97583">function</span><span style="color: #E1E4E8">() {</span></span>
<span class="line"><span style="color: #E1E4E8">	</span><span style="color: #B392F0">register_rest_route</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'sc-stock/v1'</span><span style="color: #E1E4E8">, </span><span style="color: #9ECBFF">'/available'</span><span style="color: #E1E4E8">, [</span></span>
<span class="line"><span style="color: #E1E4E8">		</span><span style="color: #9ECBFF">'methods'</span><span style="color: #E1E4E8">             </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'GET'</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">		</span><span style="color: #9ECBFF">'callback'</span><span style="color: #E1E4E8">            </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #F97583">function</span><span style="color: #E1E4E8">() {</span></span>
<span class="line"><span style="color: #E1E4E8">			</span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> [</span></span>
<span class="line"><span style="color: #E1E4E8">				</span><span style="color: #9ECBFF">'post_id'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">SC_STOCK_POST_ID</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">				</span><span style="color: #9ECBFF">'stock'</span><span style="color: #E1E4E8">   </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">sc_get_available_stock</span><span style="color: #E1E4E8">( </span><span style="color: #79B8FF">SC_STOCK_POST_ID</span><span style="color: #E1E4E8"> ),</span></span>
<span class="line"><span style="color: #E1E4E8">			];</span></span>
<span class="line"><span style="color: #E1E4E8">		},</span></span>
<span class="line"><span style="color: #E1E4E8">		</span><span style="color: #9ECBFF">'permission_callback'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'__return_true'</span><span style="color: #E1E4E8">, </span><span style="color: #6A737D">// public read (only exposes the number)</span></span>
<span class="line"><span style="color: #E1E4E8">	] );</span></span>
<span class="line"><span style="color: #E1E4E8">} );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">/**</span></span>
<span class="line"><span style="color: #6A737D"> * [sc_stock_left] shortcode</span></span>
<span class="line"><span style="color: #6A737D"> * Wrap output in a span so JS can update it live.</span></span>
<span class="line"><span style="color: #6A737D"> */</span></span>
<span class="line"><span style="color: #B392F0">add_shortcode</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'sc_stock_left'</span><span style="color: #E1E4E8">, </span><span style="color: #F97583">function</span><span style="color: #E1E4E8">( $atts ) {</span></span>
<span class="line"><span style="color: #E1E4E8">	$atts </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">shortcode_atts</span><span style="color: #E1E4E8">(</span></span>
<span class="line"><span style="color: #E1E4E8">		[</span></span>
<span class="line"><span style="color: #E1E4E8">			</span><span style="color: #9ECBFF">'prefix'</span><span style="color: #E1E4E8">  </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">''</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">			</span><span style="color: #9ECBFF">'suffix'</span><span style="color: #E1E4E8">  </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">''</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">			</span><span style="color: #9ECBFF">'post_id'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">0</span><span style="color: #E1E4E8">, </span><span style="color: #6A737D">// optional override (not used by polling unless you extend it)</span></span>
<span class="line"><span style="color: #E1E4E8">		],</span></span>
<span class="line"><span style="color: #E1E4E8">		$atts,</span></span>
<span class="line"><span style="color: #E1E4E8">		</span><span style="color: #9ECBFF">'sc_stock_left'</span></span>
<span class="line"><span style="color: #E1E4E8">	);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">	$post_id </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> (</span><span style="color: #F97583">int</span><span style="color: #E1E4E8">) ( $atts[</span><span style="color: #9ECBFF">'post_id'</span><span style="color: #E1E4E8">] </span><span style="color: #F97583">?:</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">SC_STOCK_POST_ID</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"><span style="color: #E1E4E8">	$stock   </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">sc_get_available_stock</span><span style="color: #E1E4E8">( $post_id );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">	$prefix </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">esc_html</span><span style="color: #E1E4E8">( $atts[</span><span style="color: #9ECBFF">'prefix'</span><span style="color: #E1E4E8">] );</span></span>
<span class="line"><span style="color: #E1E4E8">	$suffix </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">esc_html</span><span style="color: #E1E4E8">( $atts[</span><span style="color: #9ECBFF">'suffix'</span><span style="color: #E1E4E8">] );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">	</span><span style="color: #6A737D">// data-sc-stock is used by JS to find/update these nodes</span></span>
<span class="line"><span style="color: #E1E4E8">	</span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">sprintf</span><span style="color: #E1E4E8">(</span></span>
<span class="line"><span style="color: #E1E4E8">		</span><span style="color: #9ECBFF">'<span data-sc-stock="1" data-sc-prefix="%s" data-sc-suffix="%s">%s%s%s</span>'</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">		</span><span style="color: #B392F0">esc_attr</span><span style="color: #E1E4E8">( $atts[</span><span style="color: #9ECBFF">'prefix'</span><span style="color: #E1E4E8">] ),</span></span>
<span class="line"><span style="color: #E1E4E8">		</span><span style="color: #B392F0">esc_attr</span><span style="color: #E1E4E8">( $atts[</span><span style="color: #9ECBFF">'suffix'</span><span style="color: #E1E4E8">] ),</span></span>
<span class="line"><span style="color: #E1E4E8">		$prefix,</span></span>
<span class="line"><span style="color: #E1E4E8">		$stock,</span></span>
<span class="line"><span style="color: #E1E4E8">		$suffix</span></span>
<span class="line"><span style="color: #E1E4E8">	);</span></span>
<span class="line"><span style="color: #E1E4E8">} );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">/**</span></span>
<span class="line"><span style="color: #6A737D"> * [sc_if_in_stock] shortcode</span></span>
<span class="line"><span style="color: #6A737D"> * Wrap content in a container JS can hide/show live.</span></span>
<span class="line"><span style="color: #6A737D"> */</span></span>
<span class="line"><span style="color: #B392F0">add_shortcode</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'sc_if_in_stock'</span><span style="color: #E1E4E8">, </span><span style="color: #F97583">function</span><span style="color: #E1E4E8">( $atts, $content </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">''</span><span style="color: #E1E4E8"> ) {</span></span>
<span class="line"><span style="color: #E1E4E8">	$atts </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">shortcode_atts</span><span style="color: #E1E4E8">(</span></span>
<span class="line"><span style="color: #E1E4E8">		[</span></span>
<span class="line"><span style="color: #E1E4E8">			</span><span style="color: #9ECBFF">'post_id'</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">0</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">			</span><span style="color: #9ECBFF">'min'</span><span style="color: #E1E4E8">     </span><span style="color: #F97583">=></span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">1</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">		],</span></span>
<span class="line"><span style="color: #E1E4E8">		$atts,</span></span>
<span class="line"><span style="color: #E1E4E8">		</span><span style="color: #9ECBFF">'sc_if_in_stock'</span></span>
<span class="line"><span style="color: #E1E4E8">	);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">	$post_id </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> (</span><span style="color: #F97583">int</span><span style="color: #E1E4E8">) ( $atts[</span><span style="color: #9ECBFF">'post_id'</span><span style="color: #E1E4E8">] </span><span style="color: #F97583">?:</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">SC_STOCK_POST_ID</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"><span style="color: #E1E4E8">	$stock   </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">sc_get_available_stock</span><span style="color: #E1E4E8">( $post_id );</span></span>
<span class="line"><span style="color: #E1E4E8">	$min     </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> (</span><span style="color: #F97583">int</span><span style="color: #E1E4E8">) $atts[</span><span style="color: #9ECBFF">'min'</span><span style="color: #E1E4E8">];</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">	$inner </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">do_shortcode</span><span style="color: #E1E4E8">( $content );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">	</span><span style="color: #6A737D">// Always render a wrapper so JS can toggle it without a refresh</span></span>
<span class="line"><span style="color: #E1E4E8">	$visible </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> ( $stock </span><span style="color: #F97583">>=</span><span style="color: #E1E4E8"> $min );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">	</span><span style="color: #F97583">return</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">sprintf</span><span style="color: #E1E4E8">(</span></span>
<span class="line"><span style="color: #E1E4E8">		</span><span style="color: #9ECBFF">'<div data-sc-in-stock="1" data-sc-min="%d" style="%s">%s</div>'</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">		(</span><span style="color: #F97583">int</span><span style="color: #E1E4E8">) $min,</span></span>
<span class="line"><span style="color: #E1E4E8">		$visible </span><span style="color: #F97583">?</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">''</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">:</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF">'display:none;'</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">		$inner</span></span>
<span class="line"><span style="color: #E1E4E8">	);</span></span>
<span class="line"><span style="color: #E1E4E8">} );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A737D">/**</span></span>
<span class="line"><span style="color: #6A737D"> * Enqueue inline polling JS on the front-end</span></span>
<span class="line"><span style="color: #6A737D"> */</span></span>
<span class="line"><span style="color: #B392F0">add_action</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'wp_enqueue_scripts'</span><span style="color: #E1E4E8">, </span><span style="color: #F97583">function</span><span style="color: #E1E4E8">() {</span></span>
<span class="line"><span style="color: #E1E4E8">	</span><span style="color: #6A737D">// Only run on the front-end</span></span>
<span class="line"><span style="color: #E1E4E8">	</span><span style="color: #F97583">if</span><span style="color: #E1E4E8"> ( </span><span style="color: #B392F0">is_admin</span><span style="color: #E1E4E8">() ) </span><span style="color: #F97583">return</span><span style="color: #E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">	</span><span style="color: #B392F0">wp_register_script</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'sc-stock-poll'</span><span style="color: #E1E4E8">, </span><span style="color: #9ECBFF">''</span><span style="color: #E1E4E8">, [], </span><span style="color: #79B8FF">null</span><span style="color: #E1E4E8">, </span><span style="color: #79B8FF">true</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"><span style="color: #E1E4E8">	</span><span style="color: #B392F0">wp_enqueue_script</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'sc-stock-poll'</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">	$poll_ms  </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">max</span><span style="color: #E1E4E8">( </span><span style="color: #79B8FF">1000</span><span style="color: #E1E4E8">, (</span><span style="color: #F97583">int</span><span style="color: #E1E4E8">) </span><span style="color: #79B8FF">SC_STOCK_POLL_SECONDS</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">*</span><span style="color: #E1E4E8"> </span><span style="color: #79B8FF">1000</span><span style="color: #E1E4E8"> );</span></span>
<span class="line"><span style="color: #E1E4E8">	$rest_url </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">esc_url_raw</span><span style="color: #E1E4E8">( </span><span style="color: #B392F0">rest_url</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'sc-stock/v1/available'</span><span style="color: #E1E4E8"> ) );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">	$js </span><span style="color: #F97583">=</span><span style="color: #E1E4E8"> </span><span style="color: #9ECBFF"><<<</span><span style="color: #F97583">JS</span></span>
<span class="line"><span style="color: #9ECBFF">(</span><span style="color: #F97583">function</span><span style="color: #9ECBFF">(){</span></span>
<span class="line"><span style="color: #9ECBFF">  </span><span style="color: #F97583">var</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">pollMs</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">=</span><span style="color: #9ECBFF"> {</span><span style="color: #E1E4E8">$poll_ms</span><span style="color: #9ECBFF">};</span></span>
<span class="line"><span style="color: #9ECBFF">  </span><span style="color: #F97583">var</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">endpoint</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">=</span><span style="color: #9ECBFF"> </span><span style="color: #9ECBFF">"{$rest_url}"</span><span style="color: #9ECBFF">;</span></span>
<span class="line"><span style="color: #9ECBFF">  </span><span style="color: #F97583">var</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">lastStock</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">=</span><span style="color: #9ECBFF"> </span><span style="color: #79B8FF">null</span><span style="color: #9ECBFF">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9ECBFF">  </span><span style="color: #F97583">function</span><span style="color: #9ECBFF"> </span><span style="color: #B392F0">updateStockNodes</span><span style="color: #9ECBFF">(</span><span style="color: #79B8FF">stock</span><span style="color: #9ECBFF">){</span></span>
<span class="line"><span style="color: #9ECBFF">    </span><span style="color: #6A737D">// Update any [sc_stock_left] outputs</span></span>
<span class="line"><span style="color: #9ECBFF">    </span><span style="color: #E1E4E8">document</span><span style="color: #9ECBFF">.</span><span style="color: #B392F0">querySelectorAll</span><span style="color: #9ECBFF">(</span><span style="color: #9ECBFF">'[data-sc-stock="1"]'</span><span style="color: #9ECBFF">).</span><span style="color: #B392F0">forEach</span><span style="color: #9ECBFF">(</span><span style="color: #F97583">function</span><span style="color: #9ECBFF">(</span><span style="color: #79B8FF">el</span><span style="color: #9ECBFF">){</span></span>
<span class="line"><span style="color: #9ECBFF">      </span><span style="color: #F97583">var</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">prefix</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">=</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">el</span><span style="color: #9ECBFF">.</span><span style="color: #B392F0">getAttribute</span><span style="color: #9ECBFF">(</span><span style="color: #9ECBFF">'data-sc-prefix'</span><span style="color: #9ECBFF">) </span><span style="color: #F97583">||</span><span style="color: #9ECBFF"> </span><span style="color: #9ECBFF">''</span><span style="color: #9ECBFF">;</span></span>
<span class="line"><span style="color: #9ECBFF">      </span><span style="color: #F97583">var</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">suffix</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">=</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">el</span><span style="color: #9ECBFF">.</span><span style="color: #B392F0">getAttribute</span><span style="color: #9ECBFF">(</span><span style="color: #9ECBFF">'data-sc-suffix'</span><span style="color: #9ECBFF">) </span><span style="color: #F97583">||</span><span style="color: #9ECBFF"> </span><span style="color: #9ECBFF">''</span><span style="color: #9ECBFF">;</span></span>
<span class="line"><span style="color: #9ECBFF">      </span><span style="color: #6A737D">// Use textContent so it stays safe/plain</span></span>
<span class="line"><span style="color: #9ECBFF">      </span><span style="color: #E1E4E8">el</span><span style="color: #9ECBFF">.</span><span style="color: #E1E4E8">textContent</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">=</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">prefix</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">+</span><span style="color: #9ECBFF"> </span><span style="color: #B392F0">String</span><span style="color: #9ECBFF">(</span><span style="color: #E1E4E8">stock</span><span style="color: #9ECBFF">) </span><span style="color: #F97583">+</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">suffix</span><span style="color: #9ECBFF">;</span></span>
<span class="line"><span style="color: #9ECBFF">    });</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9ECBFF">    </span><span style="color: #6A737D">// Toggle any [sc_if_in_stock] wrappers</span></span>
<span class="line"><span style="color: #9ECBFF">    </span><span style="color: #E1E4E8">document</span><span style="color: #9ECBFF">.</span><span style="color: #B392F0">querySelectorAll</span><span style="color: #9ECBFF">(</span><span style="color: #9ECBFF">'[data-sc-in-stock="1"]'</span><span style="color: #9ECBFF">).</span><span style="color: #B392F0">forEach</span><span style="color: #9ECBFF">(</span><span style="color: #F97583">function</span><span style="color: #9ECBFF">(</span><span style="color: #79B8FF">wrap</span><span style="color: #9ECBFF">){</span></span>
<span class="line"><span style="color: #9ECBFF">      </span><span style="color: #F97583">var</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">min</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">=</span><span style="color: #9ECBFF"> </span><span style="color: #B392F0">parseInt</span><span style="color: #9ECBFF">(</span><span style="color: #E1E4E8">wrap</span><span style="color: #9ECBFF">.</span><span style="color: #B392F0">getAttribute</span><span style="color: #9ECBFF">(</span><span style="color: #9ECBFF">'data-sc-min'</span><span style="color: #9ECBFF">) </span><span style="color: #F97583">||</span><span style="color: #9ECBFF"> </span><span style="color: #9ECBFF">'1'</span><span style="color: #9ECBFF">, </span><span style="color: #79B8FF">10</span><span style="color: #9ECBFF">);</span></span>
<span class="line"><span style="color: #9ECBFF">      </span><span style="color: #F97583">if</span><span style="color: #9ECBFF"> (</span><span style="color: #E1E4E8">stock</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">>=</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">min</span><span style="color: #9ECBFF">) {</span></span>
<span class="line"><span style="color: #9ECBFF">        </span><span style="color: #E1E4E8">wrap</span><span style="color: #9ECBFF">.</span><span style="color: #E1E4E8">style</span><span style="color: #9ECBFF">.</span><span style="color: #E1E4E8">display</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">=</span><span style="color: #9ECBFF"> </span><span style="color: #9ECBFF">''</span><span style="color: #9ECBFF">;</span></span>
<span class="line"><span style="color: #9ECBFF">      } </span><span style="color: #F97583">else</span><span style="color: #9ECBFF"> {</span></span>
<span class="line"><span style="color: #9ECBFF">        </span><span style="color: #E1E4E8">wrap</span><span style="color: #9ECBFF">.</span><span style="color: #E1E4E8">style</span><span style="color: #9ECBFF">.</span><span style="color: #E1E4E8">display</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">=</span><span style="color: #9ECBFF"> </span><span style="color: #9ECBFF">'none'</span><span style="color: #9ECBFF">;</span></span>
<span class="line"><span style="color: #9ECBFF">      }</span></span>
<span class="line"><span style="color: #9ECBFF">    });</span></span>
<span class="line"><span style="color: #9ECBFF">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9ECBFF">  </span><span style="color: #F97583">function</span><span style="color: #9ECBFF"> </span><span style="color: #B392F0">tick</span><span style="color: #9ECBFF">(){</span></span>
<span class="line"><span style="color: #9ECBFF">    </span><span style="color: #B392F0">fetch</span><span style="color: #9ECBFF">(</span><span style="color: #E1E4E8">endpoint</span><span style="color: #9ECBFF">, { credentials: </span><span style="color: #9ECBFF">'same-origin'</span><span style="color: #9ECBFF"> })</span></span>
<span class="line"><span style="color: #9ECBFF">      .</span><span style="color: #B392F0">then</span><span style="color: #9ECBFF">(</span><span style="color: #F97583">function</span><span style="color: #9ECBFF">(</span><span style="color: #79B8FF">r</span><span style="color: #9ECBFF">){ </span><span style="color: #F97583">return</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">r</span><span style="color: #9ECBFF">.</span><span style="color: #B392F0">json</span><span style="color: #9ECBFF">(); })</span></span>
<span class="line"><span style="color: #9ECBFF">      .</span><span style="color: #B392F0">then</span><span style="color: #9ECBFF">(</span><span style="color: #F97583">function</span><span style="color: #9ECBFF">(</span><span style="color: #79B8FF">data</span><span style="color: #9ECBFF">){</span></span>
<span class="line"><span style="color: #9ECBFF">        </span><span style="color: #F97583">if</span><span style="color: #9ECBFF"> (</span><span style="color: #F97583">!</span><span style="color: #E1E4E8">data</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">||</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">typeof</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">data</span><span style="color: #9ECBFF">.</span><span style="color: #E1E4E8">stock</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">===</span><span style="color: #9ECBFF"> </span><span style="color: #9ECBFF">'undefined'</span><span style="color: #9ECBFF">) </span><span style="color: #F97583">return</span><span style="color: #9ECBFF">;</span></span>
<span class="line"><span style="color: #9ECBFF">        </span><span style="color: #F97583">var</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">stock</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">=</span><span style="color: #9ECBFF"> </span><span style="color: #B392F0">parseInt</span><span style="color: #9ECBFF">(</span><span style="color: #E1E4E8">data</span><span style="color: #9ECBFF">.</span><span style="color: #E1E4E8">stock</span><span style="color: #9ECBFF">, </span><span style="color: #79B8FF">10</span><span style="color: #9ECBFF">);</span></span>
<span class="line"><span style="color: #9ECBFF">        </span><span style="color: #F97583">if</span><span style="color: #9ECBFF"> (</span><span style="color: #B392F0">isNaN</span><span style="color: #9ECBFF">(</span><span style="color: #E1E4E8">stock</span><span style="color: #9ECBFF">)) </span><span style="color: #F97583">return</span><span style="color: #9ECBFF">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9ECBFF">        </span><span style="color: #F97583">if</span><span style="color: #9ECBFF"> (</span><span style="color: #E1E4E8">lastStock</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">===</span><span style="color: #9ECBFF"> </span><span style="color: #79B8FF">null</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">||</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">stock</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">!==</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">lastStock</span><span style="color: #9ECBFF">) {</span></span>
<span class="line"><span style="color: #9ECBFF">          </span><span style="color: #E1E4E8">lastStock</span><span style="color: #9ECBFF"> </span><span style="color: #F97583">=</span><span style="color: #9ECBFF"> </span><span style="color: #E1E4E8">stock</span><span style="color: #9ECBFF">;</span></span>
<span class="line"><span style="color: #9ECBFF">          </span><span style="color: #B392F0">updateStockNodes</span><span style="color: #9ECBFF">(</span><span style="color: #E1E4E8">stock</span><span style="color: #9ECBFF">);</span></span>
<span class="line"><span style="color: #9ECBFF">        }</span></span>
<span class="line"><span style="color: #9ECBFF">      })</span></span>
<span class="line"><span style="color: #9ECBFF">      .</span><span style="color: #B392F0">catch</span><span style="color: #9ECBFF">(</span><span style="color: #F97583">function</span><span style="color: #9ECBFF">(){ </span><span style="color: #6A737D">/* silent */</span><span style="color: #9ECBFF"> });</span></span>
<span class="line"><span style="color: #9ECBFF">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9ECBFF">  </span><span style="color: #6A737D">// initial + interval</span></span>
<span class="line"><span style="color: #9ECBFF">  </span><span style="color: #B392F0">tick</span><span style="color: #9ECBFF">();</span></span>
<span class="line"><span style="color: #9ECBFF">  </span><span style="color: #B392F0">setInterval</span><span style="color: #9ECBFF">(</span><span style="color: #E1E4E8">tick</span><span style="color: #9ECBFF">, </span><span style="color: #E1E4E8">pollMs</span><span style="color: #9ECBFF">);</span></span>
<span class="line"><span style="color: #9ECBFF">})();</span></span>
<span class="line"><span style="color: #F97583">JS</span><span style="color: #E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #E1E4E8">	</span><span style="color: #B392F0">wp_add_inline_script</span><span style="color: #E1E4E8">( </span><span style="color: #9ECBFF">'sc-stock-poll'</span><span style="color: #E1E4E8">, $js );</span></span>
<span class="line"><span style="color: #E1E4E8">} );</span></span>
<span class="line"></span>
```PHP

![](https://i.ytimg.com/vi/oINTGH95y9c/maxresdefault.jpg)