将分类下拉列表限制为发布类型

时间:2015-11-05 作者:NJT

我有5种不同的自定义帖子类型和一种自定义分类法。我可以使用<?php wp_dropdown_categories( $args ); ?> 但我注意到,我无法限制分类下拉列表来显示包含特定帖子类型帖子的术语。

我收到的一些评论要求我为每种帖子类型创建不同的分类法,但在我的情况下这是不可能的,因为我的自定义分类法是用于定义位置的,我希望所有5种自定义帖子类型都使用这一分类法。

我知道我可以从一个帖子类型加载帖子,并从这些帖子中获取术语,然后使用foreach 循环遍历这些对象,并将它们作为选项输出到选择字段中,但我不想使用它,因为这样会丢失为分类法设置的层次结构。如果我能用这个方法得到层次结构,那么我也愿意这样做。

这是可能的,还是我必须为每个帖子类型创建单独的分类法?

UPDATE我希望能够添加一个自定义字段值作为参数。死亡医生的回答就是这样。

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

您可以使用snippet I found 查询附加到特定职位类型的术语:

function wpse_207655_terms_by_post_type_or_meta( $clauses, $taxonomy, $args ) {
    $meta_query = new WP_Meta_Query;
    $meta_query->parse_query_vars( $args );
    $post_types = \'\';

    if ( ! empty( $args[\'post_type\'] ) ) {
        if ( $_post_types = array_intersect( ( array ) $args[\'post_type\'], get_post_types() ) )
            $post_types = implode( "\',\'", $_post_types );
    }

    if ( $post_types || $meta_query->queries ) {
        global $wpdb;

        $clauses[\'join\']   .= " INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id";
        $clauses[\'orderby\'] = "GROUP BY t.term_id {$clauses[\'orderby\']}";

        if ( $post_types )
            $clauses[\'where\'] .= " AND p.post_type IN (\'$post_types\')";

        if ( $meta_query->queries ) {
            $sql = $meta_query->get_sql( \'post\', \'p\', \'ID\' );

            $clauses[\'join\']  .= $sql[\'join\'];
            $clauses[\'where\'] .= $sql[\'where\'];
        }
    }

    return $clauses;
}

add_filter( \'terms_clauses\', \'wpse_207655_terms_by_post_type_or_meta\', 10, 3 );
现在您可以使用post_type 中的参数wp_dropdown_categories (这实际上只是传递给get_terms, 这就是我们的过滤器发挥作用的地方):

wp_dropdown_categories( \'taxonomy=location&post_type=X\' ); 
Update: 现在您还可以使用WP_Query 元参数:

wp_dropdown_categories( \'meta_key=foobar\' );
。。。或完整的元查询:

wp_dropdown_categories( array(
    \'post_type\'  => \'foobar\',
    \'meta_query\' => array(
        array(
            \'key\'   => \'this\',
            \'value\' => \'that\',
        ),
        array(
            \'key\' => \'foobar\',
        ),
    ),
));

相关推荐