【问题标题】:Get Products by Category id按类别 id 获取产品
【发布时间】:2013-11-06 17:14:30
【问题描述】:

我正在为 woocommerce 编写定价表插件。用户插入带有 woocommerce 产品类别 id 的简码,在更新页面后,用户可以看到一个包含产品名称和价格列表的表格。
我怎样才能获得带有类别 ID 的产品列表?!
在下面的代码中,$pid 是用户在简码中输入的内容,'object_id' 是 wp_posts 表中每个产品的 id。

<?php
    $products = $wpdb->get_results("SELECT object_id FROM {$wpdb->term_relationships}
                                      WHERE term_taxonomy_id = " . $pid);
    if(!empty($products))
    {
        foreach($products as $product)
        {
            //the code
        }
    }
?>  

提前致谢。

【问题讨论】:

    标签: wordpress woocommerce


    【解决方案1】:

    通过使用 get_posts wordpress 功能

    按类别获取所有 WooCommerce 产品详细信息

    $all_products = get_posts( array(
        'post_type' => 'product',
        'numberposts' => -1,
        'post_status' => 'publish',
        'tax_query' => array(
            array(
                'taxonomy' => 'product_cat',
                'field' => 'slug',
                'terms' => 'your_product_category', /*category name*/
                'operator' => 'IN',
                )
            ),
        ));
        echo var_dump($all_products);
    

    按类别获取所有 WooCommerce 产品 ID

    $all_ids = get_posts( array(
      'post_type' => 'product',
      'numberposts' => -1,
      'post_status' => 'publish',
      'fields' => 'ids',
      'tax_query' => array(
          array(
              'taxonomy' => 'product_cat',
              'field' => 'slug',
              'terms' => 'your_product_category', /*category name*/
              'operator' => 'IN',
              )
           ),
       ));
       foreach ( $all_ids as $id ) {
           echo $id;
       }
    

    经过测试,工作正常。

    【讨论】:

      【解决方案2】:
       $args = array(
          'post_status' => 'publish',
          'tax_query' => array(
               'taxonomy' => 'product_cat',
               'field'    => 'term_id',
               'terms'     =>  '[ category id here ]', // When you have more term_id's seperate them by komma.
               'operator'  => 'IN'
               )
          );
          $the_query = wp_query($args);
      

      未经测试,但应该可以工作

      【讨论】:

        【解决方案3】:

        上述(已接受)答案对我(4.9.8 版)不起作用(结果超出应有的结果)

         'tax_query' => array(
             array(
                'taxonomy' => 'product_cat',
                'field'    => 'term_id',
                'terms'     =>  [$request['id']],
                'operator'  => 'IN'
              )
          )
        

        以上工作。我不是一个真正的 Wordpress 人,但我猜这是一个版本的东西......

        【讨论】:

          【解决方案4】:

          根据 Woocommerce 文档 WP_Query()get_posts() 不应使用:

          wc_get_products 和 WC_Product_Query 提供了一种标准方式 检索可安全使用且不会因以下原因而损坏的产品 未来 WooCommerce 版本中的数据库更改。建筑定制 WP_Queries 或数据库查询将来可能会破坏您的代码 WooCommerce 版本随着数据向自定义表格移动以获得更好的效果 表现。这是插件和主题的最佳实践方式 开发人员检索多个产品。 wc_get_products 和 WC_Product_Query 类似于 WordPress get_posts 和 WP_Query。只是 像那些一样,你传入一个定义标准的参数数组 用于搜索。

          WooCommerce Docs

          这是我的解决方案:

          $product_term_ids = array(16,10,4,7);
          
          $product_term_args = array(
              'taxonomy' => 'product_cat',
              'include' => $product_term_ids,
              'orderby'  => 'include'
          );
          $product_terms = get_terms($product_term_args);
          
          $product_term_slugs = [];
          foreach ($product_terms as $product_term) {
              $product_term_slugs[] = $product_term->slug;
          }
          
          $product_args = array(
              'post_status' => 'publish',
              'limit' => -1,
              'category' => $product_term_slugs,
              //more options according to wc_get_products() docs
          );
          $products = wc_get_products($product_args);
          
          foreach ($products as $product) {
              echo $product->get_title();
          }
          

          注意:类别参数需要一个 slug 数组,而不是 ID。

          (经过测试,可与 Wordpress 5.9.3 和 WooCommerce 6.4.1 配合使用。)

          Credit: @Christian Lescuyer

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-01-09
            • 2016-12-05
            • 1970-01-01
            • 1970-01-01
            • 2019-12-22
            • 2011-05-23
            • 2015-05-27
            • 2020-08-20
            相关资源
            最近更新 更多