¿Mostrar ciertos términos de la taxonomía personalizada pero excluir los términos "principales"?

2

Tengo un tipo de publicación personalizada "mycustom_products" (jerárquico) que tiene taxonomías personalizadas denominadas 'categorías' y 'etiquetas' (como muchos otros tipos de publicaciones personalizadas). Mi categoría personalizada se llama "myprod_category" (también jerárquica) y mi taxonomía de etiquetas se llama "product_tag" ( no hierarchical).

Quiero mostrar una lista de etiquetas de productos que corresponden SOLAMENTE a ciertas categorías de productos.

Por ejemplo, con categorías de productos como "soap" & "loción", podría haber etiquetas llamadas "Blueberry" o "Lavender" (aromas), pero "joyería" tendría etiquetas como "plata" u "oro". Quiero poder tener una lista de las etiquetas de "aroma" (que serían las que corresponden solo con las categorías de "jabón" y "loción". No quiero que se incluyan las etiquetas de "joyería" Por lo tanto, se incluirían todas las etiquetas que se hayan utilizado en los productos ingresados en esas categorías, y no se utilizarán para otras categorías.

Obviamente, podría codificar todo en el tema, pero si / cuando el cliente agregue más etiquetas, tendría que ingresar y volver a codificar todo y me gustaría evitar hacerlo.

Intenté usar <?php wp_tag_cloud( array( 'taxonomy' => 'product_tag', format => 'list' ) ); ?> para enumerar todas mis etiquetas, pero parece que no puedo obtener el argumento EXCLUDE para evitar que se muestren "categorías de productos" completas. Parece que puedo hacerlo usando el tag_ID, pero eso sería tedioso, y me pondría de nuevo en el código duro en el tema y tener que actualizar cada vez que se agrega una nueva etiqueta.

¿Hay un filtro o algo que pueda usar para excluir una categoría? O hay una mejor manera de enumerar las etiquetas de esta manera. Gracias!

    
pregunta RodeoRamsey 05.05.2011 - 06:21

2 respuestas

5
  

Si tienes muchos productos, probablemente una consulta SQL personalizada sea una mejor opción.

Probablemente recomiendo seguir esa ruta de cualquier manera. Las consultas personalizadas pueden ser complicadas, pero aligerará los recursos y será un poco más rápido en la mayoría de los casos *

He escrito una función que realiza la mayor parte del trabajo, y puede ser útil en otros escenarios (he usado la palabra 'suave' para sugerir que las relaciones no son explícitas).

/**
 * Get terms that are indirectly associated with others through the posts they
 * are attached to.
 * 
 * @see http://codex.wordpress.org/Function_Reference/WP_Query#Taxonomy_Parameters
 * @link http://wordpress.stackexchange.com/questions/16393/
 * 
 * @param string|array $taxonomy The taxonomy(s) of the terms you wish to obtain.
 * @param array $tax_query A tax query for the posts you want to make the association with.
 * @return array Array of term IDs.
 */
function get_terms_soft_associated( $taxonomy, $tax_query  )
{
    global $wpdb;

    // so you can pass a single tax query rather than wasted nested array
    if ( isset( $tax_query['taxonomy'] ) )
        $tax_query = array( $tax_query );

    $tax = new WP_Tax_Query( $tax_query );
    extract( $tax->get_sql( $wpdb->posts, 'ID' ) );

    if ( empty( $join ) || ( !$posts = $wpdb->get_col( "SELECT $wpdb->posts.ID FROM $wpdb->posts $join WHERE 1=1 $where" ) ) )
        return array();

    $taxonomy = implode( "','", array_map( 'esc_sql', ( array ) $taxonomy ) );
    $posts = implode( ',', wp_parse_id_list( $posts ) );

    return $wpdb->get_col(
        "SELECT DISTINCT t.term_id FROM $wpdb->terms AS t " .
        "INNER JOIN $wpdb->term_taxonomy AS tt ON tt.term_id = t.term_id " .
        "INNER JOIN $wpdb->term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id " .
        "WHERE tt.taxonomy IN('$taxonomy') AND tr.object_id IN($posts)"
    );
}

También puede consultar el códice sobre consultas de impuestos para obtener más ayuda con $tax_query . Esta es la consulta que utilizamos para filtrar publicaciones, antes de realizar una búsqueda inversa para recopilar todos los términos de otra taxonomía.

Ahora en adelante a la solución;

// suggestion 1 - for a single post
$product_cats = get_the_terms( get_the_ID(), 'myprod_category' );

// suggestion 2 - for a product category archive
$product_cats = get_queried_object_id();

// suggestion 3 - for all posts on the current page of an archive
foreach( $wp_query->posts as $_post ) {
    $_product_cats = get_the_terms( $_post->ID, 'myprod_category' );
    foreach ( $_product_cats as $_product_cat )
        $product_cats[] = $_product_cat->term_id;
}

// now get the 'associated' tag IDs
$product_assoc_tags = get_term_soft_association( 'product_tag', array(
    'taxonomy' => 'myprod_category',
    'field'    => 'term_id',
    'terms'    => $product_cats
) );

wp_tag_cloud( array( 'taxonomy' => 'product_tag', 'include' => $product_assoc_tags ) );

Tenga en cuenta que las sugerencias son ejemplos de cómo tomar todas las categorías de productos para consultarlas posteriormente, dependiendo de su circunstancia y de qué publicaciones desea afectar el resultado (¡solo use una de las sugerencias, o la suya!) .

Si descubre que no está funcionando como esperaba , es probable que solo tengamos que modificar la consulta de impuestos para el segundo argumento de la función.

* Nota al pie: las consultas de publicaciones nativas extraen todos los datos de las publicaciones, mientras que solo necesitamos trabajar con ID. Guardar la memoria donde siempre puedes ayudar, y como dice @Daniel, si estamos hablando de muchas publicaciones, también estamos hablando de mucha memoria.

También digo más rápido, ya que, bajo condiciones de uso inmediato, estamos usando menos consultas de base de datos & procesando que habíamos utilizado funciones como get_terms() y get_posts() .

    
respondido por el TheDeadMedic 09.05.2011 - 23:19
1

Si te entiendo correctamente, creo que no hay una opción directa.

Debe consultar todos los productos dentro de la categoría que desea, repetir esos registros y obtener las etiquetas para cada producto. Esto será lento si tiene muchos productos.

Algo parecido (esto es para categorías / etiquetas regulares, debe modificarlo según sus taxonomías personalizadas)

    $posts = get_posts("cat=5&numberposts=-1");
$tags = Array();
foreach ($posts as $ipost){
    $posttags = get_the_tags($ipost->ID);
    foreach ($posttags as $posttag){
        if (!in_array($posttag->term_id, $tags)){
            array_push($tags, $posttag->term_id);

        }
    }
}

Ahora tiene en $ tags las ID únicas de las etiquetas que está buscando.

Si tienes muchos productos, probablemente una consulta SQL personalizada sea una mejor opción.

    
respondido por el MZAweb 09.05.2011 - 18:41

Lea otras preguntas en las etiquetas