web-dev-qa-db-ja.com

2つのドロップダウンからカスタム投稿タイプのページとカスタムフィールドを検索する?

私のカスタム投稿タイプページには、ユーザーが編集できるカスタムフィールドがあります。
私が欲しいのは、2つの選択ドロップダウンを持つ検索フォームを持っていることです。特定のカスタムフィールド値。

これまでのところ、カスタムフィールドで結果をフィルタ処理することはできませんでした。これが私のフォームコードです。

<form method="get" action="<?php echo get_permalink($properties_search_id); ?>">
            <input type="hidden" name="post_type" value="floor_plan" />
            <ul class="wpp_search_elements">
                <li class="wpp_search_group wpp_group_not_a_group">
                    <ul class="wpp_search_group wpp_group_not_a_group">
                        <li>
                            <label class="wpp_search_label wpp_search_label_bedrooms" for="wpp_search_element_7165">Bedrooms<span class="wpp_search_post_label_colon">:</span></label>
                            <div class="wpp_search_attribute_wrap">
                                <select name="bedrooms" class="bedrooms">
                                    <?php
                                        $metakey = 'number_of_bedrooms';
                                        $bedrooms = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT meta_value FROM $wpdb->postmeta WHERE meta_key = %s ORDER BY meta_value ASC", $metakey) );
                                        if ($bedrooms) {
                                        foreach ($bedrooms as $bedroom) {
                                          echo "<option value=\"" . $bedroom . "\">" . $bedroom . "</option>";
                                        }
                                        }
                                    ?>
                                </select>
                            </div>
                            <div class="clear"></div>
                        </li>
                        <li>
                            <label class="wpp_search_label wpp_search_label_property_type" for="wpp_search_element_7437">Property Type<span class="wpp_search_post_label_colon">:</span></label>
                            <div class="wpp_search_attribute_wrap">

                                 <?php
                                     $args = array(
                                        'child_of'     => 0,
                                        'sort_order'   => 'ASC',
                                        'sort_column'  => 'post_title',
                                        'hierarchical' => 2,
                                        'depth'         => 1,
                                        'post_type' => 'floor_plan'
                                        );
                                    wp_dropdown_pages( $args );
                                ?>

                            </div>
                            <div class="clear"></div>
                        </li>
                    </ul>
                <div class="clear"></div>
                </li>
                <li class="wpp_search_form_element submit">
                    <input type="submit" value="Search" class="wpp_search_button submit">
                </li>
            </ul>
        </form>

誰かが手助けをしてくれるのであれば、私は本当にこれを理解するのに苦労しています。

6
nathanp

この質問は数ヶ月前のように見えますが、それは良い質問なので、私は墓からそれを掘り下げています。

私が解決しようとしているやり方は、pre_get_postsフィルターで検索を傍受し、提供された情報に基づいてメタクエリを追加することです。これがプラグインになったり、テーマのfunctions.phpファイルに入ったりすることができるソリューションの基本的なショットです。

<?php
/**
 * Add a parameter for a custom field search
 */
add_filter('query_vars', 'wpse_35639_search_queryvars' );
function wpse_35639_search_queryvars( $qvars ) {
    $qvars[] = 'bedrooms';
    return $qvars;
}


/**
 * Intercept the posts query to add in our meta query if necessary
 */
add_action('pre_get_posts','wpse_35639_intercept_search');
function wpse_35639_intercept_search() {
    global $wp_query;

    if ( ! is_admin() && isset($wp_query->query_vars['bedrooms']) && is_numeric($wp_query->query_vars['bedrooms']) ) {
        # Limit the search to the floor_plan custom post type
        $wp_query->set('post_type', 'floor_plan');

        # This may seem unconventional, but we're setting that this is a search
        # even though WP doesn't recognize it as one. This is to leverage the search template
        $wp_query->is_search = true;

        # Set the meta query comparison
        $wp_query->set('meta_query', array(
            array(
                'key' => 'number_of_bedrooms',
                'value' => $wp_query->query_vars['bedrooms'],
                'compare' => '=',
                'type' => 'NUMERIC'
            )
        );
    }
}
?>

これは検索のカスタムフィールド部分を解決するだけであることに注意してください。ページで検索する方がはるかに簡単です(そして私はあなたがすでにそれを解決したと私は集める)。

1
Matthew Boynes