효율적인 분류법 교차로


9

나는 이것에 많은 용도가 있지만 비싼 작업이 될 수있는 가장 성능이 좋은 방법을 알고 싶습니다.

예를 들어 상점을 사용합니다.

주어진:

  • 제품 브랜드 분류
  • 제품 그룹 분류
  • 제품 포스트 타입
  • 위 분류법에 대한 아카이브 템플릿

제품 유형 아카이브에있을 때 브랜드 메뉴를 표시하고 브랜드 아카이브에있을 때 제품 유형을 표시하는 가장 효율적인 방법은 무엇입니까?하지만 해당 그룹의 게시물에 적용되는 용어 만 표시하십시오.

예를 들어 제품 그룹 'womens'에있는 경우 왼쪽에 브랜드가 표시되지만 'womens'제품 그룹의 제품에 지정된 브랜드 만 표시됩니다. 예를 들어 'Fancy womens clothes Inc'라는 브랜드는 표시되지만 'Manly mens Manly ltd'는 표시되지 않습니다.

나는 일반적인 대답이 필요하지만 의류 제품 예제를 사용하는 것이 행복하지만 무자비한 힘으로 탐욕스러운 알고리즘 으로이 작업을 수행하는 방법을 알고 있지만 엄청나게 낭비이며 솔루션에 관심이 없습니다. 모든 페이지로드를 몇 초씩 늘리고 프로세스의 DB에서 모든 게시물을 완전히로드합니다.

편집 : 예 2 :

피카추는 노란 포켓몬이고 노란 꼬리표에 있지만 피카추는 또한 전기 포켓몬이므로 분류 체계의 전기 꼬리표에 있습니다. 노란색 태그 아카이브에있을 때 노란색의 포켓몬 유형 만 표시하려면 어떻게합니까? 예를 들어 모든 녹색 잔디 포켓몬이 녹색이라는 것은 노란색 보관소에있을 때 잔디 메뉴 항목은 없지만 녹색에는 있음을 의미합니다 (예, 녹색이 아닌 잔디 포켓몬이 있음을 알고 있습니다)

답변:


13

이를 일반화하기 위해서는 특정 분류 체계 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.