Intersecção eficiente da taxonomia

9

Eu tenho muitos usos para isso, mas eu quero saber a maneira mais eficaz de fazer o que vai ser uma operação cara.

Como exemplo, usarei uma loja.

Dado:

  • Uma taxonomia de marca de produto
  • Uma taxonomia do grupo de produtos
  • Um tipo de postagem de produto
  • Arquivar modelos para as taxonomias acima

Qual é o método mais eficiente e eficaz de mostrar um menu de marca quando em um arquivo de tipo de produto e um tipo de produto quando em um arquivo de marca, mas apenas mostrar os termos que se aplicam às postagens desse grupo. / p>

Por exemplo, se eu estiver no grupo de produtos "mulheres", ele mostrará marcas do lado esquerdo, mas apenas as marcas especificadas para produtos no grupo de produtos "womens". Por exemplo. a marca 'Fancy womens clothes Inc' mostraria, mas não 'Manly mens Manly ltd'.

Eu preciso de uma resposta genérica, embora eu esteja feliz pelo exemplo de produtos de vestuário ser usado, e eu sei como fazer isso com um algoritmo guloso por força bruta, mas isso é incrivelmente esbanjador, e eu não estou interessado em uma solução que aumentaria cada carregamento de página em vários segundos e carregaria todos os posts completos do banco de dados no processo

edite: Exemplo 2:

O Pikachu é um pokemon amarelo, e está na tag amarela, mas o Pikachu também é um pokemon elétrico, então está na tag elétrica do tipo taxonomia. Como eu mostraria apenas os tipos de pokemon que são amarelos quando no arquivo de tags amarelo? por exemplo. todo grama pokemon sendo verde significa que não haveria um item de menu grama quando no arquivo amarelo mas lá no verde (sim eu sei que existem pokémons de grama que não são verdes)

    
por Tom J Nowell 25.04.2012 / 12:56

1 resposta

12

Para generalizar isso é questão de recuperar todos os termos de taxonomia A que os posts com termo específico de taxonomia B têm.

Embora isso não seja impossível em vários passos e muito looping através de postagens (o que de fato será ineficiente), eu acho razoável passar pelo SQL para eficiência.

Minha interpretação seria:

/**
 * 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' ) );
    
por Rarst 25.04.2012 / 14:28