Cum să modific funcția de căutare a unui temă pentru a afișa doar rezultate din WooCommerce?
Sunt foarte nou în acest domeniu și încerc să învăț pe parcurs.
Am cumpărat un temă premium de pe Themeforest fără să verific funcționalitățile diferitelor pagini. Am încercat suportul lor, dar nu am primit nicio soluție.
Acum mă uit la cod cu foarte puține cunoștințe despre el. Încerc totuși să învăț.
Poate cineva să mă ajute puțin cu asta:
1- Am identificat trei fișiere PHP (codul este mai jos) care ar putea rezolva această problemă, cred că primul este cel mai relevant.
2- Deoarece sunt începător, poate cineva să-mi arate câmpul corect de editat? Este "( get_post_type() === 'job_listing') care trebuie schimbat?
Mulțumesc.
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
( 'Ce cauți?', 'listable' ); ?>" autocomplete="off"
value="<?php the_search_query(); ?>"/>
<button class="search-submit" name="submit" id="searchsubmit"></button>
search.php:
<?php
/**
* Arhiva rezultatelor căutării
*
* @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__( 'Rezultate căutare pentru: %s', 'listable' ), '<span>' . get_search_query() . '</span>' ); ?></h1>
</header>
<?php if ( have_posts() ) : ?>
<?php /* Începe bucla */ ?>
<div class="postcards">
<div class="grid">
<?php /* Începe bucla */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<div class="grid__item postcard">
<?php
/*
* Include șablonul specific formatului postării pentru conținut.
* Dacă dorești să suprascrii asta într-un temă copil, atunci include un fișier
* numit content-___.php (unde ___ este numele formatului postării) și acesta va fi folosit în schimb.
*/
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
/**
* Arhiva rezultatelor de căutare doar pentru anunțuri
*
* @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"';
//obține parametrul show_map din shortcode-ul job de pe pagina de anunțuri (selectată în setările WPJM)
//il vom aplica și aici
$show_map = listable_listings_page_shortcode_get_show_map_param();
if ( false === $show_map ) {
$shortcode .= ' show_map="false"';
} else {
$shortcode .= ' show_map="true"';
}
//obține parametrul orderby din shortcode-ul job de pe pagina de anunțuri (selectată în setările WPJM)
//il vom aplica și aici
$orderby = listable_listings_page_shortcode_get_orderby_param();
$shortcode .= ' orderby="' . $orderby . '"';
//obține parametrul order din shortcode-ul job de pe pagina de anunțuri (selectată în setările WPJM)
//il vom aplica și aici
$order = listable_listings_page_shortcode_get_order_param();
$shortcode .= ' order="' . $order . '"';
$shortcode .= ']';
//salvează shortcode-ul pentru a-l putea folosi mai târziu în filtre pentru a analiza parametrii săi
//acest lucru este necesar deoarece WPJM nu trimite parametrii în unele filtre
$current_jobs_shortcode = $shortcode;
echo do_shortcode( $shortcode );
$current_jobs_shortcode = null;
?>
</main><!-- #main -->
</div>
</div><!-- #primary -->
<?php
get_sidebar();
get_footer(); ?>

Nu sunt sigur la ce se referă tipul de postare job_listing
- probabil face parte dintr-o funcționalitate inclusă în tema ta - dar pentru a limita rezultatele căutării după tipul de postare, metoda obișnuită este să folosești acțiunea pre_get_posts
din WordPress în fișierul functions.php
al temei tale.
Deoarece ești nou în acest domeniu, ar trebui să citești rapid câteva alte răspunsuri înainte:
Apoi, înarmați cu această cunoaștere, vom folosi acțiunea pre_get_posts
în functions.php
(poți face asta în scop de testare în tema curentă dacă dorești, dar așa cum este explicat în răspunsul despre teme copil de mai sus, codul tău va fi suprascris atunci când actualizezi tema, așa că ar trebui să folosești o temă copil pentru a-l păstra).
Deschide fișierul functions.php
și adaugă:
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' );
}
}
Găsești mai multe detalii despre cum funcționează acest lucru în documentația pentru pre_get_posts
. Așa cum este explicat în primul răspuns la care am făcut referire mai sus, acțiunile și filtrele (cunoscute împreună sub numele de 'hook-uri') îți permit să modifici modul în care funcționează nucleul WordPress, plugin-urile și temele, fie prin executarea de cod în momentul potrivit, fie prin preluarea de date, modificarea lor și returnarea lor. Acesta este modul în care funcționează întreaga arhitectură pluggable a WordPress.
În fragmentul de cod de mai sus, modificăm interogarea WordPress înainte ca aceasta să ruleze, pentru a interoga doar postări de tipul product
. Deoarece acesta este tipul de postare pe care WooCommerce îl folosește intern pentru a stoca produse, vei obține doar produse WooCommerce în rezultate (de asemenea, verificăm că efectiv facem o căutare; că nu suntem în panoul de administrare; și că aceasta este interogarea principală - adică nu o interogare pentru meniu sau altceva - pentru a ne asigura că nu afectăm mai mult decât dorim).
Și astfel poți limita căutările pentru a afișa doar rezultate de produse WooCommerce.

Rețineți că acest cod își ignoră sarcina dacă îl testați din contul de administrator WordPress.

@MojtabaRezaeian Te referi din cauza is_admin()
? Aceasta verifică dacă codul rulează doar pe partea frontală a site-ului și nu în panoul de administrare (deoarece hook-urile temei pot rula și acolo). Nu afectează dacă un administrator este conectat în timp ce vizualizează partea frontală (pentru asta ar fi is_user_logged_in()
, opțional împreună cu verificări suplimentare pentru nivelul utilizatorului).

@TimMalone Da, ai dreptate, prietene. A fost greșeala mea și poate ar trebui să elimin acel comentariu pentru că este greșit. Dar folosind codul tău, nu am putut vedea nicio schimbare până când nu am eliminat partea $query->is_main_query()
și atunci a returnat doar produse, dar după această modificare apare o nouă problemă și primesc rezultatele de două ori în loc de o dată. Am căutat și am adăugat wp_reset_query();
și wp_reset_postdata();
la codul tău, dar tot primesc aceleași rezultate duplicate. Este foarte ciudat și neașteptat.
