我正在开展一个项目,该项目显示在距离目标地址的距离排序的半径范围内的帖子类型。
现在我正在使用这个查询工作正常:
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个分类“模型”和“颜色”我希望能够过滤具有“此”模型和“此”颜色的帖子。我不知道post类型有多少分类法(谁会使用这个插件将在管理员设置中手动输入),现在它们被保存在数组中。例如
$ taxonomies = array('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查询。
更新:
下面是我现在使用的代码,它适用于多种分类法。但是,我仍然遇到一些问题。当我在所有分类中选择“所有类别”时,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 ;
任何帮助都是适当的。
答案 0 :(得分: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的优化器什么时候会计算出不同的运算符)。