php 如何将缺货产品移至归档循环结束[已关闭]

daolsyd0  于 12个月前  发布在  PHP
关注(0)|答案(3)|浏览(84)

已关闭,此问题需要details or clarity。它目前不接受回答。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

5天前关闭。
Improve this question
在WooCommerce中,我想在产品类别中显示Out Of Stock产品,但从用户体验的Angular 来看,最好将这些产品移到列表的末尾,以免混淆用户。
我使用的实际上显示缺货的产品在Woocommerce答案代码结束。
我在这个领域做了一些尝试,但每一次尝试都会带来一个问题,例如,在尝试基于库存的排序而不是用户选择的排序,例如基于价格的排序,它具有优先级,并没有得到想要的结果。或者在另一种尝试中,只有用户选择默认排序,一切都是正确的,但如果用户选择按价格或受欢迎程度排序,则现有产品和不存在的产品混合在一起。

mrwjdhj3

mrwjdhj31#

我找到了解决问题的完美方法。

add_filter('posts_clauses', 'order_by_stock_status', 2000, 2);
function order_by_stock_status($posts_clauses, $query)
{
    global $wpdb;

    if (!is_admin() && (is_woocommerce() || is_product_tag() || is_product_category())) {
        if ($posts_clauses['orderby'] == ' wc_product_meta_lookup.total_sales DESC, wc_product_meta_lookup.product_id DESC ' || $posts_clauses['orderby'] == 'wp_posts.post_date DESC, wp_posts.ID DESC') {
            $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'];
        } elseif (strpos($posts_clauses['orderby'], 'wc_product_meta_lookup.min_price ASC') !== false) {
            $posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) INNER JOIN $wpdb->postmeta pricetable ON ($wpdb->posts.ID = pricetable.post_id) ";
            $posts_clauses['orderby'] = " istockstatus.meta_value ASC,CAST(pricetable.meta_value  AS INTEGER) ASC, " . $posts_clauses['orderby'];
            $posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND pricetable.meta_key = '_price' AND istockstatus.meta_value <> '' " . $posts_clauses['where'];
        } elseif (strpos($posts_clauses['orderby'], 'wc_product_meta_lookup.max_price DESC') !== false) {
            $posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) INNER JOIN $wpdb->postmeta pricetable ON ($wpdb->posts.ID = pricetable.post_id) ";
            $posts_clauses['orderby'] = " istockstatus.meta_value ASC,CAST(pricetable.meta_value  AS INTEGER) DESC, " . $posts_clauses['orderby'];
            $posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND pricetable.meta_key = '_price' AND istockstatus.meta_value <> '' " . $posts_clauses['where'];
        }
    }
    return $posts_clauses;
}
// Move OtOfStock Products To End Of Archive Loop

我将上面的代码添加到functions.php文件中,并将自定义部分的默认排序更改为按最近的排序,并且在列表和ACF中继器字段的末尾显示缺货产品的问题也得到了解决。

daupos2t

daupos2t2#

要将缺货产品移动到WooCommerce中的产品存档循环的末尾,您可以使用自定义代码片段。WooCommerce本身不提供此功能,因此您需要添加一些自定义排序逻辑。以下是实现这一目标的步骤:
访问主题的Functions.php文件:
您需要将自定义排序逻辑添加到WordPress主题的functions.php文件中。您可以通过WordPress Jmeter 板访问此文件,方法是导航到外观>主题编辑器,然后选择functions.php。添加自定义排序逻辑:
将以下代码段添加到functions.php文件中。这段代码将创建一个自定义排序选项,当用户选择它时,它会将缺货的产品移到列表的末尾。

// Add custom sorting option to move out-of-stock products to the end
  add_filter('woocommerce_get_catalog_ordering_args', 
  'custom_catalog_ordering_args');
   function custom_catalog_ordering_args($args)
   {
   if (isset($_GET['orderby']) && $_GET['orderby'] == 'custom_order') {
    $args['meta_key'] = '_stock_status';
    $args['orderby'] = 'meta_value';
    $args['order'] = 'ASC';
   }
  return $args;
  }

  // Add the custom sorting option to the dropdown
  add_filter('woocommerce_default_catalog_orderby_options', 
 'custom_default_catalog_orderby');
 add_filter('woocommerce_catalog_orderby', 'custom_catalog_orderby');

 function custom_default_catalog_orderby($options)
 {
 $options['custom_order'] = 'Out of Stock Last';
 return $options;
 }

 function custom_catalog_orderby($sortby)
{
$sortby['custom_order'] = 'Out of Stock Last';
return $sortby;

}
保存和测试:
将代码段添加到functions.php文件后,保存更改。现在,当你进入你的产品类别页面时,你应该会在产品分类下拉列表中看到一个名为“最后缺货”的新分类选项。
当用户选择此排序选项时,缺货产品将被移动到产品list的末尾。
请注意,像这样的自定义代码更改应该仔细进行,这是一个很好的做法,有一个备份您的网站,并熟悉WordPress主题编辑。此外,如果您的主题收到更新,您可能需要重新访问并更新此自定义代码以确保兼容性。

oxf4rvwz

oxf4rvwz3#

您可以根据库存状态确定产品的优先级。您可以使用WooCommerce的内置过滤器来调整排序行为。
这样的事情

function custom_orderby($orderby, $query) {
    global $wpdb;

    $stock_order = "( CASE WHEN {$wpdb->prefix}postmeta.meta_key = '_stock_status' AND {$wpdb->prefix}postmeta.meta_value = 'instock' THEN 1 WHEN {$wpdb->prefix}postmeta.meta_key = '_stock_status' AND {$wpdb->prefix}postmeta.meta_value = 'outofstock' THEN 2 ELSE 3 END ),";

    if ($query->is_post_type_archive('product') && $query->is_main_query()) {
        $orderby = $stock_order . $orderby;
    }
    return $orderby;
}
add_filter('posts_clauses', 'sort_products_by_stock_status', 10, 2);

function sort_products_by_stock_status($args) {
    global $wpdb;

    $args['join'] .= " LEFT JOIN {$wpdb->prefix}postmeta AS stock_status_meta ON {$wpdb->prefix}posts.ID = stock_status_meta.post_id AND stock_status_meta.meta_key = '_stock_status'";
    $args['orderby'] = "stock_status_meta.meta_value ASC, " . $args['orderby'];

    return $args;
}

相关问题