web-dev-qa-db-ja.com

オプションのメタクエリー

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の定義 - 半径内の投稿と正確に一致する都市を持つ投稿を含むが、どちらか一方だけではない

1
Josh Levinson

ここでの実際の作業はすべて$geoDataStore->getPostIDsOfInRangeによって行われています。それが検索が行われる場所であり、それはあなたが望む結果を返さないものです。

WP_Queryは、指定された投稿IDsをプルするだけです。クエリに渡されるポストIDsの順序を維持するために'orderby' => 'posts__in'を追加することをお勧めしますが、コードのその部分を放棄する必要がある理由はありません。

$geoDataStore->getPostIDsOfInRangeが必要なIDのすべてを返さない場合は、その動作を調べなければなりません。

さて、 これはあなたの$geoDataStoreクラスが問い合わせをするのに使うコード のように見えます。あなたが操作することができるかもしれないという点でフックはありません。

考えられることは2つだけです。

  1. そのクラスを拡張し、その関数を置き換えてメタ情報を検索します。
  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);
1
s_ha_dum

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'
        )
    )
);
0
GhostToast