Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save chrono-meter/289d75f15313f1b2542a70bc3c35655c to your computer and use it in GitHub Desktop.

Select an option

Save chrono-meter/289d75f15313f1b2542a70bc3c35655c to your computer and use it in GitHub Desktop.

Revisions

  1. chrono-meter revised this gist Jul 26, 2020. No changes.
  2. chrono-meter created this gist Jul 26, 2020.
    86 changes: 86 additions & 0 deletions wc-builtin-shortcode-stock-filter.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,86 @@
    <?php
    /**
    * Description: WooCommerce: Add stock filter function to builtin shortcodes.
    * Author: [email protected]
    * Version: v20200727
    *
    * @link https://docs.woocommerce.com/document/woocommerce-shortcodes/
    *
    * Example:
    * [products stock="instock"]
    * [products stock="instock,onbackorder"]
    */


    class WC_Builtin_Shortcode_Stock_Filter {
    public $shortcodes = [];

    /**
    * @see \WC_Shortcodes::init()
    */
    public function __construct() {
    $this->shortcodes = apply_filters( 'WC_Builtin_Shortcode_Stock_Filter/enabled_shortcodes', [
    'products',
    'product_category',
    'recent_products',
    'sale_products',
    'best_selling_products',
    'top_rated_products',
    'product',
    'sale_products',
    'featured_products',
    'product_attribute',
    ] );

    foreach ( $this->shortcodes as $shortcode ) {
    add_filter( "shortcode_atts_{$shortcode}", [ $this, 'shortcode_atts' ], 10, 4 );
    }

    add_filter( 'woocommerce_shortcode_products_query', [ $this, 'woocommerce_shortcode_products_query' ], 10, 3 );
    }

    /**
    * @param array $out
    * @param array $pairs
    * @param array $atts
    * @param string $shortcode
    *
    * @return array
    *
    * @see \WC_Shortcode_Products::parse_attributes()
    */
    function shortcode_atts( $out, $pairs, $atts, $shortcode ) {
    if ( isset( $atts['stock'] ) ) {
    $out['_stock_status'] = $atts['stock'];
    }

    return $out;
    }

    /**
    * @param array $query_args
    * @param array $atts
    * @param string $shortcode
    *
    * @return array
    *
    * @link https://stackoverflow.com/a/45967535/3622941
    */
    function woocommerce_shortcode_products_query( $query_args, $atts, $shortcode ) {
    if ( in_array( $shortcode, $this->shortcodes ) && ! empty( $atts['_stock_status'] ) ) {
    if ( ! isset( $query_args['meta_query'] ) ) {
    $query_args['meta_query'] = [];
    }

    $query_args['meta_query'][] = [
    'key' => '_stock_status',
    'compare' => 'IN',
    'value' => explode( ',', $atts['_stock_status'] ),
    ];
    }

    return $query_args;
    }
    }

    new WC_Builtin_Shortcode_Stock_Filter();