通常のテキストフィールド、タグ、カテゴリ、そしていくつかのカスタムフィールドを使いたい高度な検索フォームを作成しています。すべての値を含むフォームを作成し、それを見やすくするための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の投稿タイプを検索するためのカスタムフィールドの使い方
カスタム分類法およびカスタムフィールド用のフィルタを含む詳細検索フォーム
カスタム投稿タイプ、カスタムメタ、および検索フィールドのカスタム検索
前もって感謝します、
解決策:
私は自分の解決策を投稿し、何が問題だったのかを説明します。この投稿が将来の誰かに役立つことを願っています。
小さなコメントで述べているように、問題は、私が存在しない分類法を誤って送っていて、これが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さん、ありがとうございました。