Modificare la funzione di ricerca di un tema per mostrare solo risultati da WooCommerce?

13 apr 2016, 20:15:32
Visualizzazioni: 17.8K
Voti: 3

Sono molto nuovo e sto cercando di imparare strada facendo.

Ho acquistato un tema premium da Themeforest senza verificare la funzionalità delle varie pagine. Ho provato il loro supporto senza ottenere soluzioni.

Ora sto esaminando il codice con poche conoscenze al riguardo. Sto ancora cercando di imparare.

Qualcuno può aiutarmi con questo:

1- Ho identificato tre file php (codice qui sotto) che potrebbero risolvere il problema, credo che il primo sia il più rilevante.

2- Dato che sono nuovo, qualcuno può indicare il campo giusto da modificare? È "( get_post_type() === 'job_listing') che deve essere cambiato?

Grazie.

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
( 'Cosa stai cercando?', 'listable' ); ?>" autocomplete="off" 
value="<?php the_search_query(); ?>"/>
<button class="search-submit" name="submit" id="searchsubmit"></button>

search.php:

<?php
/**
 * Archivio risultati di ricerca
 *
 * @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__( 'Risultati di ricerca per: %s', 'listable' ), '<span>' . get_search_query() . '</span>' ); ?></h1>
    </header>

    <?php if ( have_posts() ) : ?>

        <?php /* Inizia il Loop */ ?>

        <div class="postcards">
            <div class="grid">
                <?php /* Inizia il Loop */ ?>
                <?php while ( have_posts() ) : the_post(); ?>
                    <div class="grid__item  postcard">
                        <?php

                        /*
                         * Includi il template specifico del Post-Format per il contenuto.
                         * Se vuoi sovrascriverlo in un child theme, includi un file
                         * chiamato content-___.php (dove ___ è il nome del Post Format) che verrà usato invece.
                         */
                        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
/**
* Archivio risultati di ricerca solo per listing
*
* @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"';

        //ottieni il parametro show_map dello shortcode jobs dalla pagina listings (selezionata nelle impostazioni WPJM)
        //lo applicheremo anche qui
        $show_map = listable_listings_page_shortcode_get_show_map_param();
        if ( false === $show_map ) {
            $shortcode .= ' show_map="false"';
        } else {
            $shortcode .= ' show_map="true"';
        }

        //ottieni il parametro orderby dello shortcode jobs dalla pagina listings (selezionata nelle impostazioni WPJM)
        //lo applicheremo anche qui
        $orderby = listable_listings_page_shortcode_get_orderby_param();
        $shortcode .= ' orderby="' . $orderby . '"';

        //ottieni il parametro order dello shortcode jobs dalla pagina listings (selezionata nelle impostazioni WPJM)
        //lo applicheremo anche qui
        $order = listable_listings_page_shortcode_get_order_param();
        $shortcode .= ' order="' . $order . '"';

        $shortcode .= ']';
        //salva lo shortcode per poterlo usare dopo per esaminarne i parametri nei filtri
        //questo perché WPJM non passa i parametri in alcuni filtri
        $current_jobs_shortcode = $shortcode;
        echo do_shortcode(  $shortcode );
        $current_jobs_shortcode = null;
         ?>
    </main><!-- #main -->
</div>
</div><!-- #primary -->

<?php
get_sidebar();
get_footer(); ?>
0
Tutte le risposte alla domanda 1
4

Non sono sicuro a cosa si riferisca il post type job_listing - probabilmente fa parte di una funzionalità inclusa nel tuo tema - ma per limitare i risultati della ricerca per tipo di post, il modo usuale per farlo è agganciarsi all'azione pre_get_posts di WordPress nel file functions.php del tuo tema.

Visto che sei nuovo in questo, ecco un paio di altre risposte che dovresti leggere rapidamente prima:

Poi, con queste conoscenze, ci agganceremo all'azione pre_get_posts nel nostro functions.php (puoi farlo a scopo di test nel tema corrente se vuoi, ma come spiegato nella risposta sui temi child sopra, il tuo codice verrà sovrascritto quando aggiornerai il tema, quindi dovresti usare un tema child per preservarlo).

Apri il tuo functions.php e aggiungi:

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' );
  }
}

Troverai maggiori dettagli su come funziona nella documentazione di pre_get_posts. Come spiegato nella prima risposta linkata sopra, azioni e filtri (noti insieme come 'hook') ti permettono di modificare il modo in cui funzionano WordPress core, plugin e temi, eseguendo codice al momento giusto o prendendo input, modificandolo e restituendolo. È così che funziona l'intera architettura a plugin di WordPress.

In questo snippet di codice sopra, stiamo modificando la query di WordPress prima che venga eseguita per cercare solo post di tipo product. Dato che questo è il post type che WooCommerce usa internamente per memorizzare i prodotti, otterrai solo prodotti WooCommerce nei risultati (controlliamo anche che sia effettivamente una ricerca, che non siamo nel pannello admin e che sia la query principale - cioè non un menu o altre query - per essere sicuri di non influenzare più di quanto vogliamo).

Ed ecco come puoi limitare le tue ricerche per mostrare solo risultati di prodotti WooCommerce.

4 lug 2016 14:02:39
Commenti

Mi ha aiutato a risolvere il problema in 15 secondi. Grazie!

The Lyrist The Lyrist
7 ott 2020 08:19:44

Nota che questo codice ignora il suo compito se lo stai testando dall'account admin di WordPress.

Mojtaba Rezaeian Mojtaba Rezaeian
21 apr 2021 10:12:14

@MojtabaRezaeian Intendi a causa di is_admin()? Questo controlla che il codice venga eseguito solo sul frontend del sito e non nel pannello di amministrazione (perché anche lì possono essere attivati gli hook del tema). Non influisce sul fatto che un amministratore sia loggato mentre visualizza il frontend (per quello servirebbe is_user_logged_in(), eventualmente insieme a controlli aggiuntivi per il livello utente).

Tim Malone Tim Malone
21 apr 2021 17:23:21

@TimMalone Sì, hai ragione amico mio. È stato un mio errore e forse dovrei rimuovere quel commento perché è sbagliato. Ma usando il tuo codice non ho visto alcun cambiamento finché non ho rimosso la parte $query->is_main_query() e poi ha restituito solo i prodotti, ma dopo questa modifica è apparso un nuovo problema e sto ottenendo i risultati due volte invece di una. Ho anche cercato e aggiunto wp_reset_query(); e wp_reset_postdata(); al tuo codice ma continuo a ottenere gli stessi risultati duplicati. È molto strano e inaspettato.

Mojtaba Rezaeian Mojtaba Rezaeian
21 apr 2021 20:50:05