私はターゲットアドレスからの距離順に入力した半径内に投稿タイプを表示するプロジェクトに取り組んでいます。 は今、私は正常に動作し、このクエリを使用しています:
複数のタクソノミーを持つWordpress SQLクエリ
sql = " SELECT SQL_CALC_FOUND_ROWS DISTINCT wposts.post_id, (" . $_GET['mikm'] . " * acos(cos(radians($lat)) * cos(radians(wposts.lat)) * cos(radians(wposts.long) - radians($long)) + sin(radians($lat)) * sin(radians(wposts.lat)))) AS distance
FROM post_address wposts
WHERE wposts.post_type ='" . $post_type . "'
HAVING distance <= $radius OR distance IS NULL ORDER BY distance LIMIT " . $from_page . "," . $per_page;
post_addressはポストのID、ポストタイプ、およびアドレスを保持するテーブルです。ポストがアドレスで保存または更新されたときに、このテーブルは情報で更新されます。 私が使用しているフォームにはアドレスのフィールド、ドロップダウンメニューのマイルまたはキロメートル、および距離を選択するチェックボックスがあります。私は、ページ設定のためのフォームでgetメソッドを使用します。
上記のクエリは正常に機能しますが、タクソノミーのサポートを追加しようとしています。今
SELECT SQL_CALC_FOUND_ROWS DISTINCT wposts.post_id, (" . $_GET['mikm'] . " * acos(cos(radians($lat)) * cos(radians(wposts.lat)) * cos(radians(wposts.long) - radians($long)) + sin(radians($lat)) * sin(radians(wposts.lat)))) AS distance
FROM post_address wposts
LEFT JOIN $wpdb->term_relationships ON (wposts.post_id = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
LEFT JOIN $wpdb->terms ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
WHERE wposts.post_type ='" . $post_type . "'
AND $wpdb->term_taxonomy.taxonomy IN ('" $tax_name "')
AND ($wpdb->term_taxonomy.parent IN (" . $_GET[$tax_name] . ") OR $wpdb->term_taxonomy.term_id IN (" . $_GET[$tax_name] . "))
HAVING distance <= $radius OR distance IS NULL ORDER BY distance LIMIT " . $from_page . "," . $per_page;
、1つの分類作業細かいので、私はそれが複数のタクソノミーで作業したい:私はそれが
wp_dropdown_categories($tax_name)
とSQLを使用して1つの分類で動作させるために管理しましたそれは私が立ち往生する場所です。たとえば、ポストタイプの "cars"に2つのタクソノミがある場合、 "model"と "color"は、 "this"モデルと "this"カラーを持つ投稿をフィリングすることができます。私はどのくらいのタクソノミーがポストタイプに存在するのか分からず(このプラグインを使用しようとする人は管理者設定で手動で入力するでしょう)、今すぐアレイに保存されています。例えば $分類法=配列( 'car_model'、 'car_color')と私はカテゴリが使用してドロップダウン移入することができます
`
foreach ($taxonomies as $tax) {
echo '<div id="' . $tax . '_cat">';
echo '<label for="category-id">Choose category: </label>';
custom_taxonomy_dropdown($tax);
echo '</div>';
`
と
function custom_taxonomy_dropdown($tax_name) {
$args = array(
'taxonomy' => $tax_name,
'hide_empty' => 0,
'depth' => 10,
'hierarchical' => 1,
'id' => $tax_name . '_id',
'name' => $tax_name,
'selected' => $_GET[$tax_name],
'show_option_all' => 'All categories',
);
wp_dropdown_categories($args);
}
をドロップダウンうまく動作し、出力もURLに送信されますが、私はそれを動作させるSQLクエリを見つけることはできません。
これは私の最初のプロジェクトです。この質問が長く続くのであれば私には言い訳がありますが、私はできる限り明確にしようとしていました。上記のコードのどれかが最善の方法であるかどうかもわかりませんが、誰かの助けがあれば大歓迎です。
UPDATE:以下
は私が今使っているコードであり、それは、複数のタクソノミーで動作します。しかし、私はまだいくつかの問題に陥る。私は分類法のすべてに「すべてのカテゴリ」を選択していたときに、SQLは次のようになります。
AND $wpdb->term_taxonomy.term_id IN()
とカウントがすべての結果の代わりに何の結果をもたらしませんCOUNT(*)= 0が表示されます。
その他の問題は、子供と孫のカテゴリになります。私が親カテゴリーを選んだとき、私はすべての子供と孫カテゴリーの結果を得ることを期待しています。親には投稿されていないので、子カテゴリには投稿されていないので結果は得られません。 これは今私のコードです:
"SELECT SQL_CALC_FOUND_ROWS DISTINCT wposts.post_id, (" . $_GET['mikm'] . "* acos(cos(radians($lat)) * cos(radians(wposts.lat)) * cos(radians(wposts.long) - radians($long)) + sin(radians($lat)) * sin(radians(wposts.lat)))) AS distance
FROM posts_address wposts
LEFT JOIN $wpdb->term_relationships ON (wposts.post_id = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
LEFT JOIN $wpdb->terms ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
WHERE
wposts.post_type IN ('" . $post_type . "')
AND $wpdb->term_taxonomy.term_id IN (" . $total_terms .")
GROUP BY wposts.post_id, wposts.lat, wposts.long
HAVING count(*) = " . $bc . " AND distance <= $radius OR distance IS NULL ORDER BY distance LIMIT " . $from_page . "," . $per_page ;
任意のヘルプがにappriciatedされます。
この現象はおそらく、wordpressの場合、カテゴリを選択しないということは、すべてのカテゴリを選択することを意味します。これは問題を提起します。なぜなら、私が説明したアプローチはそこにいくつのカテゴリがあるかを知る必要があるからです。私はカテゴリが選択されていないケースをテストし、すべての分類カテゴリのリストになるようにPHPコード内のクエリパラメータを変更します(すなわち、空のカテゴリを取り除くことは、少なくとも "すべてのカテゴリ"を意味します)。 –
s/emptyカテゴリ最少/空のカテゴリリスト/ –
これは私が今やっていることです。私は、カテゴリが選択されないケースを作成しようとしています。子どもと孫のカテゴリについては少しコードを微調整しています。私はget_term_children()を使ってforeachループを実行して、私が選択した用語が親であるかどうかを確認しなければなりません。私はこれらのidをSQLを実行するために使用します。それ以外の場合は、私が選択した用語を実行します。私はそこに着いている。再度、感謝します。それはこのコミュニティの大歓迎でした。あなたは私をたくさん助けました。 – Eyal