Skip to content

Instantly share code, notes, and snippets.

@statickidz
Last active February 24, 2024 04:35
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save statickidz/6a539550d8e0d13d2c3d12318672e816 to your computer and use it in GitHub Desktop.
Save statickidz/6a539550d8e0d13d2c3d12318672e816 to your computer and use it in GitHub Desktop.
Woocommerce - Show Custom Filter and Admin Column for Catalog Visibility
<?php
/**
* @snippet Show Custom Filter and Admin Column for Catalog Visibility @ WooCommerce Products Admin
* @sourcecode https://gist.github.com/statickidz/6a539550d8e0d13d2c3d12318672e816
* @author Adrián Barrio Andrés (statickidz.com)
*/
add_filter('woocommerce_product_filters', 'skidz_filter_by_catalog_visibility_dashboard_products');
function skidz_filter_by_catalog_visibility_dashboard_products($output)
{
$selected_visible = isset($_GET['catalog_visibility']) && $_GET['catalog_visibility'] === 'visible' ? 'selected' : '';
$selected_hidden = isset($_GET['catalog_visibility']) && $_GET['catalog_visibility'] === 'hidden' ? 'selected' : '';
$selected_catalog = isset($_GET['catalog_visibility']) && $_GET['catalog_visibility'] === 'catalog' ? 'selected' : '';
$selected_search = isset($_GET['catalog_visibility']) && $_GET['catalog_visibility'] === 'search' ? 'selected' : '';
$output .= '
<select name="catalog_visibility">
<option value="">' . __('Filter by', 'woocommerce') . ' ' . __('Visibility', 'woocommerce') . '</option>
<option value="visible" ' . $selected_visible . '>' . __('Shop and search results', 'woocommerce') . '</option>
<option value="catalog" ' . $selected_catalog . '>' . __('Shop only', 'woocommerce') . '</option>
<option value="search" ' . $selected_search . '>' . __('Search results only', 'woocommerce') . '</option>
<option value="hidden" ' . $selected_hidden . '>' . __('Hidden', 'woocommerce') . '</option>
</select>';
return $output;
}
add_filter('parse_query', 'skidz_catalog_visibility_filter');
function skidz_catalog_visibility_filter($query)
{
global $pagenow;
$type = 'product';
if (isset($_GET['post_type'])) {
$type = $_GET['post_type'];
}
if ('product' == $type && is_admin() && $pagenow == 'edit.php' && isset($_GET['catalog_visibility']) && $_GET['catalog_visibility'] != '') {
$catalog_visibility = $_GET['catalog_visibility'];
$additional_query = array();
if ($catalog_visibility === 'hidden') {
$additional_query = array(
'relation' => 'AND',
array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => array('exclude-from-search'),
),
array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => array('exclude-from-catalog'),
),
);
} else if ($catalog_visibility === 'visible') {
$additional_query = array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => array('exclude-from-search', 'exclude-from-catalog'),
'operator' => 'NOT IN',
);
} else if ($catalog_visibility === 'catalog') {
$additional_query = array(
'relation' => 'AND',
array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => array('exclude-from-search'),
'operator' => 'IN',
),
array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => array('exclude-from-catalog'),
'operator' => 'NOT IN',
),
);
} else if ($catalog_visibility === 'search') {
$additional_query = array(
'relation' => 'AND',
array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => array('exclude-from-search'),
'operator' => 'NOT IN',
),
array(
'taxonomy' => 'product_visibility',
'field' => 'slug',
'terms' => array('exclude-from-catalog'),
'operator' => 'IN',
),
);
}
$query->tax_query->queries[] = $additional_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
}
}
@talistech
Copy link

Thank you!

@ned-bs
Copy link

ned-bs commented Feb 6, 2024

update last 4 lines with this to avoid errors.

    // Ensure $query->tax_query is an object and has the 'queries' property initialized
        if ( ! is_object( $query->tax_query ) ) {
            $query->tax_query = new WP_Tax_Query( array() );
        }

        // Now check if 'queries' property exists; if not, initialize it as an empty array
        if ( ! isset( $query->tax_query->queries ) || ! is_array( $query->tax_query->queries ) ) {
            $query->tax_query->queries = array();
        }

        // You can now safely add your additional query
        $query->tax_query->queries[] = $additional_query;

        // Make sure to reassign the tax_query to query_vars to ensure it's used in the main query
        $query->query_vars['tax_query'] = $query->tax_query->queries;

}

}

@ECnetHub
Copy link

Thanks a lot.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment