2012-04-24 77 views
0

我正在一個項目,顯示按目標地址的距離排序的半徑輸入的帖子類型。 現在我使用此查詢工作正常:
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,崗位類型和地址的表。當一個職位正在保存或更新的地址,這張表正在更新信息。 我使用的表格有地址欄,複選框選擇英里或公里,以及下拉菜單中的距離。我使用分頁的形式獲取方法。

雖然上面的查詢工作正常,我想添加分類法支持。我設法使其使用

wp_dropdown_categories($tax_name) 


和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 
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; 


現在 ,因爲一個分類法做工精細,我想,使其與多個分類工作那就是我卡住的地方。如果例如郵政類型「汽車」有2個分類「模型」和「顏色」,我希望能夠過濾具有「這個」模型和「這個」顏色的帖子。我不知道有多少分類存在於帖子類型中(誰將使用此插件將在管理設置中手動輸入),並且他們現在被保存在數組中。例如 $分類=陣列( 'car_model', 'car_color')和i可以填充類別下拉使用:

` 
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); 
} 


的下拉菜單工作正常,輸出發送到網址,但我無法找到將使其工作的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。

+0

這種行爲可能意味着,對於WordPress,選擇沒有類別意味着選擇所有類別。這提出了一個問題,因爲我描述的方法需要知道有多少種類。我將測試沒有選擇類別的情況,並將PHP代碼中的查詢參數更改爲所有分類法類別的列表(即刪除空類別,意思是「所有類別」) – 2012-04-27 18:38:53

+0

s/empty類別最小/空類別列表/ – 2012-04-27 19:10:49

+0

這就是我現在正在做的。我試圖創建一個案件,當沒有類別選擇。對於兒童和孫子類別,我正在調整一些代碼。我必須使用get_term_children()來運行foreach循環,以檢查我選擇的術語是否是父級,如果是,則獲取其子標識符。然後我使用這些ID運行SQL。否則它會運行我選擇的術語。我到了那裏。再次感謝。這非常歡迎這個社區。你幫了我很多。 – Eyal 2012-04-27 19:24:44

回答

0

如果我正確地閱讀了您的要求,則不需要從數據庫中提取有關分類的信息,只需驗證帖子是否「加入」了所有必需的分類法。加入包含所有必需分類法的帖子,然後根據行乘法結果進行過濾。

第一步,那就是你有

$wpdb->term_taxonomy.taxonomy IN ('" $tax_name "') 

$wpdb->term_taxonomy.parent IN (" . $_GET[$tax_name] . ") OR $wpdb->term_taxonomy.term_id IN (" . $_GET[$tax_name] . ")) 

有它,使得進入IN操作符的參數產生的所有分類名稱的列表,以逗號分隔,包圍通過引號。例如:

$wpdb->term_taxonomy.taxonomy IN ('model_a', 'color_blue') 

現在,查詢會將帖子與該帖子匹配的所有分類法(在您的過濾器中)相乘。從這裏開始,很簡單:按帖子字段進行分組(您只需要按照您在查詢中輸出的信息進行分組),然後使用HAVING進行篩選,以便只返回所有類別的帖子。在這個例子中,後期應該匹配兩大類,所以:

(...) 
GROUP BY wposts.post_id, wposts.lat, wposts.long 
HAVING count(*) = 2 AND (distance <= $radius OR distance IS NULL ORDER BY distance LIMIT " . $from_page . "," . $per_page); 

注意,COUNT(*)過濾器應符合分類的數量「軸」相匹配。還要注意,我假設分類法中沒有碰撞(即沒有「藍色」模型和「藍色」顏色)。

你應該刪除查詢中的DISTINCT運算符(分組已經產生了不同的帖子,我不確定mysql的優化器何時會計算不同的運算符)。

+0

謝謝塞爾吉奧,我試過你的解決方案,但我無法使它工作。我認爲在你建議輸入分類標準$ wpdb-> term_taxonomy.taxonomy('model_a','color_blue')的地方應該是term_taxonomy.term_id IN和我從下拉列表中選擇的術語標識。在這種情況下,我將獲得我選擇的模型或我選擇的顏色的帖子。當我只需要具有我選擇的模型和顏色的帖子時。 – Eyal 2012-04-25 17:22:55

+0

你在這裏一半。嘗試沒有分組的查詢,你應該得到所有的帖子,分類對。然後,如果您按帖子字段進行分組並生成一個計數(*),您應該獲得帖子以及它匹配的分類標準數量。然後,在HAVING子句中添加count(*)條件,並且可以篩選匹配所有必需分類法的帖子。 – 2012-04-26 18:15:46

+0

非常感謝,這次它確實有效。我第一次嘗試時沒有得到結果,因爲「AND(distance ...)」中的括號。我刪除它後,它工作。不過,我現在仍然遇到其他一些問題。我用我現在使用的代碼和我遇到的問題更新了我的問題。有關這些問題的任何其他信息將對我非常有用。自從它解決了我的原始問題以來,我仍然認爲你的答案是正確的答案。謝謝。 – Eyal 2012-04-27 14:45:26