Como passar um parâmetro de pesquisa $ _GET para uma nova página de pesquisa personalizada?

3

Até agora, na minha instalação do wordpress, tenho uma página completa de pesquisa do wordpress que posso chamar indo para:

/?s=mysearchstring

E isso pesquisa em páginas do wordpress que contenham a string " mysearchstring ".

Então, criei uma nova página "Pesquisa personalizada" ( /custom-search/ ) e atribuí um arquivo de modelo custom-search.php (mesmo código de search.php ).

Como posso adicionar um parâmetro de palavra-chave a isso?

/custom-search?s=mysearchstring não funciona, apenas mostra 404 Página não encontrada, enquanto /custom-search/ exibe uma página de pesquisa como um único resultado.

custom-search.php código :

<?php
/*
Template Name: Custom Search
*/
//Post ID
    global $wp_query;
    $content_array = $wp_query->get_queried_object();
    if(isset($content_array->ID)){
        $post_id = $content_array->ID;
    }
    else $post_id=0;

$template_uri = get_template_directory_uri();

//Search
    $allsearch = &new WP_Query("s=$s&showposts=-1");
    $count = $allsearch->post_count;
    wp_reset_query();
    $hits = $count == 1 ? $count." ".__("hit for","goodweb") : $count." ".__("hits for","goodweb");

get_header();
 ?>

junto com a lista de html.

O que posso fazer para passar a consulta de pesquisa de parâmetro para esta página?

    
por Ivan Ivković 26.11.2013 / 16:29

2 respostas

6

O problema é que 's' param é um parâmetro de consulta padrão do WordPress, quando você usa o url /custom-search?s=mysearchstring o seu está dizendo ao WordPress para recuperar a página 'custom-search' que contém a string 'mysearchstring' e isso traz um 404 .

Você tem 2 possibilidades:

  1. use outro nome de string de consulta, algo como /custom-search?cs=mysearchstring e, dentro do modelo de página, use a variável $_GET['cs'] em vez da variável $_GET['s']
  2. envie todas as pesquisas para o URL de origem: /?s=mysearchstring , mas conecte 'template_include' para usar custom-search.php em vez de search.php . Isso pode ser feito sem criar uma página 'custom-search'.

Solução 1

A única coisa que você precisa fazer é usar a string de consulta 'cs' em vez de 's' e, em seguida, dentro do seu modelo, use:

// ...
$s = filter_input(INPUT_GET, 'cs', FILTER_SANITIZE_STRING);
$allsearch = &new WP_Query("s=$s&showposts=-1");
// ...

Solução 2

Exclua a página 'página personalizada' que usa o modelo "Custom Search" : você não precisa dela. Você pode remover os cabeçalhos dos modelos, se quiser.

Envie todos os seus pedidos de pesquisa para /?s=mysearchstring .

Agora para o seu functions.php add

add_filter('template_include', 'my_custom_search_template');

function my_custom_search_template( $template ) {
  if ( is_search() ) {
    $ct = locate_template('custom-search.php', false, false);
    if ( $ct ) $template = $ct;
  }
  return $template;
}

Ao fazer isso, todas as solicitações de pesquisa serão exibidas usando seu custom-search.php (se existir). Observe que a pesquisa já foi feita na consulta principal, portanto, não é necessário executá-la novamente, se você quiser definir posts_per_page para -1 use pre_get_posts :

add_action('pre_get_posts', 'search_no_paging');

function search_no_paging( $q ) {
  if ( $q->is_main_query() && $q->is_search() && ! is_admin() ) {
    $q->set('posts_per_page', -1);
  }
}

E no seu custom-search.php use:

global $wp_query;
$count = $wp_query->post_count;
$hits = $count == 1 ? $count." ".__("hit for","goodweb") : $count." ".__("hits for","goodweb");
get_header();

while( have_posts() ) { the_post();
  // your loop here
}

Como você pode ver, não precisa executar uma consulta personalizada porque a consulta principal faz o trabalho.

A solução 1 é a melhor opção se você quiser mostrar o conteúdo da página ao lado dos resultados da pesquisa, mas se você criar essa página sem conteúdo, com o único objetivo de usar o modelo personalizado para resultados de pesquisa, a solução 2 será melhor porque:

  1. é independente de tema: o código pode ser colocado em um plug-in e usado com qualquer tema, e também não precisa que a página seja criada no backend
  2. tem mais desempenho: se você usar a solução 1, duas consultas serão executadas, a primeira para obter a página e a segunda para obter resultados de pesquisa; usando a solução 2, apenas uma consulta é executada
por gmazzap 26.11.2013 / 18:16
2

Uma string GET funcionará como em qualquer outro aplicativo PHP, mas você não pode usar um parâmetro de consulta que o WordPress usa . Esse é o problema aqui. O WordPress já usa s . Use outra coisa, como 'mys'.

Honestamente, sua pesquisa personalizada se parece muito com uma pesquisa normal, então não entendo por que você está fazendo isso.

    
por s_ha_dum 26.11.2013 / 17:19

Tags