wake-up-neo.com

Erstellen einer erweiterten Suche (Text, Tags, Kategorie, benutzerdefinierte Felder) - Abrufen der falschen SQL-Abfrage

Ich erstelle ein Formular für die erweiterte Suche, in dem ich das normale Textfeld, Tags, Kategorien und auch einige benutzerdefinierte Felder verwenden möchte. Ich habe ein Formular mit allen Werten erstellt und einen URL-Parameter erstellt, um es besser zu machen, und ich verwende pre_get_posts, um die benutzerdefinierten Felder hinzuzufügen, wenn es benötigt wird ... aber die Abfrage entspricht nicht meinen Erwartungen und ist meiner Meinung nach wirklich seltsam .

Ich werde die Schritte erklären, die ich getan habe:

1) erstelle ein Formular (ich überspringe diesen Teil)

2) mache es schöner Ich erstelle eine URL und verwende den folgenden Code, um sie umzuschreiben und zu tun:

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

Code umschreiben

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) post_get_post Funktion

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) dann drucke ich in der search.php das abfrageergebnis mit

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

Und hier kommt meine Überraschung und ich weiß nicht, dass die Abfrage so aussieht:

Anfrage bei Gemeinden und Provinzen:

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 AND (0 = 1) AND ((wp_postmeta.meta_key = 'provincia' AND wp_meta LIKE '% barcelona%') OR (wp_postmeta.meta_key = 'municipi' AND wp_postmeta.meta_value LIKE '% sant%')) AND wp_posts.post_type = 'post' AND (((wp_posts.post_status = ' publizieren ')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 18

Eine andere Abfrage mit nur Text:/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 AND 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' AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_title WIE '% test%' DESC, wp_posts.post_date DESC LIMIT 0, 18

Hier ist meine Frage:

Weiß jemand, warum ich dieses SQL erhalte? Wenn ich die Bedingung entferne (0 = 1), dann funktioniert es, aber ich weiß nicht, warum es dort ist. Mache ich etwas falsch ? Ich möchte nur nach Provinzen und Gemeinden filtern, wenn diese Parameter eingestellt sind. Irgendeine Idee?

Inspiriert in den folgenden Beiträgen:

Wie benutze ich ein benutzerdefiniertes Feld, um nach WordPress-Beitragstyp zu suchen?

Erweitertes Suchformular mit Filtern für benutzerdefinierte Taxonomien und benutzerdefinierte Felder

Benutzerdefinierte Suche nach benutzerdefinierten Beitragstypen, benutzerdefinierten Meta- und Suchfeldern

Danke im Voraus,

2
eballo

LÖSUNG:

Ich werde meine Lösung posten und erklären, was das Problem war, und ich hoffe, dass dieser Beitrag jemandem in der Zukunft helfen kann.

Während wir uns in den kleinen Kommentaren unterhalten, bestand das Problem darin, dass ich versehentlich eine nicht vorhandene Taxonomie gesendet habe und dies das UND verursachte (0 = 1).

Um das ganze Problem zu beheben, habe ich einen add_rewrite_rule für jeden Fall erstellt, wenn ich Parameter habe oder nicht, wie im folgenden Beispiel:

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

....

Vielen Dank an @ janh2 für all die hilfreichen Kommentare.

2
eballo