私のカスタム投稿タイプページには、ユーザーが編集できるカスタムフィールドがあります。
私が欲しいのは、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>
誰かが手助けをしてくれるのであれば、私は本当にこれを理解するのに苦労しています。
この質問は数ヶ月前のように見えますが、それは良い質問なので、私は墓からそれを掘り下げています。
私が解決しようとしているやり方は、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'
)
);
}
}
?>
これは検索のカスタムフィールド部分を解決するだけであることに注意してください。ページで検索する方がはるかに簡単です(そして私はあなたがすでにそれを解決したと私は集める)。