更多分类过滤器:如何显示结果?

时间:2014-09-08 11:03:46

标签: wordpress woocommerce

我有两种自定义分类法。

我想过滤我的产品,获得与此wp_query相同的结果。

$args = array(
    'posts_per_page' => -1,
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'auto',
            'field' => 'ID',
            'terms' => $auto_id
        ),
        array(
            'taxonomy' => 'ricambio',
            'field' => 'ID',
            'terms' => $ricambi_id
        )
    ),
    'post_type' => 'product',
    'orderby' => 'title',
);
$query = new WP_Query( $args );

我如何显示此过滤结果? 我必须创建一个像taxonomy-auto-ricambio.php这样的模板? archive-auto-ricambio?

如果我在我的网址中写的是这样的:

http://www.myshop.com/?auto=my_auto&ricambio=my_ricambio 

它有效。

如何在带有漂亮网址的模板中显示它?

感谢。

1 个答案:

答案 0 :(得分:0)

advanced taxonomies with pretty urls上的这篇优秀文章中直接提到这一点。

首先创建一些新的重写规则。这应该是在特定于站点的片段插件中,而不是在您的主题中。然后转到固定链接并重新保存永久链接。

function so_25722819_add_rewrite_rules() {
    global $wp_rewrite;

    $new_rules = array(
        'event/(industry|location)/(.+?)/(industry|location)/(.+?)/?$' => 'index.php?post_type=eg_event&' . $wp_rewrite->preg_index(1) . '=' . $wp_rewrite->preg_index(2) . '&' . $wp_rewrite->preg_index(3) . '=' . $wp_rewrite->preg_index(4),
        'event/(industry|location)/(.+)/?$' => 'index.php?post_type=eg_event&' . $wp_rewrite->preg_index(1) . '=' . $wp_rewrite->preg_index(2)
    );
    $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
add_action( 'generate_rewrite_rules', 'so_25722819_add_rewrite_rules' );

现在,如果您使用网址访问您的网站:

  

www.example.com/auto/my_auto/ricambio/my_ricambio

您应该转到分类法归档页面,其中显示的结果与:

相同
  

www.example.com/?auto=my_auto&ricambio=my_ricambio

为了回应这些非常永久的链接,您可以使用文章作者提供的插件,只需稍加调整即可从其eg_events帖子类型切换到您的product帖子类型。

function eg_get_filter_permalink( $taxonomy_slug, $term ) {
    global $wp_query;

    // If there is already a filter running for this taxonomy
    if( isset( $wp_query->query_vars[$taxonomy_slug] ) ){
        // And the term for this URL is not already being used to filter the taxonomy
        if( strpos( $wp_query->query_vars[$taxonomy_slug], $term ) === false ) {
            // Append the term
            $filter_query = $taxonomy_slug . '/' . $wp_query->query_vars[$taxonomy_slug] . '+' . $term;
        } else {
            // Otherwise, remove the term
            if( $wp_query->query_vars[$taxonomy_slug] == $term ) {
                $filter_query = '';
            } else {
                $filter = str_replace( $term, '', $wp_query->query_vars[$taxonomy_slug] );
                // Remove any residual + symbols left behind
                $filter = str_replace( '++', '+', $filter );
                $filter = preg_replace( '/(^\+|\+$)/', '', $filter );
                $filter_query = $taxonomy_slug . '/' . $filter;
            }
        }
    } else {
        $filter_query = $taxonomy_slug . '/' . $term;
    }

    // Maintain the filters for other taxonomies
    if( isset( $wp_query->tax_query ) ) {

        foreach( $wp_query->tax_query->queries as $query ) {

            $tax = get_taxonomy( $query['taxonomy'] );

            // Have we already handled this taxonomy?
            if( $tax->query_var == $taxonomy_slug )
                continue;

            // Make sure taxonomy hasn't already been added to query string
            if( strpos( $existing_query, $tax->query_var ) === false )
                $existing_query .= $tax->query_var . '/' . $wp_query->query_vars[$tax->query_var] . '/';
        }

    }

    if( isset( $existing_query ) )
        $filter_query = $existing_query . $filter_query;

    return trailingslashit( get_post_type_archive_link( 'product' ) . $filter_query );
}

然后在任何模板中,您可以使用上述功能为您的多个分类档案生成一个非常固定的链接:

// Link to page with only my_ricambio in my_auto 
echo eg_get_filter_permalink( 'my_auto', 'my_ricambio' );