web-dev-qa-db-fra.com

En utilisant WP Requête pour rechercher par plusieurs méta-champs

J'ai créé un formulaire de recherche personnalisé avec des zones de sélection et des champs de texte.

J'ai une boîte de sélection avec des options telles que "location" et "vente" (c'est un site immobilier). Il existe également des champs de saisie pour les prix minimum et maximum, pour la localisation, etc.

Dans les messages, j'ai des champs personnalisés pour tous ces filtres.

J'ai utilisé WP_Query pour cela. Et ça devrait marcher. Voici la requête:

// Define the arguments for the WP query
$args = array(
        'post_type' => 'post',
        'relation' => 'AND',
        'meta_query' => array(
                array(
                        'key' => 'ex_lokacija',
                        'value' => $grad ,
                        'compare' => 'LIKE'
                ),
                array(
                        'key' => 'ex_vrsta_oglasa',
                        'value' => $adType ,
                        'compare' => 'LIKE'
                ),
                array(
                        'key' => 'ex_tip_nekretnine',
                        'value' => $realEstateType ,
                        'compare' => 'LIKE'
                ),
                array(
                        'key' => 'ex_dio_pg',
                        'value' => $dioGrada ,
                        'compare' => 'LIKE'
                ),
                array(
                        'key' => 'ex_dio_pg',
                        'value' => $dioGrada ,
                        'compare' => 'LIKE'
                ),
                array(
                        'key' => 'et_square_footage',
                        'value' => array( $squareFrom, $squareTo ),
                        'type' => 'numeric',
                        'compare' => 'BETWEEN'
                ),
                array(
                        'key' => 'et_price',
                        'value' => array( $priceFrom, $priceTo ),
                        'type' => 'numeric',
                        'compare' => 'BETWEEN'
                ),
                array(
                        'key' => 'et_bedrooms_number',
                        'value' => $roomsNum,
                        'type' => 'numeric',
                        'compare' => 'LIKE'
                )
        )
);

$searched_posts = new WP_Query( $args );

J'ai utilisé preg_replace pour chacun des vars $ _GET et les ai affectés à ceux que vous voyez dans 'valeur'.

Le problème est qu’il ne montre rien, même s’il devrait y avoir des résultats.

En outre, cela ne fonctionnera pas sans le champ 's' - il faut y insérer quelque chose pour pouvoir même charger la page de résultats vide.

Problème possible n ° 1

Je devine qu'il y a un problème avec la boucle, que j'ai créée comme ceci:

                    while ($searched_posts->have_posts()) : $searched_posts->the_post(); ?>



                        <?php the_title(); ?>
                        <?php the_content(); ?>



                    <?php endwhile; ?>

C'est juste pour les tests.

Problème possible n ° 2

Je mets tout cela dans un seul fichier - search.php. Peut-être que cela cause des problèmes?

C'est ici:

‚‚

global $wpdb;

$grad           = preg_replace( '/^[0-9a-zA-Z-]/', '', $_GET['grad'] );
$adType         = preg_replace( '/^[0-9a-zA-Z-]/', '', $_GET['adType'] );
$realEstateType = preg_replace( '/^[0-9a-zA-Z-]/', '', $_GET['realEstateType'] );
$dioGrada       = preg_replace( '/^[0-9a-zA-Z-]/', '', $_GET['dioGrada'] );
$squareFrom     = preg_replace( '/[^0-9]/', '', $_GET['squareFrom'] );
$squareTo       = preg_replace( '/[^0-9]/', '', $_GET['squareTo'] );
$priceFrom      = preg_replace( '/[^0-9]/', '', $_GET['priceFrom'] );
$priceTo        = preg_replace( '/[^0-9]/', '', $_GET['priceTo'] );
$roomsNum       = preg_replace( '/[^0-9]/', '', $_GET['roomsNum'] );

// Change the defaults if not chosen
if($squareFrom == '') { $squareFrom = '0'; }
if($squareTo == '') { $squareTo = '10000000'; }

// Define the arguments for the WP query
$args = array(
        'post_type' => 'post',
        'relation' => 'AND',
        'meta_query' => array(
                array(
                        'key' => 'ex_lokacija',
                        'value' => $grad ,
                        'compare' => 'LIKE'
                ),
                array(
                        'key' => 'ex_vrsta_oglasa',
                        'value' => $adType ,
                        'compare' => 'LIKE'
                ),
                array(
                        'key' => 'ex_tip_nekretnine',
                        'value' => $realEstateType ,
                        'compare' => 'LIKE'
                ),
                array(
                        'key' => 'ex_dio_pg',
                        'value' => $dioGrada ,
                        'compare' => 'LIKE'
                ),
                array(
                        'key' => 'ex_dio_pg',
                        'value' => $dioGrada ,
                        'compare' => 'LIKE'
                ),
                array(
                        'key' => 'et_square_footage',
                        'value' => array( $squareFrom, $squareTo ),
                        'type' => 'numeric',
                        'compare' => 'BETWEEN'
                ),
                array(
                        'key' => 'et_price',
                        'value' => array( $priceFrom, $priceTo ),
                        'type' => 'numeric',
                        'compare' => 'BETWEEN'
                ),
                array(
                        'key' => 'et_bedrooms_number',
                        'value' => $roomsNum,
                        'type' => 'numeric',
                        'compare' => 'LIKE'
                )
        )
);

$searched_posts = new WP_Query( $args );



 get_header(); ?>

    <div id="content-top">
        <div id="menu-bg"></div>
        <div id="top-index-overlay"></div>

        <div id="content" class="clearfix">
            <div id="main-area">
                <?php get_template_part('includes/breadcrumbs'); 

                    while ($searched_posts->have_posts()) : $searched_posts->the_post(); ?>



                        <?php the_title(); ?>
                        <?php the_content(); ?>



                    <?php endwhile; ?>

            </div> <!-- end #main-area -->

            <?php get_sidebar(); ?>

<?php get_footer(); ?>

Merci de regarder mon problème!

2
Madzgo

La façon dont vous avez construit cette requête vous permet d’avoir un tas de valeurs vides. Par exemple, si grad n'est pas présent, vous finissez par rechercher les clés ex_lokacija pour les chaînes vides. Puisque votre relation principale est AND, tous les termes doivent "frapper", donc il me semble probable qu'il serait très difficile d'obtenir une requête qui renvoie quoi que ce soit. Je construirais la requête pour rechercher uniquement les clés qui ont des valeurs.

$meta_query = array();
if (!empty($grad)) {
    $meta_query[] = array(
         'key' => 'ex_lokacija',
         'value' => $grad ,
         'compare' => 'LIKE'
    )
}
// and so on for each of your keys, then
$args = array(
        'post_type' => 'post',
        'relation' => 'AND',
        'meta_query' => $meta_query
)
$searched_posts = new WP_Query( $args );
2
s_ha_dum