web-dev-qa-db-fra.com

Titres de recherche de produits WooCommerce uniquement

Je l'avais demandé plus tôt et je l'avais résolu en utilisant le plugin Relevanssi . Cependant, ce plugin est en train de casser des choses, donc je ne peux plus l'utiliser. Comment quelque chose de si simple peut-il être rendu impossible par woocommerce? AAARG!

J'ai essayé d'utiliser cette solution , mais cela ne semblait pas fonctionner pour moi. J'ai également essayé de rechercher la fonction woocommerce product_search et d'y ajouter un filtre, mais je n'ai rien trouvé non plus.

Voici la dernière chose que j'ai essayée, qui a quand même renvoyé les résultats de recherche pour tout le contenu, pas seulement pour les titres:

MarkUp

<form role="search" method="get" id="searchform" action="<?php echo home_url( '/' ); ?>">
    <input type="hidden" name="post_type" value="product" />
    <input type="text" value="" name="s" />
    <input type="submit" value="Search" />
</form> 

Rappel du filtreSearch-SQL

// Search product titles only.
function __search_by_title_only( $search, &$wp_query ) {
    global $wpdb;
    if($_GET['post_type'] = 'product' )
        return $search;
    $q = $wp_query->query_vars;
    $n = ! empty( $q['exact'] ) ? '' : '%';
    $search =
    $searchand = '';
    foreach ( (array) $q['search_terms'] as $term ) {
        $term = esc_sql( like_escape( $term ) );
        $search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";
        $searchand = ' AND ';
    }
    if ( ! empty( $search ) ) {
        $search = " AND ({$search}) ";
        if ( ! is_user_logged_in() )
            $search .= " AND ($wpdb->posts.post_password = '') ";
    }
    return $search;
}
add_filter( 'posts_search', '__search_by_title_only', 500, 2 );

N'importe qui? J'imagine que cela a quelque chose à voir avec le type de message woocommerce lui-même ... ils aiment mettre beaucoup de crochets personnalisés.

1
kristina childs

C'est une question de 9 mois, mais comme j'avais le même problème et que j'avais trouvé une solution, je suis venu ici pour le poster.

Dans le fichier wp-content/plugins/woocommerce/classes/class-wc-query.php, fonction pre_get_posts( $q ), WooCommerce définit à la ligne 114:

add_filter( 'posts_where', array( $this, 'search_post_excerpt' ) );

C’est le moment où WooCommerce gâche votre requête!

La fonction search_post_excerpt est définie à la ligne 132, et vous pouvez voir qu'il ajoute un extrait à la requête.

Donc vous avez 2 solutions:

Le mauvais, c'est commenter la ligne 114!

//add_filter( 'posts_where', array( $this, 'search_post_excerpt' ) );

Le bon, je ne me suis pas implémenté moi-même, mais devrait être quelque chose comme ajouter un filtre sur posts_where qui fonctionne après WooCommerce et le réparer. Ou peut-être supprimer le filtre.

Je chercherai mieux la bonne solution, et je promets de la poster ici. Mais la mauvaise solution fait plutôt bien le travail.

2
vinigarcia87

Jusqu'à présent, votre plugin a l'air bien. Pourriez-vous vider la chaîne SQL finale et l'ajouter à votre question? Aussi: le plugin WC enregistre-t-il tout le contenu de la table posts en tant que type post? Si oui: Avez-vous ajouté une restriction pour rechercher uniquement par ce type de message? Vous devrez probablement le faire dans le filtre $posts_clauses- de la clause $clauses['where'] ou à l'intérieur du filtre posts_where-. Remplacez simplement la partie post_type = post par votre type de publication personnalisé à partir de WC.

0
kaiser