Wordpress Multiple Category Search

4

A partir de alguns meses, estou pesquisando o wordpress para várias opções de pesquisa de categoria e, finalmente, descobri isso.

Acabei de descobrir que o wordpress permite várias tags, o que significa que, se no seu URL você digitar isso

http://yourblog.com/tag/tag1+tag2

então ele retornará todas as suas postagens com tags, tag1 AND tag2

mas se você digitar

http://yourblog.com/tag/tag1,tag2

então ele retornará todas as postagens com tag1 OR tag2

A mesma coisa funciona agora também para categorias

http://yourblog.com/category/cat1+cat2 e http://yourblog.com/category/cat1,cat2

Mas isso só funciona para categoria e tags, estou tentando para a opção de pesquisa.

Até agora eu codifiquei onde esta URL está funcionando (o que significa que ele irá procurar HTML apenas na identificação da categoria 114),

http://yourblog.com/?s=html&cat=114

Neste URL, o separador de vírgulas funciona muito bem, mas não o +

Eu quero dizer

http://yourblog.com/?s=html&cat=114,115

funciona muito bem, mas

http://yourblog.com/?s=html&cat=114+115

não funciona.

Alguém pode me ajudar nisso? Eu realmente quero que isso funcione

Ainda aguardando

    
por Niraj Chauhan 29.08.2011 / 05:58

3 respostas

4

O problema é que em um url o sinal '+' é equivalente a um espaço, então é assim que o PHP o vê.

Se você usar uma ação em parse_request , poderá fazê-lo funcionar assim:

add_action( 'parse_request', 'category_search_logic', 11 );
function category_search_logic( $query ) {

    if ( ! isset( $query->query_vars[ 'cat' ] ) )
        return $query;

    // split cat query on a space to get IDs separated by '+' in URL
    $cats = explode( ' ', $query->query_vars[ 'cat' ] );

    if ( count( $cats ) > 1 ) {
        unset( $query->query_vars[ 'cat' ] );
        $query->query_vars[ 'category__and' ] = $cats;
    }

    return $query;
}

Acima, os IDs de categoria serão passados com '+' entre eles, dividindo-os em um espaço que é o que o PHP vê no parâmetro $ _GET.

Se tivermos mais de um item na matriz, deve ser uma pesquisa de estilo 'e' para que possamos passar a matriz da divisão no espaço para a var de 'category__and' query que retorna postagens em todas as categorias especificadas. / p>     

por sanchothefat 31.10.2011 / 11:54
1

Tente isto: http://yourblog.com/?s=html&cat[]=114&cat[]=115

BTW, por que você não usa um link de gancho pre_get_posts para filtrar sua pesquisa? Seria muito mais fácil do que ajustar o URL de pesquisa.

    
por Anh Tran 31.08.2011 / 03:31
1

A solução sugerida por @sanchothefat é OK, mas leva a problemas quando a paginação é usada. Por exemplo, você tem um URL como domain.com/?s=&cat=1+2. Quando você clica na página 2, o URL se torna domain.com/?s=&cat=1+2, mas o redirect_canonical () definido em wp-includes / canonical.php tenta modificar o URL para domain.com/?s&cat = 12 que não é o mesmo ... Achei mais fácil reescrever category_search_logic () em vez de investigar a lógica redirect_canonical () e aplicar filtros adicionais a ela.

Esta é a minha maneira de comprar a lógica canônica:

function category_search_logic( $query ) {
    if ( ! isset( $_GET['categories'] ) )
        return $query;

    // split cat query on a space to get IDs separated by ',' in URL
    $cats = explode(',', $_GET['categories'] );

    if ( count( $cats ) > 1 ) {
        unset($_GET['categories']);
        $query->query_vars[ 'category__and' ] = $cats;
    }

    return $query;
}
    
por stz184 21.01.2014 / 08:31