从特定父分类的子级中选择所有帖子

时间:2012-08-13 作者:Brent

我用支持层次结构的自定义分类法(位置)创建了一个自定义帖子类型(minerals)。我想做的是根据矿物柱类型的父位置创建一个回报。

例如,有人点击欧洲,结果显示了欧洲所有上市国家的所有矿产。

现在,自定义位置分类法的组织方式是将所有国家都嵌套在各自的大陆下,但只有国家(而非大陆)被选中作为职位。因此,我的挑战是对请求家长的所有现有子女进行排序,并返回符合该标准的帖子。(我还有几个其他自定义元参数要检查,但一旦我弄明白了,这些参数很容易被过滤掉。)

要执行此选择,我将在模板页面的开头使用$wpdb类。我已经为其他分类法做了类似的工作,这些分类法基于相同“mineral”自定义帖子类型的价格和大小,但这要复杂一些。

以下是我似乎首先需要做的:

SELECT wp_term_taxonomy.term_taxonomy_id 
WHERE wp_term_taxonomy.parent = $continent_id 
AND wp_term_taxnomy.count > 0;
我将把它们分配给一个数字数组,然后我将再次循环相同的查询,以检查是否选择了term_taxonomy_id 分配为wp_term_taxonomy.parent 其他条款。

最后,我将得到一个term\\u taxonomy\\u id数组,通过它可以查询wp\\u term\\u relationships表。我的问题是,如何在MYSQL查询中使用生成的数组。

这就是我目前的情况:

SELECT wp_posts . *
FROM wp_posts, wp_term_relationships
WHERE wp_posts.ID = wp_term_relationships.object_id
AND wp_term_relationships.term_taxonomy_id = (SOMETHING FROM THE TERM TAX ARRAY OF IDS)
AND wp_posts.post_type = \'mineral\' 
下面的第二行是我卡住的地方。也许我做错了,有人可以提出不同的方法。

谢谢Brent

2 个回复
最合适的回答,由SO网友:Milo 整理而成

我觉得你把这件事搞得太复杂了。使用get_terms 要获取特定术语的子级的所有分类术语,请通过child_of 参数,然后将该数组与WP_Query tax query, 无需自定义SQL查询。

SO网友:Brent

好吧,我想我已经解决了我自己的问题。在对我的问题的评论中,上面的链接最终证明是答案。简而言之,我可以将值数组传递给数据库查询字符串吗?不需要。但我可以创建一个连接字符串来创建如下查询:

$locIDS = join(\',\',$loc_array);
代码如下所示:

 wp_term_relationships.term_taxonomy_id IN ($locIDS)
它呈现如下:

 wp_term_relationships.term_taxonomy_id IN (24,25,26,27,28,29,30,39,44,64,65,66,72) 
下面是允许我处理此请求的最终代码:

$loc_array = array();

function get_local_ids($continent_id, $loc_arr){
    global $wpdb;

    $contQ = "SELECT wp_term_taxonomy.term_taxonomy_id FROM wp_term_taxonomy WHERE wp_term_taxonomy.parent = $continent_id AND wp_term_taxonomy.count > 0";

    $locID = $wpdb->get_results($contQ, ARRAY_N);

    foreach($locID as $locVal){

        echo "The value of locVal is: ". $locVal[0] ."<br>"; 
        $loc_arr[] = $locVal[0];
        get_local_ids($locVal[0], $loc_arr);
    }

    return $loc_arr;
}

$loc_array = get_local_ids($contID, $loc_array);

var_dump($loc_array);

$locIDS = join(\',\',$loc_array);

$mQuery = "
    SELECT $wpdb->posts.*
    FROM $wpdb->posts, $wpdb->term_relationships
    WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id 
    AND $wpdb->term_relationships.term_taxonomy_id IN ($locIDS)
    AND $wpdb->posts.post_status = \'publish\' 
    AND $wpdb->posts.post_type = \'mineral\'
    AND $wpdb->posts.post_date < NOW()
    ORDER BY $wpdb->posts.ID DESC
";
实际上,我在实际的代码中得到了比这更多的东西。但我认为这解释了我是如何在我的问题中完成我想要做的事情的。

结束

相关推荐

Switching database on the fly

我读过here 关于使用动态切换当前wp数据库$wpdb->select(\'database_name\'); 一旦完成,我理解我将不得不向原始数据库发出相同的语句。问题:更改数据库后,我是否需要刷新缓存或类似的东西才能正常工作?我需要再次呼叫WP标头吗?潜在问题?