web-dev-qa-db-ja.com

WP_Queryが複数の分類法と用語を持つフィルタに使用されている

だから、私がやろうとしているのは、Ajaxフィルタを作ることです、これはフィルタフォームから来るデータに基づいて$ argsを構築するフィルタコードの一部です、そしてその後(このコードではなく)それ問い合わせの結果を返します。

私は3つのカスタム分類法(およびフォームからの機能)を持っています。
- type_emp(1つのオプションはformから来ます)
- status_emp(1つのORその他のオプションはformから来ます)
- city_emp(1つの選択肢はformから来ます)

WP_Queryでフィルターとして使用することはできません。すべての用語が含まれていなくても投稿に一致するためです。

type_empは1です
status_empがnullです
city_empは2です

投稿が返されます。

(type_emp/status_emp/city_emp)
ポスト1(1/2/3)
ポスト2(2/1、4/2)
ポスト3(1/4/2)

ご覧のとおり、投稿3が唯一のパラメータとして返されているはずです。 そのようなクエリを制限する方法はありますか
また、status_empを複数回、場合によっては複数の語句をコード内で一致させる必要があります。文字列を展開して配列を作成し、それを語句として税クエリに配置します。 少なくとも1つの投稿を一致させるにはどうすればよいですか

 $ args = array(
 'orderby' => 'date'、
 'order' => 'DESC'、
 'post_status' => 'publish '[
); 
 
 if(isset($ _POST [' typefilter '])&& $ _POST [' typefilter ']!==' '){
 $ args ['post_type'] = 'post_type_x'; 
 $ args ['tax_query'] = array(
 array(
 'taxonomy' => 'type_emp'、[。 [field] => 'id'、
 'terms' => $ _POST ['typefilter'] 
)
); 
} 
 
 if($ _POST ['typefilter'] == ''){
 $ args ['post_type'] = 'post_type_x'; 
} 
 
 //複数のオプションが選択されている場合、それらは
 $ query = explode( '&'、file_get_contents( "php:// input")); 
の下にソートされます。 $ params = array(); 
 
 foreach($ query as $ param)
 {
 list($ name、$ value)= explode( '=' 、$ param、2); 
 $ params [urldecode($ name)] [] = urldecode($ value); 
} 
 if(isset( $ params ['statusfilter'])&& $ _POST ['statusfilter']!== ''){
 $ args ['tax_query']。= array(
 array(
 'taxonomy' => 'status_emp') 、
 'field' => 'id'、
 'terms' => $ params ['statusfilter'] 
)
); 
 } 
 
 //分類法/カテゴリ
 if(isset($ _POST ['cityfilter'])&& $ _POST ['cityfilter']!== ''){[ $ args ['tax_query']。= array(
 array(
 'taxonomy' => 'city_emp'、
 'field' => 'id'、 
 'terms' => $ _POST ['cityfilter'] 
); 
); 
} 
 $ query = new WP_Query($ args) ; 

私の質問が少し混乱しているなら申し訳ありませんが、私は可能な限り最も明確になるように努めました。

1
atempel

この方法を試してください:

$args = array(
    'orderby'     => 'date',
    'order'       => 'DESC',
    'post_status' => 'publish'
);

if ( isset( $_POST['typefilter'] ) && $_POST['typefilter'] !== '' ) {
    $args['post_type']                = 'post_type_x';
    $args['tax_query'][0]['taxonomy'] = 'type_emp';
    $args['tax_query'][0]['field']    = 'id';
    $args['tax_query'][0]['terms']    = $_POST['typefilter'];
    $args['tax_query'][0]['operator'] = 'IN';
}

if ( $_POST['typefilter'] == '') {
    $args['post_type'] = 'post_type_x';
}

// If two or more options are selected they are sorted below
$query  = explode('&', file_get_contents("php://input"));
$params = array();

foreach( $query as $param )
{
  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}

if( isset( $params['statusfilter'] ) && $_POST['statusfilter'] !== '' ) {
    $args['tax_query'][1]['taxonomy'] = 'status_emp';
    $args['tax_query'][1]['field']    = 'id';
    $args['tax_query'][1]['terms']    = $params['statusfilter'];
    $args['tax_query'][1]['operator'] = 'IN';
}

// for taxonomies / categories
if( isset( $_POST['cityfilter'] ) && $_POST['cityfilter'] !== '') {
    $args['tax_query'][2]['taxonomy'] = 'city_emp';
    $args['tax_query'][2]['field']    = 'id';
    $args['tax_query'][2]['terms']    = $_POST['cityfilter'];
    $args['tax_query'][2]['operator'] = 'IN';
}

$query = new WP_Query($args);

私はそれをテストしていませんが、理論的にはうまくいくはずです:)、それがうまくいったのかそれとももっと助けが必要なのか教えてください

2
benny-ben