2012-04-24 40 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