Pesquisa no WordPress: URLs bonitas (permalinks), tipos de postagem personalizados e paginação

4

Eu tenho três caixas de pesquisa separadas no meu site: species pesquisa CPT, glossary pesquisa CPT e uma pesquisa geral que eu gostaria de pesquisar post e species tipos de postagens.

Minhas perguntas são três,

  1. Qual é o código mais eficiente / eficaz para criar URLs de pesquisa, e há uma razão pela qual o WordPress não os ativa por padrão?
  2. Tendo em mente que código preciso usar em searchform-species , searchform-glossary , search e searchresults para especificar que a pesquisa de minha espécie retornará apenas resultados de espécies, o glossário retornará os resultados do glossário, etc.
  3. Como incorporo paginação?

O código que estou tentando atualmente é o seguinte:

CÓDIGO PARA # 1

add_action( 'template_redirect', 'my_rewrite' );
function my_rewrite() {

    if ( is_search() and false === strpos( $_SERVER['REQUEST_URI'], '/search/' ) ) {
        wp_redirect( get_bloginfo( 'home' ) . '/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) );
        exit();
    }

}

CÓDIGO PARA # 2 & # 3

searchform.php

<?php
    $search_query = get_search_query();
    if (!$search_query) {
        $search_query = "SEARCH";
    }
?>
<form id="topbar_search" action="<?php echo home_url( '/' ); ?>" method="post">
    <p>SEARCH</p>
    <input type="text" size="50" value="<?php echo $search_query; ?>" name="s" id="s" class="topbar_longinput default-value" />
    <input type="submit" value="GO" class="topbar_submit" />
    <p class="tinylinks"><a href="#1">advanced search</a></p>
</form>

searchform-species.php

<h1 class="profilesearch">PROFILE<span class="white">SEARCH</span></h1>
<form id="profilesearch" action="<?php echo home_url( '/' ); ?>" method="post">
    <input type="hidden" name="type" value="profile" />

    <input type="text" size="50" class="default-value" value="SEARCH" name="s" />
    <input type="submit" value="GO" class="profilesearch_submit" />
    <!-- <p class="tinysearch"><a href="/dev/advanced-search/">ADVANCED SEARCH</a></p> -->
    <input type="checkbox" name="showthumbnails" id="showthumbnails" class="checkbox" <?php if ($_POST["showthumbnails"] == "on") { echo 'checked="checked" '; } ?>/><label for="showthumbnails">HIDE THUMBNAILS</label>
</form>

search.php     

    if (isset($_REQUEST["type"])) {
        switch ($_REQUEST["type"]) {
            case "profile" :
                $post_type = "species";
                break;
            case "glossary" :
                $post_type = "glossary";
                break;
            default :
                $post_type = array( 'post', 'species' );
                break;
        }
    } else {
        $post_type = array( 'post', 'species' );
    }

    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

    $args = array(
        's' => $search_term,
        'post_type' => $post_type,
        'paged' => $paged
    );
?>

<?php get_template_part('searchresults'); ?>

O que está acontecendo atualmente é:

As pesquisas individuais funcionam, mas a paginação não funciona. Quando clico no botão next/previous_posts_link , ele adiciona /page/2/ ao URL e não faz nada. Se eu tentar ecoar o get_query_var('page') , ele retornará NULL . Se eu tentar ecoar 'paged' , ele retornará 0 .

Além disso, quando um usuário clica nesse link, a variável $search_query de searchform.php é exibida como page/bettas (onde bettas é a consulta original).

Idealmente, o que eu gostaria de acontecer é isto:

  1. Na "pesquisa geral", um usuário insere betta . O URL muda para /search/betta , que lista qualquer conteúdo post ou species contendo a palavra betta .
  2. Na "busca de espécies", um usuário insere betta . O URL muda para /search/betta/species (ou o que for melhor para SEO) e exibe uma lista de apenas species content contendo a palavra betta .
  3. O mesmo usuário como nº 2, em seguida, clica no botão Próximo ( previous_posts_link ). O URL muda para /search/betta/species/page/2 e o usuário vê as próximas 25 espécies listadas.

Sou um completo novato na reescrita e paginação do WP, então qualquer ajuda seria muito apreciada.

    
por dunc 01.03.2012 / 12:06

1 resposta

2

A paginação pode ser feita exatamente da mesma maneira que funciona em qualquer outro lugar no modelo de arquivo de pesquisa.

Não há necessidade de sua consulta personalizada e tipo de variável no search.php também. Para pesquisar por uma postagem personalizada específica, você pode modificar a consulta ou acessar o arquivo de postagens e anexar a consulta de pesquisa, por exemplo,

example.com/event_post_type/?s=term

O mesmo acontece com qualquer categoria ou arquivo de taxonomia, basta adicionar? s = searchterm no final para transformá-lo em uma consulta de pesquisa, assim como adicionar / feed / ao final do URL fornecerá um feed RSS2 para esse conteúdo específico de página / arquivo.

Você tem a tarefa de embelezar a inclusão de uma regra extra de reescrita para convertê-la em algo mais agradável, por exemplo:

function search_rewrite( $wp_rewrite ) {

    $feed_rules = array(
        'search/(.+)/events'    =>  'index.php?post_type=events&s='. $wp_rewrite->preg_index(1)
    );

    $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( 'generate_rewrite_rules', 'search_rewrite' );

Permitiria que você fizesse exemplo.com/search/searchterm/events, embora eu recomende / events / search / searchterm como uma maneira melhor de fazer isso.

Use o plugin monkeyman reescrever regras para testar suas alterações, e você pode encontrar mais detalhes sobre regras de reescrita nesta resposta aqui: URL bonito com add_query_var

    
por Tom J Nowell 01.03.2012 / 13:01