WPの投稿テーブルに投稿として保存されている場所があります。
Geo Data Store( http://wordpress.org/plugins/geo-data-store/ )を使用して地理的位置を特定しています。出発点(座標に変換された都市)から選択した任意の半径から現在結果を得ることができるので、これは私にとって非常にうまくいっています。
以前は都市で完全一致を使用していました - ユーザーが都市をクリックすると、クリックされた都市と完全に一致するpostmetaを含む投稿が結果として読み込まれました - 私はAshevilleをクリックします。
ジオロケーションへの切り替えが原因で発生した問題は、ユーザーが都市をクリックしたときに、その都市内の一部の結果が表示されないことです。クリックした都市.
私のクエリの関連部分は次のようになります。
$coordinates = ConvertCityStateToCoords($city.', '.$state);
$lat = (double)$coordinates['lat'];
$long = (double)$coordinates['long'];
$posts = (array) $geoDataStore->getPostIDsOfInRange('place', $radius, $lat, $long);
$posts = array_map('intval',$posts);
$args['post__in']=$posts;
$places= new WP_Query($args);
以前はこんな感じでしたが:
$args['meta_query'][] = array(
'key' => 'place_state',
'value' => $state,
);
$args['meta_query'][] = array(
'key' => 'place_city',
'value' => $city
);
$places= new WP_Query( $args );
私の質問はこれです:WP_Queryを放棄しなければならないのでしょうか(私はページ分割と順序付けにも使っているのでやめたくないでしょう) 'optional'フィールドを照会することを可能にするSQLの定義 - 半径内の投稿と正確に一致する都市を持つ投稿を含むが、どちらか一方だけではない
ここでの実際の作業はすべて$geoDataStore->getPostIDsOfInRange
によって行われています。それが検索が行われる場所であり、それはあなたが望む結果を返さないものです。
WP_Query
は、指定された投稿ID
sをプルするだけです。クエリに渡されるポストID
sの順序を維持するために'orderby' => 'posts__in'
を追加することをお勧めしますが、コードのその部分を放棄する必要がある理由はありません。
$geoDataStore->getPostIDsOfInRange
が必要なID
のすべてを返さない場合は、その動作を調べなければなりません。
さて、 これはあなたの$geoDataStore
クラスが問い合わせをするのに使うコード のように見えます。あなたが操作することができるかもしれないという点でフックはありません。
考えられることは2つだけです。
言い換えると...
$posts = (array) $geoDataStore->getPostIDsOfInRange('place', $radius, $lat, $long);
$posts2 = new WP_Query(array(
// query for the others
'fields' => 'ids',
// other parameters
// Much like your original meta_query but
// I do think you need the 'OR' relationship
));
$posts = array_unique($posts + $posts2);
$args['post__in'] = $posts;
$places = new WP_Query($args);
OR
がデフォルトであるため、クエリ間にAND
関係を宣言する必要があります。
http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters からの例
$args = array(
'post_type' => 'product',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'color',
'value' => 'blue',
'compare' => 'NOT LIKE'
),
array(
'key' => 'price',
'value' => array( 20, 100 ),
'type' => 'numeric',
'compare' => 'BETWEEN'
)
)
);