Interseção eficiente em taxonomia

9

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

Como exemplo, vou usar uma loja.

Dado:

  • Taxonomia de uma marca de produto
  • Uma taxonomia de grupo de produtos
  • Um tipo de postagem do produto
  • Modelos de arquivo para as taxonomias acima

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

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

Preciso de uma resposta genérica, embora esteja feliz com o exemplo de produtos de vestuário a ser usado, e sei como fazer isso com um algoritmo ganancioso por força bruta, mas isso é incrivelmente inútil, e não estou interessado em uma solução que aumentaria cada carregamento de página em vários segundos e carregaria todas as postagens completas do banco de dados no processo

edit: Exemplo 2:

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

Tom J Nowell
fonte

Respostas:

12

Para generalizar isso, é questão de recuperar todos os termos de taxonomia A que os posts com termos específicos de taxonomia B possuem.

Embora isso não seja impossível em várias etapas e com muitas repetições de mensagens (o que realmente será ineficiente), acho razoável analisar o SQL para obter eficiência.

Minha opinião aproximada 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' ) );
Rarst
fonte