在Woocommerce中显示最终缺货产品

RaG*_*aGu 12 php wordpress woocommerce

是否可以在wordpress的类别或页面末尾显示缺货产品?

因此,客户首先会看到可用的产品,之后会看到缺货的产品.

DAC*_*sby 12

这与Viktor&Bogdan的答案相同,但没有额外的类代码.

它使用post_clause过滤器来修改产品查询.我们JOIN将wp_postmeta表提供给查询并orderby _stock_status在现有查询前加上一个子句.这样,任何其他orderby子句也会保留在查询中.

add_filter('posts_clauses', 'order_by_stock_status');
function order_by_stock_status($posts_clauses) {
    global $wpdb;
    // only change query on WooCommerce loops
    if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag() || is_product_taxonomy())) {
        $posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) ";
        $posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby'];
        $posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " . $posts_clauses['where'];
    }
    return $posts_clauses;
}
Run Code Online (Sandbox Code Playgroud)

如果您出于某种原因首先需要Out Of Stock项目,您可以更改istockstatus.meta_value ASCistockstatus.meta_value DESC.

在WP:4.8上测试; WC 3.0.8

  • 提到应该在查询构建序列的最后添加它`add_filter('posts_clauses', 'order_by_stock_status', 999);` 如果没有 999 优先级,它对我没有任何影响。 (4认同)
  • 获取 PHP 注意:尝试在第 4103 行的 [path]\wp-includes\class-wp-query.php 中获取非对象的属性“post_type” WooCommerce 版本:3.9.1 WordPress 版本:5.3.2 (3认同)

小智 12

我尝试了上面的所有解决方案,它们有效,但导致了网站上的其他问题(可能是由于主题冲突),我确信它们在不同的情况/主题下都很好。下面的代码最终对我来说非常有用(提到了来源)

来源:https ://www.businessbloomer.com/woocommerce-show-in-stock-products-first-shop/

/**
 * @snippet       Sort Products By Stock Status - WooCommerce Shop
 * @how-to        Get CustomizeWoo.com FREE
 * @author        Rodolfo Melogli
 * @compatible    WooCommerce 3.9
 * @donate $9     https://businessbloomer.com/bloomer-armada/
 */
 
add_filter( 'woocommerce_get_catalog_ordering_args', 'bbloomer_first_sort_by_stock_amount', 9999 );
 
function bbloomer_first_sort_by_stock_amount( $args ) {
   $args['orderby'] = 'meta_value';
   $args['order'] = 'ASC';
   $args['meta_key'] = '_stock_status';
   return $args;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

这是重新排列产品的片段(有货在先):

<?php

/**
 * Order product collections by stock status, instock products first.
 */
class iWC_Orderby_Stock_Status
{

    public function __construct()
    {
        // Check if WooCommerce is active
        if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {
            add_filter('posts_clauses', array($this, 'order_by_stock_status'), 2000);
        }
    }

    public function order_by_stock_status($posts_clauses)
    {
        global $wpdb;
        // only change query on WooCommerce loops
        if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag())) {
            $posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) ";
            $posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby'];
            $posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " . $posts_clauses['where'];
        }
        return $posts_clauses;
    }
}

new iWC_Orderby_Stock_Status;

?>
Run Code Online (Sandbox Code Playgroud)

https://www.snip2code.com/Snippet/114858/WooCommerce-Products-Order-by-Stock-Stat