在WordPress中的两个分类法之间实现此查询的最佳方法是什么?



我试图在两个WordPress分类法之间执行查询。我将使用的分类法是品牌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来实现这一点,无论如何,哪种方法是最佳方法?

编辑:我忘了提到这个产品BrandTerm是一个高级自定义字段ACF字段,作为产品分类法工作,它显示为WooCommerce产品的属性。这就是为什么我通过get_field打电话给它并要求它的蛞蝓。

我回答自己,因为我以某种方式解决了它。我仍然认为这不是最佳方法。

自定义页面.php:

$allBrands = get_terms(array(
'taxonomy' => 'pa_marca',
'hide_empty' => false,
));
foreach ($allBrands as $singleBrand) {
echo '<span>' . $singleBrand->slug . '</span>';
echo '<div>';
$theResult = getCategoriesFilteringByBrand($singleBrand->slug);
foreach ($theResult as $result) {
echo '<a>';
echo $result->slug;
echo '</a>';
} 
echo '</div>';
}

功能.php:

function getCategoriesFilteringByBrand($brand){
global $wpdb;
$query = "
SELECT DISTINCT wp_terms.slug, wp_terms.name
FROM wp_term_relationships 
LEFT JOIN wp_posts  
ON wp_term_relationships.object_id = wp_posts.ID
LEFT JOIN wp_term_taxonomy 
ON wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id
LEFT JOIN wp_terms 
ON wp_terms.term_id = wp_term_relationships.term_taxonomy_id
WHERE taxonomy = 'product_cat' AND ID IN (
SELECT ID
FROM wp_term_relationships 
LEFT JOIN wp_posts  
ON wp_term_relationships.object_id = wp_posts.ID
LEFT JOIN wp_term_taxonomy 
ON wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id
LEFT JOIN wp_terms 
ON wp_terms.term_id = wp_term_relationships.term_taxonomy_id
WHERE post_type = 'product' 
AND taxonomy = 'pa_marca' 
AND slug = '" . $brand . "'
)
";
$theCategoriesResult = $wpdb->get_results($query);
return $theCategoriesResult;
}

它仍然需要一些改进,它需要使查询安全,但它的东西,我希望对其他人有用。 最重要的是它有效。

PS:get_terms没有hide_empty参数,它无法正常工作,它只是返回单个品牌结果,这是错误的