効率的な分類法の交差


9

これには多くの用途がありますが、費用のかかる操作になる最も効率的な方法を知りたいのです。

例として、ショップを使用します。

与えられた:

  • 製品ブランドの分類
  • 製品グループの分類
  • 商品投稿タイプ
  • 上記の分類法のアーカイブテンプレート

製品タイプのアーカイブにブランドメニューを表示し、ブランドアーカイブに製品タイプを表示する最も効率的でパフォーマンスの高い方法は何ですか。ただし、そのグループの投稿に適用される用語のみを表示します。

たとえば、「女性」という製品グループの場合、左側にブランドが表示されますが、「女性」製品グループの製品に指定されているブランドのみが表示されます。たとえば、「Fancy Womens Clothing Inc」というブランドは表示されますが、「Manly mens Manly ltd」は表示されません。

一般的な答えが必要ですが、衣料品の例が使用されて満足しています。そして、強引なアルゴリズムによる貪欲なアルゴリズムでこれを行う方法を知っていますが、それは非常に無駄であり、私はその解決策に興味がありませんすべてのページの読み込みを数秒ずつ増やし、プロセス内のすべての投稿をDBから完全に読み込みます。

編集:例2:

ピカチュウは黄色いポケモンで、黄色いタグの中にありますが、ピカチュウも電気的なポケモンなので、分類分類の電気的なタグの中にあります。黄色のタグアーカイブにある黄色のポケモンの種類のみを表示するにはどうすればよいですか?たとえば、すべてのグラスポケモンが緑であるということは、黄色のアーカイブにあるときにグラスメニュー項目はないが、緑にはあるということです(はい、緑ではないグラスポケモンがあることを知っています)。

回答:


12

これを一般化することは、分類Bの特定の用語で投稿する分類Aのすべての用語を取得する問題です。

これはいくつかのステップで不可能ではなく、多くのポストをループすること(実際には非効率的です)でも、効率を上げるためにSQLを実行することは妥当だと思います。

それに対する私の大まかな見解は次のようになります:

/**
 * Get all terms of $tax_to taxonomy that posts in $term_from of $tax_from have.
 *
 * @param string $tax_from  taxonomy name
 * @param string $term_from term slug
 * @param string $tax_to    taxonomy name
 *
 * @return array|WP_Error
 */
function get_intersected_terms( $tax_from, $term_from, $tax_to ) {

    global $wpdb;

    $term_from = get_term_by( 'slug', $term_from, $tax_from );

    $query = "
    SELECT term_id FROM {$wpdb->term_taxonomy} WHERE taxonomy = '{$tax_to}' AND term_taxonomy_id IN (
        SELECT term_taxonomy_id FROM {$wpdb->term_relationships} WHERE object_id IN (
            SELECT object_id FROM {$wpdb->term_relationships} WHERE term_taxonomy_id = {$term_from->term_taxonomy_id}
        )
    )
    ";

    $term_ids = $wpdb->get_col( $query );

    if( empty( $term_ids) )
        return array();

    return get_terms( $tax_to, array( 'include' => $term_ids ) );
}

// example
var_dump( get_intersected_terms( 'category', 'cat-a', 'post_tag' ) );
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.