web-dev-qa-db-ja.com

高度な検索(テキスト、タグ、カテゴリ、カスタムフィールド)の構築 - 間違ったSQLクエリの取得

通常のテキストフィールド、タグ、カテゴリ、そしていくつかのカスタムフィールドを使いたい高度な検索フォームを作成しています。すべての値を含むフォームを作成し、それを見やすくするためのURLパラメータを作成しました。必要に応じてpre_get_postsを使用してカスタムフィールドを追加します。 。

私がしたステップを説明します。

1)フォームを作成する(この部分は読み飛ばします)

2)私はURLを構築し、私はそれを書き直すとそれを行うために次のコードを使用してそれがより良くする:

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

コードを書き換える

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関数

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)それからsearch.phpで私は使用してクエリ結果を印刷します

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

そして、ここに私の驚きが届くところです、そして、私は質問がそのように見えるのを知りません:

市区町村と県で照会します。

SELECT SQL_CALC_FOUND_ROWS wp_posts.IDからの結合wp_postmeta ON(wp_posts.ID = wp_postmeta.post_id)WHERE1 = 1 AND(0 = 1)AND((wp_postmeta.meta 'およびKEY') wp_postmeta.meta_value LIKE '%barcelona%')OR(wp_postmeta.meta_key = 'municipi' AND wp_postmeta.meta_value LIKE '%sant%'))AND wp_posts.post_type = 'ポスト' AND((wp_p.ps) post_status = 'publish'))グループ化wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0、18

テキストのみを含む別のクエリ:/ cerca/text/test/provincia/none/comarca/none/municipi/none/filtres/none /

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID from wp_posts 1 = 1AND(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' ))wp_posts.IDで並べ替えwp_posts.post_titleで並べ替えLIKE '%test%' DESC、wp_posts.post_date DESC制限0、18

これが私の質問です:

私がこのSQLを手に入れる理由を誰かが知っていますか?もし条件を取り除けば(0 = 1)それはうまくいくが、なぜそれがそこにあるのかわからない。私は何か悪いことをしていますか?このパラメータが設定されている場合は、州と地方自治体でフィルタリングしたいだけです。

次の記事からヒントを得ました:

Wordpressの投稿タイプを検索するためのカスタムフィールドの使い方

カスタム分類法およびカスタムフィールド用のフィルタを含む詳細検索フォーム

カスタム投稿タイプ、カスタムメタ、および検索フィールドのカスタム検索

前もって感謝します、

2
eballo

解決策:

私は自分の解決策を投稿し、何が問題だったのかを説明します。この投稿が将来の誰かに役立つことを願っています。

小さなコメントで述べているように、問題は、私が存在しない分類法を誤って送っていて、これがAND(0 = 1)を引き起こしていたということでした。

全体の問題を解決するために、パラメータがある場合、または次の例のように気に入らない場合に、それぞれの場合にadd_rewrite_ruleを作成しました。

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

…….

@ janh2さん、ありがとうございました。

2
eballo