As a digital agency specialising in providing our resourcing and project management services to a wide range of agencies we are often presented with unusual requests. This one was for a high end art gallery that wanted to give its customers the option to view artwork that had already been sold, in addition to products currently on sale.

Having searched for an online solution and finding none, only others looking for a similar solution we thought we’d show you how we did this – hope it helps anyone else looking for similar functionality.


Title Quote

Adding a simple button to show or hide sold products


Front End Developer

Here’s the code to be added on your current theme’s functions.php

function hide_sold_products_param() {
global $wp;
add_filter('init', 'hide_sold_products_param');
add_action('pre_get_posts', 'hide_sold_products_query', 10);
function hide_sold_products_query($query){
if($query->get('hide_sold_products') == 'true'){
$query->set('meta_query', array(
'key' => '_stock_status',
'value' => 'outofstock',
'compare' => 'NOT IN'

The function “hide_sold_products_param()” is for initializing the parameter “hide_sold_products” which we will be using on the query for toggling the Hide/Show Sold Products.

The function “hide_sold_products_query” is for querying the products that do not have the “out of stock” Stock Status.

On your Woocommerce Products archive page, you will need to add a button to toggle the Hide/Show Sold Products. We did this by appending a button on top of the Sorting dropdown of the Products archive page. The code was added by overriding the default orderby.php file of Woocommerce (wp-content/plugins/woocommerce/templates/loop/orderby). You can do it by copying the contents of the orderby.php, adding the code snippet below, and putting it on your current theme (by adding a new orderby.php file in this directory: wp-content/[theme-name]/woocommerce/loop/). You can add this before the <form> element.

global $wp;
$current_url = home_url(add_query_arg(array(),$wp->request));
<?php if (isset($_GET['hide_sold_products']) && $_GET['hide_sold_products'] === 'true') {?>
<a href="<?php echo $current_url; ?>" class="btn btn-primary">Show Sold Products</a>
<?php }else{ ?>
<a href="<?php echo $current_url; ?>/?hide_sold_products=true" class="btn btn-primary">Hide Sold Products</a>
<?php } ?>

First we will need to get the current url, then we will use it to verify if it has a parameter “hide_sold_products” with the value ‘true’. If it has, then this will call the “hide_sold_products_query” function which we added on the functions.php. This will display the products that are still available (and a button “Show Sold Products” to toggle it inversely). If it doesn’t have the parameter “hide_sold_products” (meaning, this is the default url of the Products Archive page), all the products, both sold and available, will be displayed.


Author of this post


Privacy Preference Center

Privacy Management

This is used to save your privacy and cookie settings for this site.


Google Analytics

Anonymous tracking of site statistics with Google Analytics

_ga, _gat, _gid

Close your account?

Your account will be closed and all data will be permanently deleted and cannot be recovered. Are you sure?