Obtendo links em várias categorias (interseção)

4

Estou usando get_bookmarks() para obter links de favoritos. Posso obter links postados em cat A ou cat B, mas eu só quero links em A e B .

Exemplo do que preciso:

Eu tenho três categorias de link cat#1 , cat#2 , cat#3 .

Eu preciso obter links em cat#1 AND cat#2 não cat#1 OR cat#2 (interseção).

Atualmente estou usando:

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

O que não funciona devido a como 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 do Editor: Adicionando código de amostra para facilitar o entendimento - Marcadores são consultados com uma cláusula OR por padrão. Como eles são recuperados via $wpdb->get_result() , não há solução fácil na filtragem, além do resultado consultado.

Qualquer ajuda ou ideia de abordagem diferente seria muito apreciada.

UPDATE

Eu estou tentando fazer uma nova função fora da função get_bookmarks ().

Eu mudei o código mostrado acima para abaixo (alterado para OU). Mas agora nada está retornando. Talvez eu precise mudar o SQL para outra coisa. Então, vou precisar de conselhos sobre isso.

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) . ' ';
                }
            }
        }
    }
    
por Sisir 13.08.2012 / 14:32

3 respostas

1

Deve ser simples assim: Basta pegar os termos do link_category e usar o argumento get_terms() , que deve funcionar como você precisa.

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

Bifurcação get_bookmarks() parece problemático, codifico um pouco (e cache se ficar lento). Algo parecido com isto:

/**
 * 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 ) ) );
}
    
por Rarst 19.08.2012 / 19:29
0

Use get_objects_in_term para pegar todos os objetos usando esses termos de maneira semelhante a esta:

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