web-dev-qa-db-ja.com

tax_queryで複数の用語を使用する

不動産検索サイトを構築しようとしています。

まず第一に、これは検索フォームです(ドイツ語のクラスやものは申し訳ありません):

<form  method="post" action="<?php bloginfo('url');?>/immobilien-suche/">
<?php
$taxonomiesImmo = get_object_taxonomies('immobilien');
$termsImmoBundesland = get_terms($taxonomiesImmo[0]);
?>
    <fieldset name="bundeslaender">
        <input type="checkbox" value="alleBundeslaender">alle Bundesl&auml;nder</input>
        <?php foreach ($termsImmoBundesland as $termImmoBundesland) { ?>
            <label><input type="checkbox" value="<?php echo $termImmoBundesland->slug; ?>" name="checkedBundeslaender[]"><?php echo $termImmoBundesland->name; ?></label>
        <?php } ?>
    </fieldset>
    <input type="submit"/>  
</form>

それから私の検索結果ページテンプレートで、私はそれらが関数参照で述べられているように、きれいなリストを得るためにそれらの複数のチェックボックス結果(配列)を分解します:

'terms'    => array( 'action', 'comedy' ), // wordpress codex

私の破裂

if ( count($_POST['checkedBundeslaender']) > 1 ) {
    $checkedBundeslaenderList = "'".implode("', '", $_POST['checkedBundeslaender'])."'";
    // string form: 'term1', 'term2', 'term3' ...
} else {
    $checkedBundeslaenderList = $_POST['checkedBundeslaender']);
    // string form: 'term1'
}

そして最後に私のクエリ引数:

$newImmoArgs = array(
    'post_type' => 'immobilien',
    'posts_per_page' => -1,
    'tax_query' => array(
        array(
            'taxonomy' => 'bundesland',
            'field'    => 'slug',
            'terms'    => array( $checkedBundeslaenderList ),
            'operator' => 'IN',
            'include_children' => false,
        ),
    ),                              

);

私の問題は、チェックされているチェックボックスが2つ以上ある場合、クエリに結果が表示されないことです。チェックボックスが1つだけチェックされている場合にのみ機能します。

助けてください!

よろしく、rellston。

1
Rellston

あなたは配列を混同しています。あなたの "my implode"では、$checkedBundeslaenderListはアイテムの数によって、文字列と配列の間で変わります。

そして、クエリ引数で、それを配列にネストします。

'terms' => array( $checkedBundeslaenderList ),

それであなたが最終的に得ることができるものはどちらかです:

array( array( 1 ) );

...または:

array( '1,2,3,4' );

どちらも有効なフォーマットではありません。代わりに、常に配列を使用してください。

if ( ! empty( $_POST['checkedBundeslaender'] ) ) {
    $checkedBundeslaenderList = wp_unslash( ( array ) $_POST['checkedBundeslaender'] );
} else {
    $checkedBundeslaenderList = array();
}

そして、それを直接クエリに渡してください。

'terms' => $checkedBundeslaenderList,
2
TheDeadMedic