【发布时间】:2020-03-22 09:13:29
【问题描述】:
我试图在两个 WordPress 分类之间执行 查询。我将使用的分类法是 brand 和 product_cat。
预期结果是在下拉列表中显示所有现有品牌作为父亲以及每个品牌的所有现有产品类别作为孩子*
我最初尝试的是遍历所有产品,询问它们的类别和品牌,形成一个关联数组; 但这以 PHP 致命错误:允许的内存大小为 268435456 字节已用完而告终,因为它们是数据库中的 10 000 个产品。 这是我使用的代码:
<?php
$args = array(
'posts_per_page' => 25,
'post_type' => 'product',
);
$relations = array();
$loop = new WP_Query($args);
if ($loop->have_posts()) {
while ($loop->have_posts()) {
$loop->the_post();
$productBrandTerm = get_field('brand');
$productCategory = wp_get_post_terms(get_the_ID(), 'product_cat', $catArgs);
if ($productBrandTerm) {
if ($relations[$productBrandTerm->slug]) {
array_push($relations[$productBrandTerm->slug], $productCategory[0]->name);
$relations[$productBrandTerm->slug] = array_unique($relations[$productBrandTerm->slug]);
} else {
$relations[$productBrandTerm->slug] = array($productCategory[0]->name);
}
}
}
} else {
echo "____";
}
wp_reset_postdata();
foreach ($relations as $key => $value) {
echo '<p class="menu_marcas" id="' . $key . '">';
echo $key;
echo '</p>';
echo '<div class="menu_categorias">';
foreach ($value as $k) {
echo '<a href="#">';
echo $k;
echo '</a>';
}
echo '</div><!-- menu_categorias --> ';
}
?>
当我说“现有品牌”时,我指的是至少有一种产品的类别。
我不知道是否有使用 WP_Query 或原始 SQL 实现此目的的最佳方法,无论如何,哪种方法是最佳方法?
编辑:我忘了提到这个 productBrandTerm 是一个高级自定义字段 ACF 字段,用作产品分类,它显示为 WooCommerce 产品的属性。这就是为什么我通过 get_field 调用它并询问它的 slug。
【问题讨论】:
-
需要更好地了解您的要求。我有点担心 $productBrandTerm 似乎是一个 WP_Term (因为您访问了 slug 属性),但随后您使用 get_field() 检索品牌术语,这意味着您将关联的品牌术语存储在发布元表而不是任何分类表。品牌分类是否未分配给产品帖子类型?另外,$catArgs 是什么?
-
请不要在循环内调用array_unique。它不必是这样的。您应该能够在循环之后调用它一次。或者您可以在添加之前检查该值不存在。
-
抱歉,忘记提及此 productBrandTerm 是一个高级自定义字段 ACF 字段,用作产品分类,显示为 WooCommerce 产品的属性。这就是为什么我通过 get_field 调用它并询问它的 slug。感谢您提供 array_unique 提示。
-
这些基本上是有子分类的分类吗?
-
是的,它们是基本产品类别 (product_cat),它们可以有子类别,但我对获取子类别不感兴趣,我只需要没有子类别的类别。
标签: sql wordpress optimization query-optimization taxonomy