¿Cómo pasar un parámetro de búsqueda $_GET a una nueva página de búsqueda personalizada?
Hasta ahora en mi instalación de WordPress tengo una página de búsqueda completa que puedo llamar yendo a:
/?s=micadenabusqueda
Y esto busca a través de las páginas de WordPress que contienen la cadena "micadenabusqueda
".
He creado una nueva página "Búsqueda Personalizada" (/custom-search/
) y le he asignado un archivo de plantilla custom-search.php
(mismo código que search.php
).
¿Cómo puedo añadir un parámetro de palabra clave a esto?
/custom-search?s=micadenabusqueda
no funciona del todo, solo muestra 404 Página No Encontrada, mientras que /custom-search/
muestra una página de búsqueda como único resultado.
custom-search.php
código:
<?php
/*
Template Name: Custom Search
*/
//ID del Post
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();
//Búsqueda
$allsearch = &new WP_Query("s=$s&showposts=-1");
$count = $allsearch->post_count;
wp_reset_query();
$hits = $count == 1 ? $count." ".__("resultado para","goodweb") : $count." ".__("resultados para","goodweb");
get_header();
?>
junto con el listado html.
¿Qué puedo hacer para pasar la consulta de búsqueda por parámetro a esta página?

El problema es que el parámetro 's'
es un parámetro de consulta estándar de WordPress, cuando usas la URL /custom-search?s=mysearchstring
le estás diciendo a WordPress que recupere la página 'custom-search'
que contenga la cadena 'mysearchstring'
y esto genera un error 404.
Tienes 2 posibilidades:
- Usar otro nombre para el parámetro de búsqueda, algo como
/custom-search?cs=mysearchstring
y luego dentro de la plantilla de página usar la variable$_GET['cs']
en lugar de$_GET['s']
. - Enviar todas las búsquedas a la URL principal:
/?s=mysearchstring
pero enganchando'template_include'
para usarcustom-search.php
en lugar desearch.php
. Esto se puede hacer sin crear una página 'custom-search'.
Solución 1
Lo único que debes hacer es usar el parámetro 'cs'
en lugar de 's'
, luego dentro de tu plantilla usa:
// ...
$s = filter_input(INPUT_GET, 'cs', FILTER_SANITIZE_STRING);
$allsearch = &new WP_Query("s=$s&showposts=-1");
// ...
Solución 2
Elimina la página 'custom-page' que usa la plantilla "Custom Search"
: no la necesitas. Puedes eliminar también los encabezados de la plantilla si lo deseas.
Envía todas tus búsquedas a /?s=mysearchstring
.
Ahora añade esto a tu functions.php
:
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;
}
De esta manera, todas las búsquedas se mostrarán usando tu custom-search.php
(si existe). Ten en cuenta que la búsqueda ya se realiza en la consulta principal, por lo que no necesitas ejecutarla de nuevo. Si deseas configurar posts_per_page
a -1, usa 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);
}
}
Y en tu custom-search.php
usa:
global $wp_query;
$count = $wp_query->post_count;
$hits = $count == 1 ? $count." ".__("resultado para","goodweb") : $count." ".__("resultados para","goodweb");
get_header();
while( have_posts() ) { the_post();
// tu loop aquí
}
Como puedes ver, no necesitas ejecutar una consulta personalizada porque la consulta principal ya hace el trabajo.
La solución 1 es la mejor opción si deseas mostrar el contenido de la página junto con los resultados de búsqueda. Pero si estás creando esa página sin contenido, con el único objetivo de usar la plantilla personalizada para resultados de búsqueda, la solución 2 es mejor porque:
- Es independiente del tema: el código puede colocarse en un plugin y usarse con cualquier tema, además no requiere que la página se cree en el backend.
- Es más eficiente: si usas la solución 1, se ejecutan dos consultas (una para obtener la página y otra para los resultados de búsqueda); con la solución 2 solo se ejecuta una consulta.

Una cadena GET
funcionará igual que en cualquier otra aplicación PHP, pero no puedes usar un parámetro de consulta que WordPress utiliza. Ese es el problema aquí. WordPress ya usa s
. Utiliza algo diferente, como 'mys'.
Honestamente, aunque tu búsqueda personalizada se parece mucho a una búsqueda normal, así que no entiendo realmente por qué estás haciendo esto.
