web-dev-qa-db-fra.com

Trouver tous les produits contenant des termes avec% mots-clés% dans WP_Query

Je souhaite utiliser WP_Query pour trouver tous les termes du produit entrés dans le champ de saisie. Voici mon code WP_Query.

$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$args = array(
    'post_type'         => 'product',
    'product_cat'       => 'construction',
    'posts_per_page'    => 12,
    'paged'             => $paged,
    'tax_query' => array(
        array(
            'taxonomy'  => 'pa_reference-p-no',
            'field'     => 'slug',
            'terms'     => $input_search_txt
        )
    );
);

$loop = new WP_Query( $args );

'$ input_search_txt' est le texte saisi dans le champ de saisie. Je veux trouver tous les produits qui contiennent ce texte dans 'pa_reference-p-no'. Par exemple, si je recherche "123", je veux trouver des produits avec les termes "12345" ou "123456".

Mais maintenant, je ne vois que le produit avec le terme "123".

Je veux que quelqu'un m'aide.

1
Mike

Malheureusement, tax_query n'a pas de modificateur de correspondance compare comme meta_query, permettant des recherches génériques avec l'opérateur "LIKE". Il faut donc avoir une approche différente. Je peux penser à 2 façons de résoudre ce problème,

1) Utilisez l'objet global $ wpdb pour rechercher tous les termes qui correspondent à votre recherche de texte, puis utilisez ces identifiants de terme pour ajouter un modificateur de correspondance opérateur à votre requête actuelle, [EDIT: ajouté une ligne de débogage, assurez-vous que activer WP_DEBUG]

    global $wpdb; 
    $term_ids = $wpdb->get_results( 
        "
        SELECT {$wpdb->terms}.term_id 
        FROM {$wpdb->terms}, {$wpdb->term_taxonomy}
        WHERE {$wpdb->terms}.term_id =  {$wpdb->term_taxonomy}.term_id
            AND {$wpdb->term_taxonomy}.taxonomy LIKE 'pa_reference-p-no'
            AND {$wpdb->terms}.slug LIKE '%{$input_search_txt}%'
        ",
        ARRAY_N
    );
    //you can debug your term id results at this point by printing them in your log file, make sure WP_DEBUG is set to true in your wp_config.php file.
    error_log('TERM IDS:'.print_r($term_ids,true)); //should be an array of term ids.
    $args = array(
        'post_type'         => 'product',
        'product_cat'       => 'construction',
        'posts_per_page'    => 12,
        'paged'             => $paged,
        'tax_query' => array(
            array(
                'taxonomy'  => 'pa_reference-p-no',
                'terms'     => $term_ids,
                'operator'  => 'IN'
            )
        );
    );

    $loop = new WP_Query( $args );

2) la deuxième méthode consiste à ajouter une condition SQL personnalisée à votre requête à l'aide du filtre filtre de requêteposts_where . Ainsi, vous simplifieriez votre requête pour rechercher uniquement les publications "produit", puis modifieriez la condition de taxonomie à l'aide de,

        add_filter( 'posts_where' , 'posts_where', 10,2 );

        function posts_where( $where , $query) {

            if( 'product' == $query->query_vars['post_type'] && !$query->is_main_query() && !$query->is_admin() ) {
                global $wpdb;

                if ( isset( $_POST['input_search_txt'] ) && !empty( $_POST['input_search_txt'] ) ) {

                   $where .= 
                   " 
                     AND {$wpdb->terms}.term_id =  {$wpdb->term_taxonomy}.term_id
                     AND {$wpdb->term_taxonomy}.taxonomy LIKE 'pa_reference-p-no'
                     AND {$wpdb->terms}.slug LIKE '%{$_POST['input_search_txt'];}%'
                 ";
                }
            }
            return $where;
        }

Ces deux solutions devraient fonctionner, même si je ne les ai pas testées. Le premier est plus facile à déboguer et ne cible que votre requête actuelle. La deuxième solution est plus efficace car elle fait 1 hit de moins sur votre base de données, mais gardez à l'esprit que si vous ne filtrez pas le $query dans la condition initiale, vous pouvez finir par avoir d'autres requêtes personnalisées affectées et celles-ci peuvent être très difficiles à déboguer.

Faites-moi savoir dans les commentaires ci-dessous si vous avez des problèmes pour le comprendre.

1
Aurovrata