Obtención de enlaces en múltiples categorías (intersección)

4

Estoy usando get_bookmarks() para obtener enlaces de marcadores. Puedo obtener los enlaces publicados en el gato A or gato B, pero solo quiero los enlaces en ambos A y B .

Ejemplo de lo que necesito:

Tengo tres categorías de enlaces cat#1 , cat#2 , cat#3 .

Necesito obtener enlaces tanto en cat#1 AND cat#2 no cat#1 OR cat#2 (intersección).

Actualmente estoy usando:

$links = get_bookmarks(array('category' => $term_ids));

Lo que no funciona debido a cómo get_bookmarks() funciona .

        $category_query = '';
        $join = '';
        if ( !empty($category) ) {
                $incategories = preg_split('/[\s,]+/',$category);
                if ( count($incategories) ) {
                        foreach ( $incategories as $incat ) {
                                if (empty($category_query))
                                        $category_query = ' AND ( tt.term_id = ' . intval($incat) . ' ';
                                else
                                        $category_query .= ' OR tt.term_id = ' . intval($incat) . ' ';
                        }
                }
        }

Nota del editor: Agregar código de muestra para una comprensión más fácil: los marcadores se consultan con una cláusula OR de forma predeterminada. A medida que se recuperan a través de $wpdb->get_result() , no hay una solución fácil para filtrar aparte del resultado consultado.

Cualquier ayuda o idea de enfoque diferente sería muy apreciada.

ACTUALIZAR

Estoy tratando de hacer una nueva función de la función get_bookmarks ().

Cambié el código que se muestra arriba a esto a continuación (cambiado de OR a AND). Pero ahora nada está volviendo. Tal vez necesito cambiar el SQL a otra cosa. Por lo tanto, necesitaré consejos sobre esto.

if ( !empty($category) ) {
        $incategories = preg_split('/[\s,]+/',$category);
        if ( count($incategories) ) {
            foreach ( $incategories as $incat ) {
                if (empty($category_query))
                    $category_query = ' AND ( tt.term_id = ' . intval($incat) . ' ';
                else{
                    // sisir
                    $category_query .= ' AND tt.term_id = ' . intval($incat) . ' ';
                }
            }
        }
    }
    
pregunta Sisir 13.08.2012 - 14:32

3 respuestas

1

Debería ser tan simple como eso: simplemente obtenga los términos del link_category y use el argumento get_terms() en su lugar, que debería funcionar como usted lo necesita.

get_terms(
     'link_category'
    ,array(
         'include'      => array( 1, 2, 3 )
        ,'orderby'      => 'name'
        ,'order'        => 'ASC'
        ,'hierarchical' => 0
     )
);
    
respondido por el kaiser 13.08.2012 - 16:28
1

Bifurcar get_bookmarks() parece problemático, codificaría un poco (y caché si se vuelve lento). Algo como esto:

/**
 * Retrieve links that have all of the terms assigned.
 * 
 * @param array $term_ids
 *
 * @return array of link objects
 */
function get_bookmarks_in_terms( $term_ids ) {

    $bookmark_ids = array();

    foreach ( $term_ids as $term_id ) {

        $bookmarks_in_term = get_objects_in_term( $term_id, 'link_category' );

        if ( empty( $bookmarks_in_term ) )
            return array();

        if ( empty( $bookmark_ids ) )
            $bookmark_ids = $bookmarks_in_term;
        else
            $bookmark_ids = array_intersect( $bookmark_ids, $bookmarks_in_term );
    }

    if ( empty( $bookmark_ids ) )
        return array();

    return get_bookmarks( array( 'include' => implode( ',', $bookmark_ids ) ) );
}
    
respondido por el Rarst 19.08.2012 - 19:29
0

Utilice get_objects_in_term para capturar todos los objetos que usan esos términos, de modo que tenga algo parecido a esto:

$objects = get_objects_in_term($term_ids,'link_category');
$links = get_bookmarks(array('include' => $objects ));
    
respondido por el Tom J Nowell 17.08.2012 - 13:48

Lea otras preguntas en las etiquetas