当前位置: 首页 > 知识库问答 >
问题:

如何在电子商务中创建自定义排序

林玮
2023-03-14

我正在创建一个自定义排序名称“price asc”,它根据最高价格对产品进行排序。

我的解决办法是:

1-创建key_meta称为"_highest_price"存储每个产品的最高价格

2-在筛选商品目录订货人中创建自定义“价格asc”

3-自定义"orderby","订单","meta_key"在过滤器woocommerce_get_catalog_ordering_args

functions.php

// step 1
function my_save_post_product( $post_id, $post, $update ) {
  if( ! $update )   // no further actions if no changes
    return;

  if( $post->post_status !== 'publish' )    // no further actions if product is not public
    return;

  $product = wc_get_product( $post_id );

  if( $product->product_type == 'variable' ) :
    update_post_meta( $post_id, '_highest_price', $product->get_variation_price( 'max', true ) );
  elseif( $product->product_type == 'simple' ) :
    update_post_meta( $post_id, '_highest_price', $product->get_price() );
  endif;
}
add_action( 'save_post_product', 'my_save_post_product', 10, 3 );

// step 2
function my_woocommerce_catalog_orderby( $options ) {
  //...
  $options['price-asc'] = __( 'A different low to high', 'mytheme' );
  return $options;
}
add_filter( 'woocommerce_catalog_orderby', 'my_woocommerce_catalog_orderby' );

// step 3
function my_woocommerce_get_catalog_ordering_args( $args ) {
  $orderby_value = isset( $_GET['orderby'] ) ? woocommerce_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );

  if ( $orderby_value == 'price-asc' ) :
    $args['orderby'] = 'meta_value_num';
    $args['order'] = 'ASC';
    $args['meta_key'] = '_highest_price';
  endif;

  return $args;
}
add_filter( 'woocommerce_get_catalog_ordering_args', 'my_woocommerce_get_catalog_ordering_args' );

然后我去https://example.com/products/?orderby=price-asc

但是,订单没有按预期显示。最高价格为“22092”的产品应在最高价格为“1177000”的产品显示为22092之前显示

这是我的数据库和显示器。请帮助数据库显示

共有1个答案

梁丘兴腾
2023-03-14

过了一会儿,我终于得到了答案。我只是简单地将“价格asc”改为“价格asc”。为什么?

woocommerce\includes\class wc查询中。php

第461行之前:$orderby_value=“price asc”

第461行:

$orderby_value = is_array( $orderby_value ) ? $orderby_value : explode( '-', $orderby_value );

在这行之后$orderby_value是一个数组,其中[0]=

第462行:

$orderby       = esc_attr( $orderby_value[0] );

这一次,$orderby=“price”告诉系统在第498-501行连续运行

case 'price':
  $callback = 'DESC' === $order ? 'order_by_price_desc_post_clauses' : 'order_by_price_asc_post_clauses';
  add_filter( 'posts_clauses', array( $this, $callback ) );
  break;

=

我的建议是:它可能只适用于关键字“price”,但对于将来,我们应该将排序id命名为“u”,而不是“-”。例如custom\u sort\u id而不是custom sort id

 类似资料:
  • 我使用Woocommerce在我的Wordpress网站上销售数字下载。我已经能够使用一个插件来定制结账页面,这样客户只需给出他们的名字和姓氏以及电子邮件地址就可以购买产品。我想在客户信息页面上显示同样的内容,并编辑我的地址页面和帐户页面。 现在在帐户页面的底部,它正在从页面调用信息。它调用账单地址(名字和姓氏)和送货地址,这两个地址不显示,因为它们没有被要求输入送货地址。 我希望账单地址为“姓名

  • 我试图发送电子邮件使用Nodejs包Nodemailer,但我无法更改从电子邮件到我的自定义域电子邮件。任何帮助都将不胜感激。这是我用来发送电子邮件的代码。

  • 问题内容: 我正在从事AngularJs项目。我有一项可以设置和删除某些按钮上的事件的服务。我不想与按钮直接交互的另一项服务利用了该服务。但是,我希望通过第一个服务过滤并在第二个服务中处理按钮单击事件。由于我不希望第二个服务知道按钮,因此我认为我需要在第一个服务中创建一个自定义事件。单击按钮后,如何创建自定义事件并触发它? 提前致谢。 问题答案: 如果要在服务/指令之间发送事件,请使用: 并像这样

  • 问题内容: 我正在尝试在Log4j2中编写自己的RewritePolicy。该文档指出: RewritePolicy是一个接口,允许实现在将LogEvent传递给Appender之前检查并可能对其进行修改。RewritePolicy声明一个必须执行的名为rewrite的方法。该方法通过LogEvent传递,并且可以返回相同事件或创建一个新事件。 这是我的 java类 : 这是我的 yaml配置 文

  • 我可以在购物车和结账页面中获取元字段,但在电子邮件中,我尝试使用数组获取元字段,但在电子邮件中找不到任何自定义字段。 如何在电子邮件通知中获取自定义元字段(管理员、客户)? 我的代码如下: 任何帮助都很感激。

  • 我需要在管理订单页面、谢谢和电子邮件通知中显示我的自定义签出字段。 我正在使用验证和保存WooCommerce回答代码中特定支付网关的额外结账字段来显示,验证和保存我的自定义字段。 从显示管理订单详细信息上的自定义字段数据,我试图显示自定义字段保存的输入值。 这是我到目前为止的代码: 但它不起作用。该字段不会附加到数据库中,但不会显示在任何位置: 如何正确显示字段?

  • 我有这个代码在我的function.php,我怎么能在管理邮件订单中分配这个字段值?谢谢!

  • 问题内容: 我正在http://www.cafeaulait.org/javafaq.html上阅读#6.10项,然后我开始怀疑大型企业如何创建自己的JVM实现。一个人会尝试(或可行)实验性的东西吗? 问题答案: 从技术上讲,创建该新JVM所需的所有信息都是该语言和目标平台的公共规范。即使字节码解释在很大程度上相同,JVM还是需要根据其是要在台式机还是手机上运行而有所不同。 一些开始寻找信息的地方