web-dev-qa-db-ja.com

カスタムフィールド値とドロップダウンで結果をフィルタリングする

カスタムフィールド値で投稿をフィルタリングする必要があります。

私の具体的な例:

  • ユーザーが製品>カテゴリ1>サブカテゴリAに移動します。
  • すべての "サブカテゴリA"項目(商品のカスタム投稿タイプ)は、デフォルトで日付で表示されます。
  • サブカテゴリAの各項目には、カスタムフィールド "size"があります。ユーザーはドロップダウンメニューでサイズを選択することができ、投稿は "カスタムフィールド:サイズ" = "選択サイズ"の項目のみを表示してフィルタリングされます。製品はより多くのページにあるため、フィルタはページネーションにも保存されます。

たくさんの答えを調べましたが、それほど単純なケースはありませんでした。私はカスタム検索やプラグインを使ってそれをすることを考えていました、しかし私は本当にどこから始めればよいかわかりません。ご協力いただきありがとうございます。

編集:カスタムフィールドの値は固定され、自動入力されません。 selectは追加の問い合わせなしで普通のhtmlで構築することができます。

3
Andycap

最初のコメントに従って編集された およびPastebinコード:

<?php /* You can also leave 'action' blank: action="" */ ?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<select name="my_size" id="size" class="postform" onchange="submit();">
        <option selected="selected">Choose a size</option>
        <option value="10">10</option>
        <option value="20">20</option>
</select>
</form>
<?php /* Reset filter */ ?>
<p><a href="<?php the_permalink(); ?>">Clear filter</a></p>

<?php
if( !isset($_POST['my_size']) || '' == $_POST['my_size']) {

    // unfiltered product list here

}
else {

    // Get dropdown value
    // Don't forget to sanitize this!
    $size = $_POST['my_size'];

    // Create new query
    $query = new WP_Query( array(
        'post_type'=> 'product', // your CPT
        'post_status' => 'publish',
        'meta_key' => 'size',
        'meta_value' => $size, // Dropdown value
    ) );

    // Loop
    if($query->have_posts()):
        while( $query->have_posts() ): $query->the_post();
            // Product content
        endwhile;
    endif;

    // reset query to default
    wp_reset_postdata();

}

WP_Queryのリファレンス については、Codexを参照してください。

4
Max Yudin