【问题标题】:What is the optimal way to achieve this query between two taxonomies in WordPress?在 WordPress 中的两个分类法之间实现此查询的最佳方法是什么?
【发布时间】:2020-03-22 09:13:29
【问题描述】:

我试图在两个 WordPress 分类之间执行 查询。我将使用的分类法是 brandproduct_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


【解决方案1】:

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

自定义页面.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>';
}

functions.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 参数,它不能正常工作,它只是返回一个品牌结果,这是错误的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 2011-02-13
    • 2021-06-06
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多