¿Cómo cambiar la función de búsqueda de un tema para mostrar solo resultados de WooCommerce?
Soy muy nuevo en esto y estoy tratando de aprender sobre la marcha.
Compré un tema premium en Themeforest sin verificar completamente la funcionalidad de varias páginas. Intenté con su soporte pero no me ofrecieron solución.
Ahora estoy revisando el código con muy poco conocimiento sobre él. Sigo intentando aprender.
¿Alguien podría ayudarme un poco con esto?:
1- He identificado tres archivos PHP (código abajo) que podrían resolver esto, creo que el primero es el más relevante.
2- Como soy nuevo, ¿alguien podría indicarme el campo correcto para editar? ¿Sería "( get_post_type() === 'job_listing') lo que necesita cambiarse?
Gracias.
searchform.php
<form class="search-form" method="get" action="<?php echo esc_url( home_url( '/' ) );
?>" role="search">
<?php if ( get_post_type() === 'job_listing' ) {
echo '<input type="hidden" name="post_type" value="job_listing" />';
} ?>
<input class="search-field" type="text" name="s" id="s" placeholder="<?php esc_html_e
( '¿Qué estás buscando?', 'listable' ); ?>" autocomplete="off"
value="<?php the_search_query(); ?>"/>
<button class="search-submit" name="submit" id="searchsubmit"></button>
search.php:
<?php
/**
* Archivo de resultados de búsqueda
*
* @link https://codex.wordpress.org/Template_Hierarchy
*
* @package Listable
*/
get_header(); ?>
<div id="primary" class="content-area">
<main id="main" class="site-main" role="main">
<header class="page-header">
<h1 class="page-title"><?php printf( esc_html__( 'Resultados de búsqueda para: %s', 'listable' ), '<span>' . get_search_query() . '</span>' ); ?></h1>
</header>
<?php if ( have_posts() ) : ?>
<?php /* Comienza el Loop */ ?>
<div class="postcards">
<div class="grid">
<?php /* Comienza el Loop */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<div class="grid__item postcard">
<?php
/*
* Incluye la plantilla específica del Formato de Post para el contenido.
* Si quieres sobrescribir esto en un tema hijo, incluye un archivo
* llamado content-___.php (donde ___ es el nombre del Formato de Post) y se usará ese en su lugar.
*/
get_template_part( 'template-parts/content', get_post_format() );
?>
</div>
<?php endwhile; ?>
</div>
<?php the_posts_navigation(); ?>
</div>
<?php else : ?>
<?php get_template_part( 'template-parts/content', 'none' ); ?>
<?php endif; ?>
</main><!-- #main -->
search-job_listings.php
<?php
/**
* Archivo de resultados de búsqueda solo para listados
*
* @link https://codex.wordpress.org/Template_Hierarchy
*
* @package Listable
*/
get_header(); ?>
<div id="primary" class="content-area">
<div class="entry-content">
<main id="main" class="site-main" role="main">
<?php
global $current_jobs_shortcode;
$shortcode = '[jobs keywords="'. get_search_query() .'" show_filters="true"';
//obtener el parámetro show_map del shortcode de trabajos en la página de listados (seleccionado en ajustes de WPJM)
//lo aplicaremos aquí también
$show_map = listable_listings_page_shortcode_get_show_map_param();
if ( false === $show_map ) {
$shortcode .= ' show_map="false"';
} else {
$shortcode .= ' show_map="true"';
}
//obtener el parámetro orderby del shortcode de trabajos en la página de listados
//lo aplicaremos aquí también
$orderby = listable_listings_page_shortcode_get_orderby_param();
$shortcode .= ' orderby="' . $orderby . '"';
//obtener el parámetro order del shortcode de trabajos en la página de listados
//lo aplicaremos aquí también
$order = listable_listings_page_shortcode_get_order_param();
$shortcode .= ' order="' . $order . '"';
$shortcode .= ']';
//guardar el shortcode para usarlo después y ver sus parámetros en filtros
//esto es porque WPJM no pasa los parámetros en algunos filtros
$current_jobs_shortcode = $shortcode;
echo do_shortcode( $shortcode );
$current_jobs_shortcode = null;
?>
</main><!-- #main -->
</div>
</div><!-- #primary -->
<?php
get_sidebar();
get_footer(); ?>

No estoy seguro a qué se refiere el tipo de publicación job_listing
- probablemente sea parte de una función incluida en tu tema - pero para limitar los resultados de búsqueda por tipo de publicación, la forma habitual es enganchándose a la acción pre_get_posts
de WordPress en el archivo functions.php
de tu tema.
Como eres nuevo en esto, hay un par de respuestas que deberías leer primero:
Luego, con ese conocimiento, vamos a engancharnos a la acción pre_get_posts
en nuestro functions.php
(puedes hacer esto con fines de prueba dentro de tu tema actual si lo deseas, pero como se explica en la respuesta sobre temas hijo anterior, tu código será sobrescrito cuando actualices tu tema, por lo que deberías usar un tema hijo para preservarlo).
Abre tu functions.php
y agrega:
add_action( 'pre_get_posts', 'wpse223576_search_woocommerce_only' );
function wpse223576_search_woocommerce_only( $query ) {
if( ! is_admin() && is_search() && $query->is_main_query() ) {
$query->set( 'post_type', 'product' );
}
}
Encontrarás más detalles sobre cómo funciona esto en la documentación de pre_get_posts
. Como se explica en la primera respuesta que enlacé anteriormente, las acciones y filtros (conocidos juntos como 'hooks') te permiten modificar el funcionamiento del núcleo de WordPress, plugins y temas, ya sea ejecutando código en el momento justo o tomando datos, modificándolos y devolviéndolos. Así es como funciona toda la arquitectura conectable de WordPress.
En este fragmento de código anterior, estamos modificando la consulta de WordPress antes de que se ejecute para consultar sólo publicaciones del tipo product
. Como este es el tipo de publicación que WooCommerce usa internamente para almacenar productos, solo obtendrás productos de WooCommerce en los resultados (también verificamos, por supuesto, que realmente estemos haciendo una búsqueda; que no estemos en el panel de administración; y que esta sea la consulta principal - es decir, no un menú u otra consulta - para asegurarnos de no afectar más de lo que queremos).
Y así es como puedes limitar tus búsquedas para mostrar sólo resultados de productos de WooCommerce.

Ten en cuenta que este código ignora su función si lo pruebas desde la cuenta de administrador de WordPress.

@MojtabaRezaeian ¿Te refieres a por el is_admin()
? Esto verifica que el código solo se ejecute en el frontend del sitio y no en el panel de administración (porque los hooks del tema también pueden ejecutarse allí). No afecta si un administrador está conectado mientras ve el frontend (eso sería is_user_logged_in()
, opcionalmente junto con verificaciones adicionales para el nivel de usuario).

@TimMalone Sí, tienes razón amigo mío. Ese fue mi error y tal vez debería eliminar ese comentario porque está mal. Pero usando tu código no pude ver ningún cambio hasta que eliminé la parte $query->is_main_query()
y entonces solo devolvía productos, pero después de este cambio aparece un nuevo problema y obtengo resultados duplicados en lugar de uno. También busqué y agregué wp_reset_query();
y wp_reset_postdata();
a tu código pero sigo obteniendo los mismos resultados duplicados. Es muy extraño e inesperado.
