当前位置: 首页 > 知识库问答 >
问题:

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

景品
2023-03-14

我试图执行两个WordPress分类法之间的查询。我将使用的分类法是品牌和product_cat。

预期结果是在下拉列表中显示所有现有品牌作为父亲和每个品牌的所有现有产品类别作为儿童*

我最初尝试的是迭代所有产品,询问它们的类别和品牌,形成一个关联数组;但这最终导致了PHP致命错误:允许的内存大小为268435456字节,因为它们是数据库中的10000个产品。这就是我使用的代码:

    <?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。

共有1个答案

聂永怡
2023-03-14

我自己回答,因为我不知怎么搞出来了。我仍然认为这不是最好的方式。

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

 类似资料:
  • 我正在使用java servlet编写一个简单的服务器。为了从数据库中获取数据,我编写了一个特殊的Dao层类,我想知道我应该在哪里存储SQL查询? 我需要创建一个特殊的类,将查询存储为最终字符串,还是有更有效的方法来实现?

  • 在我的应用程序架构中,我通常通过服务层将对象或对象列表从数据访问层发送到web层,在服务层中,这些对象从DAO对象转换为DTO对象,反之亦然。web层无权访问DAO对象,DAO层也不使用DTO。 为了演示,我通常将代码编写为: 这里的用户是数据库实体: 这是用户DTO: 所以我想知道这是否是在两个对象之间复制属性的唯一方法。我想我不确定。此外,我正在使用lambdaj,那么此API中是否有一种方法

  • 很抱歉打扰你,但我无法找到一个有效的解决我的问题的方法。我想做一个MongoDB查询,让我得到与SQL查询相同的结果:

  • 有一个 K8S 群集,我们的大多数部署只是更新映像的版本,但有时我们也希望更新部署配置的某些部分。我们的部署配置不包括映像的标记。 对于更新映像版本似乎是我最好的选择。至于一起更新部署配置和映像,我看到了几种方法: < li>kubectl部署...:< code>kubectl集合图像...[但是有两个部署] < li >使用实际图像标记编辑部署YAML[看起来不太优雅] < li>kubect

  • 我在一个数据库中有两个表,这两个表都来自最初以电子表格形式提供的官方政府参考表。 下面说明了这两个表的结构。 表1(物种代码) 表2(允许的表示代码) 当我尝试在第一个和第二个之间创建关系时(以便充分利用在第二个表中查找值的能力),当我尝试将speciescodes.FAOC的颂歌链接到alolwestates. Ers物种代码时,会出现以下错误。 “SpeciesCodeLookup”表已成功保

  • 问题内容: 在我的应用程序体系结构中,我通常将对象或对象列表从数据访问层通过服务层发送到Web层,在服务层中,这些对象从DAO对象转换为DTO对象,反之亦然。Web层无法访问DAO对象,并且DAO层不使用DTO。 为了演示,我通常将代码编写为: 这里的用户是数据库实体: 这是UserDTO: 所以我想知道这是否是在两个对象之间复制属性的唯一方法。我想我不确定。另外,我也在使用lambdaj,因此此