web-dev-qa-db-fra.com

Construction d'une recherche avancée (texte, balises, catégorie, champs personnalisés) - Obtenir la requête SQL incorrecte

Je construis un formulaire de recherche avancée dans lequel je veux utiliser le champ de texte normal, les balises, les catégories et également certains champs personnalisés. J'ai créé un formulaire avec toutes les valeurs et j'ai créé une url de paramètres pour le rendre plus agréable et j'utilise pre_get_posts pour ajouter les champs personnalisés si nécessaire ... mais la requête n'est pas ce que j'attendais et c'est vraiment bizarre à mon avis .

Je vais expliquer les étapes que j'ai faites:

1) créer un formulaire (je saute cette partie)

2) le rendre plus agréable je construis une URL et j'utilise le code suivant pour réécrire et le faire:

URL: "/cerca/text/$text/provincia/$provincia/comarca/$comarca/municipi/$municipi/filtres/$filtres/"

Réécrire le code

add_action('init', 'create_cerca_url_querystring_parameters');
function create_cerca_url_querystring_parameters()
{
    add_rewrite_rule(
        '^cerca\/text\/([a-zA-Z0-9-+]+)\/provincia\/([a-zA-Z0-9-+]+)\/comarca\/([a-zA-Z0-9-+]+)\/municipi\/([a-zA-Z0-9-+]+)\/filtres\/([a-zA-Z0-9-+,]+)\/?',
        'index.php?s=$matches[1]&provincia=$matches[2]&category_name=$matches[3]&municipi=$matches[4]&tag=$matches[5]',
        'top'
    );
}

3) fonction post_get_post

add_action('pre_get_posts', 'advanced_search_query');
function advanced_search_query($query)
{
    if (! is_admin() && $query->is_search && $query->is_main_query()) {

        //Get Parameteres
        //$text      = getSearchParameter('text');
        $provincia = getSearchParameter('provincia');
        $municipi  = getSearchParameter('municipi');

        //Configuration
        $query->set('post_type', array( 'post' ));
        $query->set('post_status', array( 'publish' ));

        if(!empty($provincia) && !empty($municipi)){

            $mainArray = array('relation' => 'OR');

            //Set Parameters

            $provArray = array(
                  'key'   => 'provincia',
                  'value' => $provincia,
                  'compare'    => 'LIKE'
                  );
            array_Push($mainArray, $provArray);



            $municipiArray = array(
                'key'   => 'municipi',
                'value' => $municipi,
                'compare'    => 'LIKE'
                );
            array_Push($mainArray, $municipiArray);


            $query->set('meta_query', $mainArray);

            var_dump($mainArray);
        }
    }
}

/**
 * Return the given parameter value from the search URL
 */
function getSearchParameter($parametre, $decode=TRUE)
{
    $valueToReturn = '';
    $path  = $_SERVER['REQUEST_URI'];
    $split = explode("/", $path);
    $key   = array_search($parametre, $split);
    if ($key > 0) {
        $value = $split[$key+1];
        $urlValues = array("text", "provincia", "comarca", "municipi", "filtres","none","");
        if (!in_array($value, $urlValues)) {
          if($decode){
            $valueToReturn = urldecode($value);
          }else{
            $valueToReturn = $value;
          }
        }
    }
    return $valueToReturn;
}

4) puis dans le search.php j'imprime le résultat de la requête en utilisant

<?php echo $GLOBALS['wp_query']->request; ?>

Et voici où ma surprise arrive et je ne sais pas si la requête ressemble à ça:

Requête avec municipi et provincia:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1 = 1 ET (0 = 1) AND LIKE '% barcelona%') OR (wp_postmeta.meta_key = 'municipi' ET wp_postmeta.meta_value LIKE '% sant%')) ET wp_posts.post_type = 'post' ET ((wp_posts.post_status = publier ')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 18

Une autre requête avec uniquement du texte:/cerca/text/test/provincia/none/comarca/none/municipi/none/filtres/none /

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1 = 1 AND (0 = 1 ET 0 = 1) AND ((wp_posts.post_title LIKE '% test%') OR (wp_posts .post_excerpt LIKE '% test%') OR (wp_posts.post_content LIKE '% test%'))) AND wp_posts.post_type = 'post' ET ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_title LIKE '% test%' DESC, wp_posts.post_date DESC LIMIT 0, 18

_ {Voici ma question:} _

Est-ce que quelqu'un sait pourquoi je reçois ce SQL? si je supprime la condition (0 = 1) alors cela fonctionne, mais je ne sais pas pourquoi il est là. Est-ce que je fais quelque chose de mal ? Je veux juste filtrer par provincia et municipi si ces paramètres sont définis, une idée?

_ {Inspiré dans les articles suivants: _

Comment utiliser un champ personnalisé pour rechercher un type de message wordpress?

Formulaire de recherche avancée avec filtres pour les taxonomies personnalisées et les champs personnalisés

Recherche personnalisée de type d'article personnalisé, méta personnalisé et champs de recherche

Merci d'avance,

2
eballo

SOLUTION:

J'afficherai ma solution et expliquerai quel était le problème et j'espère que ce message pourra aider quelqu'un à l'avenir.

Au moment où nous discutons dans les petits commentaires, le problème était que j’envoyais par erreur une taxonomie inexistante, ce qui entraînait AND (0 = 1).

Pour résoudre tout le problème, j'ai créé un add_rewrite_rule pour chaque cas, que je possède ou non un paramètre, comme dans l'exemple suivant:

add_rewrite_rule(
   '^cerca/comarca/([a-zA-Z0-9-+]+)/?',
   'index.php?s=&category_name=$matches[1]',
   'top'
);

 add_rewrite_rule(
   '^cerca/municipi/([a-zA-Z0-9-+]+)/?',
   'index.php?s=&municipi=$matches[1]',
   'top'
);
   add_rewrite_rule(
   '^cerca/provincia/([a-zA-Z0-9-+]+)/?',
   'index.php?s=&provincia=$matches[1]',
   'top'
);
add_rewrite_rule(
   '^cerca/provincia/([a-zA-Z0-9-+]+)/comarca/([a-zA-Z0-9-+]+)/municipi/([a-zA-Z0-9-+]+)/?',
   'index.php?s=&provincia=$matches[1]&category_name=$matches[2]&municipi=$matches[3]',
   'top'
);

....

Merci à @ janh2 pour tous les commentaires utiles.

2
eballo