提问者:小点点

ACF-筛选关系查询以显示此类别中可用的产品


我正在尝试使用高级自定义字段在WooCommerce中创建自定义类别产品排序顺序。我找到了一个很好的向导来设置它。方法是:

  1. 将ACF关系字段添加到类别页。
  2. 将其配置为仅显示产品。
  3. 添加一个函数,根据您添加的产品对类别页面进行排序。

它工作得很好!我的问题是,它总是显示所有可用的产品,而不仅仅是该类别中可用的产品。

我试图使用此功能,但tag_id不起作用。

add_filter('acf/fields/relationship/query', 'my_acf_fields_relationship_query', 10, 3);
function my_acf_fields_relationship_query( $args, $field, $post_id ) {

$args['tag_id'] = $category_id;

return $args;
}

有什么建议吗?


共1个答案

匿名用户

您希望按产品类别术语进行筛选,因此不应使用:

[tag_id]

而是使用:

[term_id]

您已按照教程进行操作,但筛选函数不起作用。您已经创建了自定义字段并插入了创建自定义产品订单的函数。如果我正确回答了您的问题,那么不起作用的是获取特定类别中所有产品ID数组的函数。因此,您将获得所有可用的产品,而不是您选择的类别中的产品。

这应该是你问题的一部分,这样其他人就可以找到解决方案:

这是您使用的教程中的代码:https://www.igoo.co.uk/2016/10/setting-a-custom-category-specific-product-sort-order-in-woocommerce-using-advanced-custom-fields/

function my_custom_product_order($q) {
  if(!is_admin())
  {
    // fetch current category id from active query
    $category_id = $q->get_queried_object_id();

    // get array of all product IDs in current category
    $product_ids = get_category_product_ids($category_id);

    // get preferred order from ACF field
    $product_ids_order_preferred = get_field('product_order', 'product_cat_' . $category_id);

    // if we have some product sort order set…
    if($product_ids_order_preferred)
    {
        // merge our preferred category ids array with the array of all products ids, and remove duplicates
        $product_ids = array_unique(array_merge($product_ids_order_preferred, $product_ids));
    }

    // set the 'posts__in' argument to the new array of post IDs (unfortunately wordpress doesn’t let you just pass an array of IDs straight in here)
    $q->set('post__in', $product_ids);

    // set the query orderby value to observe the posts__in field
    $q->set('orderby', 'post__in');
  }

  remove_action('woocommerce_product_query', 'custom_pre_get_posts_query');
}
add_action('woocommerce_product_query', ‘my_custom_product_order’);

在上面代码的第7行中,您正在使用get_category_product_ids($category_id)函数,并将$category_id作为参数。

教程中的“获取类别产品ID”函数如下所示:

// helper function to fetch all product IDs from a specific category ID

function get_category_product_ids($category_id) {
    $args = array(
        'post_type' => 'product',
        'post_status' => 'publish',
        'fields' => 'ids',
        'posts_per_page' => -1,
        'tax_query' => array(
            array(
                'taxonomy' => 'product_cat',
                'field' => 'term_id',
                'terms' => $category_id,
                'operator' => 'IN'
            )
        )
    );

    $ids = get_posts($args);

    return $ids;
}

此函数获取参数$category\u id,并使用它进行后期查询并保存税务查询的结果id。

这是实际的答案,可能会帮助您:

如果您想找出它不起作用的原因,应该首先查看$category_uid变量,因为这个值是使它起作用的最重要的因素。因此,设置变量后,您可以查看变量中是否有数据,函数中是否有var_dump:

var_dump($category_id)

变量设置是否正确?调用“my_custom_product_order”函数时是否有数据?您应该获得当前查看类别的id。

如果你在my_custom_product_order里找不到身份

您应该看看“get\u queryed\u object\u id()”函数。可以用另一种方法获得该值。“get_queryed_object()”函数返回一个WP_Term对象。因此,您还可以:

$category_id = $q->get_queried_object();
$category_id = $category_id->term_id;

也许你现在有了你需要的身份证。

如果没有,您应该检查参数$q,它是用来做什么的?也许这会引起问题。您可以尝试以下方法:

if (is_product_category()) {
    $q = get_queried_object();
    $term_id = $q->term_id;
}

如果您在我的\u定制\u产品\u订单中获得id

那你应该看看“get_category_product_ids”功能。参数是否工作?尝试var_dump这个函数,看看是否有值移交给函数。如果没有,你可以用另一种方法得到这个变量。这似乎是冗余的,并使参数无用,但这样您可以确保有一个类别ID为您的税务查询。把这个放在你“my_category_product_ids”的开头:

$category_id = get_queried_object();
$category_id = $category_id->term_id;

希望这能帮助你找出为什么它不起作用。不知道很难解决这个问题。如果我是对的,问题是您的$category_id没有使函数工作的值。