为了账号安全,请及时绑定邮箱和手机立即绑定

列出当前分类存档的类别

列出当前分类存档的类别

PHP
皈依舞 2023-09-08 14:27:06
这是我的网站:http ://bmi.brownsmedicalimaging.com/product-category/c-arm/我创建了一个名为“产品”的自定义帖子类型。然后我创建了 2 个自定义分类法:类别和制造商。例如,如果我正在查看上面的“C 型臂”类别页面,它会显示该类别的 2 篇帖子。我怎样才能让它显示该类别的制造商列表?现在它只输出我定义的所有制造商。这是我的代码:add_shortcode( 'my_cat_list', 'my_list_categories_shortcode' );/** * this function outputs your category list where you * use the [my_cat_list] shortcode. */function my_list_categories_shortcode() {    $args = array(         'echo' =>   false,        'taxonomy'   =>     'product-manufacturer',        'title_li' => '',    );    return wp_list_categories( $args ); }
查看完整描述

1 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

因此,一般来说,这并不是一件大事,但我们应该避免对数据库进行不必要的调用,而 WordPress 本质上并不为我们提供这样的功能。因此,出于性能原因,我创建了自己的自定义 SQL 查询。看:


function get_related_list_categories ($term_taxonomy_id, $related_taxonomy)

{

    global $wpdb;


    $sql = "SELECT DISTINCT(term_taxonomy_id)

            FROM {$wpdb->prefix}term_relationships

            WHERE object_id IN (

                SELECT DISTINCT(p.ID)

                FROM {$wpdb->prefix}posts AS p LEFT JOIN {$wpdb->prefix}term_relationships AS tr ON (p.ID = tr.object_id)

                WHERE tr.term_taxonomy_id IN ({$term_taxonomy_id}) AND p.post_type = '{$post_type}' AND (p.post_status = 'publish')

              ) AND term_taxonomy_id IN (

                  SELECT term_id FROM {$wpdb->prefix}term_taxonomy WHERE taxonomy = '{$related_taxonomy}'

              )";


    if (empty($term_ids = $wpdb->get_col($sql))) {

        return FALSE;

    }


    return $wp_list_categories(['include' => $term_ids, 'taxonomy' => $related_taxonomy, 'echo' => false, 'title_li' => '',]);

}


get_related_list_categories($product_category_id, 'product-manufacturer');

再次,我选择product_category_id作为第一个参数(而不是 slug),因为我认为您很可能会拥有它,并且不需要进行数据库调用来获取 slug。无论哪种方式,您都可以根据自己的喜好自定义功能。我确信您会有自己的调整,就像我在找不到条件时返回 false 一样,但您可能想用另一种方式来做。如果这对您有用,或者您有任何疑问,请告诉我。


更新:如果调试需要进一步解释。


sql 查询由两个子查询组成。


SELECT DISTINCT(p.ID)

FROM {$wpdb->prefix}_posts as p

    LEFT JOIN {$wpdb->prefix}_term_relationships as tr ON (p.ID = tr.object_id)

WHERE tr.term_taxonomy_id IN ({$term_taxonomy_id})

    AND p.post_type = '{$post_type}'

    AND (p.post_status = 'publish')

这会找到与当前相关术语相关的所有帖子。它应该与该存档页面的帖子 ID 匹配。单独运行此查询来测试是否返回正确的帖子 ID。WHERE如果您想针对多个术语或按段等执行此操作,则可以调整该子句。

SELECT term_id

FROM {$wpdb->prefix}_term_taxonomy

WHERE taxonomy = 'related_experience'

第二个子查询获取“相关体验”分类法(或您想要的任何辅助分类法)的所有术语。您应该运行此命令并验证“lated_experience”的所有术语 ID 均已返回

然后,父 sql 查询连接第一个分类中的帖子 ID,并获取第二个分类中的所有术语,这些术语也显示在具有第一个分类的帖子中。


查看完整回答
反对 回复 2023-09-08
  • 1 回答
  • 0 关注
  • 56 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信