首页 文章

在Wordpress 2.8中查询多个自定义分类术语?

提问于
浏览
4

我创建了一个名为“技术”的自定义分类,但不能像类别或标签一样查询多个术语 .

These querys DO work:

query_posts('tag=goldfish,airplanes');

query_posts('technologies=php');

However, neither of the following work correctly:

query_posts('technologies=php,sql');

query_posts('technologies=php&technologies=sql');

我的目标:使用'php'技术显示所有帖子,并使用'sql'技术显示所有帖子

有任何想法吗?这甚至可能吗?谢谢!

9 回答

  • 0

    显然query_posts在这种特定情况下无法帮助 . (希望它将在Wordpress的未来版本中添加!)解决方案是使用如下自定义选择查询:

    SELECT * 
    FROM $wpdb->posts
    LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.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 $wpdb->posts.post_type = 'post' 
    AND $wpdb->posts.post_status = 'publish'
    AND $wpdb->term_taxonomy.taxonomy = 'technologies'
    AND $wpdb->terms.slug = 'php' OR $wpdb->terms.slug = 'css'
    ORDER BY $wpdb->posts.post_date DESC
    

    更多信息可在Wordpress Codex中找到:http://codex.wordpress.org/Displaying_Posts_Using_a_Custom_Select_Query

  • 1

    这是一个有点延迟的回复,但它现在是第一次在谷歌“多个术语的Wordpress相关帖子”,所以我想我会贡献我的发现 .

    由于此问题已发布,Wordpress已更改为允许此类查询 . 这将为您提供与分配给对象的任何自定义分类术语相关的帖子列表:

    $post_cats = wp_get_object_terms(get_the_ID(), 'video_category', array('fields' => 'ids'));
    
    $args=array(
        "tax_query" => array(
            array(
                "taxonomy" => "video_category",
                "field" => "id",
                "terms" => $post_cats
            )
        ),
        'post__not_in' => array(get_the_ID()),
        'post_type' => 'video',
        'posts_per_page' => 8,
        'caller_get_posts' => 1
    );
    
    $related_by_cats = new WP_Query($args);
    

    这是我对SO的第一次贡献,我希望它符合标准 .

  • 0
  • 0

    这有用吗? query_posts('tag =面包烘焙食谱')

    来自:http://codex.wordpress.org/Template_Tags/query_posts

  • 0

    好的,所以这是我对此的抨击 . 它有点hacky,但它的工作原理 . 最大的缺点是需要重新添加任何其他查询变量,因为当调用多个术语时,失败会删除所有查询变量 .

    此外,我没有对多个分类法的查询进行测试 . 这仅适用于特定的分类 . 使用风险由您自己承担 .

    function multi_tax_terms($where) {
        global $wp_query;
        if ( strpos($wp_query->query_vars['term'], ',') !== false && strpos($where, "AND 0") !== false ) {
            // it's failing because taxonomies can't handle multiple terms
            //first, get the terms
            $term_arr = explode(",", $wp_query->query_vars['term']);
            foreach($term_arr as $term_item) {
                $terms[] = get_terms($wp_query->query_vars['taxonomy'], array('slug' => $term_item));
            }
    
            //next, get the id of posts with that term in that tax
            foreach ( $terms as $term ) {
                $term_ids[] = $term[0]->term_id;
            }
    
            $post_ids = get_objects_in_term($term_ids, $wp_query->query_vars['taxonomy']);
    
            if ( !is_wp_error($post_ids) && count($post_ids) ) {
                // build the new query
                $new_where = " AND wp_posts.ID IN (" . implode(', ', $post_ids) . ") ";
                // re-add any other query vars via concatenation on the $new_where string below here
    
                // now, sub out the bad where with the good
                $where = str_replace("AND 0", $new_where, $where);
            } else {
                // give up
            }
        }
        return $where;
    }
    
    add_filter("posts_where", "multi_tax_terms");
    
  • 6

    在WP中实现自定义分类法后,没有任何内置函数可以随意使用它们,并且文档几乎不存在,这是多么愚蠢 . 我正在寻找一个解决方案,这个查询解决了它(并使我的一天) . 谢谢 .

    不幸的是,遗憾的是我重复了一遍 . 我明白了: **Fatal error**: Call to a member function get_results() on a non-object

    我想我不知道怎么从函数中调用 $wpdb .

  • 1

    它应该是这样的:

    global $wp_query;
            query_posts(
                    array_merge(
                        array('taxonomy' => 'technologies', 'term' => array('sql', 'php')),
                        $wp_query->query
                    )
                );
    

    至少适用于自定义post_types .

  • 10

    嘿,我也遇到过同样的问题 . 如果没有多个值,则可以通过以下方式执行此操作,而不是编写原始SQL查询:

    $loop = new WP_Query(array('technologies' => 'php','technologies' => 'sql'));
    

    然后,您可以循环遍历此处创建的wp_query对象 . 虽然这是一个非常古老的帖子,我相信你已经解决了这个问题 . :)

  • 4
    //equivalent to get_posts
     function brand_get_posts($args=array()){
    global $wpdb;
    $sql = "SELECT p.* ";
    $sql.= " FROM $wpdb->posts p";
    $sql.= " LEFT JOIN $wpdb->term_relationships term_r ON(p.ID = term_r.object_id)";
    $sql.= " LEFT JOIN $wpdb->term_taxonomy term_t ON(term_r.term_taxonomy_id = term_t.term_taxonomy_id)";
    $sql.= " LEFT JOIN $wpdb->terms terms ON(term_t.term_id = terms.term_id)";
    $sql.= " WHERE 1=1 ";
    if(!empty($args['post_type'])){
        $sql.= " AND p.post_type = '".$args['post_type']."'";
    }   
    $sql.= " AND p.post_status = 'publish'";
    
    if(!empty($args['taxonomy'])){
        $sql.= " AND term_t.taxonomy = '".$args['taxonomy']."'";
    }   
    if(!empty($args['terms'])&&is_array($args['terms'])){
        $sql.= " AND terms.slug IN ('".implode(",",$args['terms'])."')";
    }
    $sql.= " ORDER BY p.post_date DESC";
    if(!empty($args['posts_per_page'])){
        $sql.=" LIMIT ".$args['posts_per_page'];
    }
    if(!empty($args['offset'])){
        $sql.=" OFFSET ".$args['offset'];
    }
    //echo '<h1>'.$sql.'</h1>';
    return $wpdb->get_results($sql);
     }
    

相关问题