問題描述

基本上我有一個自定義的帖子型別的’products’ 它有兩個分類法附加它… 正常的’category’ 和一個自定義分類稱為’brands’ 。

我有一個 「品牌」 具體的頁面。在這個頁面上,我想列出所有的 「產品類別」,其中包含一個名為 「品牌」 的頁面。

例如。說我在 「耐克」 頁面。我想讓它列出所有有 「產品」 的類別,並附上 「耐克」 品牌。

我的初步想法是使用 get_categories,但是現在可以定義一個特定的分類法或’brand’?

$categories = get_categories('orderby=name&depth=1&hide_empty=0&child_of='.$cat);

任何人之前做過這樣的事情或者知道一種直接查詢資料庫以獲得所需結果的方法?

非常感謝任何幫助,謝謝

最佳解決方法

嗨 @daveaspi:

你想做的是 WordPress 核心中常見的但不是很好的處理。有可能沒有自定義 SQL 的方法,但我不認為它們會擴充套件大量的帖子。以下是我寫的一個函式,叫做 get_cross_referenced_terms(),它將會得到你想要的內容,並附有一個例子,如何使用它。

以下程式碼可以放在您的 WordPress 站點根 test.php 檔案中,以檢視它的工作。然後,您可以將功能 get_cross_referenced_terms()複製到您的主題的 functions.php 檔案或.php 檔案中您可能正在使用的外掛:

<?php 

  include('wp-load.php');

  $nike = get_term_by('slug','nike','brand'); // This here just to illustrate

  $terms = get_cross_referenced_terms(array(
    'post_type'        => 'product',
    'related_taxonomy' => 'brand',
    'term_id'          => $nike->term_id,
  ));
  foreach($terms as $term) {
    echo "<p>{$term->name}</p>";
  }

function get_cross_referenced_terms($args) {
  global $wpdb;
  $args = wp_parse_args($args,array(
    'post_type'        => 'post',
    'taxonomy'         => 'category',
    'related_taxonomy' => 'post_tag',
    'term_id'          => 0,
  ));
  extract($args);
  $sql = <<<SQL
SELECT DISTINCT
  {$wpdb->terms}.*,
  COUNT(*) AS post_count
FROM
  {$wpdb->terms}
  INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->terms}.term_id={$wpdb->term_taxonomy}.term_id
  INNER JOIN {$wpdb->term_relationships} ON {$wpdb->term_taxonomy}.term_taxonomy_id={$wpdb->term_relationships}.term_taxonomy_id
  INNER JOIN {$wpdb->posts} ON {$wpdb->term_relationships}.object_id={$wpdb->posts}.ID
  INNER JOIN {$wpdb->term_relationships} related_relationship ON {$wpdb->posts}.ID=related_relationship.object_id
  INNER JOIN {$wpdb->term_taxonomy} related_term_taxonomy ON related_relationship.term_taxonomy_id=related_term_taxonomy.term_taxonomy_id
  INNER JOIN {$wpdb->terms} related_terms ON related_term_taxonomy.term_id=related_terms.term_id
WHERE 1=1
  AND (related_term_taxonomy.taxonomy<>{$wpdb->term_taxonomy}.taxonomy OR related_terms.term_id<>{$wpdb->terms}.term_id)
  AND {$wpdb->posts}.post_type='%s'
  AND {$wpdb->term_taxonomy}.taxonomy='%s'
  AND related_term_taxonomy.taxonomy='%s'
  AND related_terms.term_id=%d
GROUP BY
  {$wpdb->terms}.term_id
SQL;
  $sql = $wpdb->prepare($sql,$post_type,$taxonomy,$related_taxonomy,$term_id);
  $terms = $wpdb->get_results($sql);
  return $terms;
}

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。