Intersección de taxonomía eficiente

9

Tengo muchos usos para esto, pero quiero saber la forma más eficaz de hacer lo que será una operación costosa.

Como ejemplo usaré una tienda.

Dado:

  • Una taxonomía de marca de producto
  • Una taxonomía de grupo de productos
  • Un tipo de publicación de producto
  • Plantillas de archivo para las taxonomías anteriores

¿Cuál es el método más eficiente y eficaz de mostrar un menú de marca en un archivo de tipo de producto y un tipo de producto en un archivo de marca, pero solo muestra los términos que se aplican a las publicaciones en ese grupo?

Por ejemplo, si estoy en el grupo de productos 'womens', se mostrarán las marcas en el lado izquierdo, pero solo las marcas que están especificadas para productos en el grupo de productos 'womens'. P.ej. La marca 'Fancy womens clothes Inc' se mostraría, pero no 'Manly mens Manly ltd'.

Necesito una respuesta genérica, aunque me alegra que se use el ejemplo de productos de ropa, y sé cómo hacerlo con un algoritmo codicioso por fuerza bruta, pero eso es un desperdicio increíble, y no me interesa una solución que aumentaría cada carga de página en varios segundos y cargaría todas las publicaciones en su totalidad desde la base de datos en el proceso

editar: Ejemplo 2:

Pikachu es un pokemon amarillo, y está en la etiqueta amarilla, pero Pikachu también es un pokemon eléctrico, por lo que está en la etiqueta eléctrica del tipo de taxonomía. ¿Cómo mostraría solo los tipos de pokemon que son amarillos cuando están en el archivo de etiqueta amarilla? p.ej. si todos los pokemon de césped son verdes significa que no habrá un elemento del menú de césped cuando se encuentre en el archivo amarillo pero lo haría en el green (sí, sé que hay pokemon de hierba que no son verdes)

    
pregunta Tom J Nowell 25.04.2012 - 12:56

1 respuesta

12

Para generalizar esto, se trata de recuperar todos los términos de la taxonomía A que se publican con el término específico de taxonomía B.

Si bien esto no es imposible en varios pasos y hay muchos bucles en las publicaciones (que de hecho serán ineficientes), creo que es razonable pasar por el SQL para la eficiencia.

Mi versión aproximada sería:

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

Lea otras preguntas en las etiquetas