我为具有两种自定义分类的产品创建了自定义帖子类型," color"和"风格"。产品都标记在这两个中。当你进入分类学术语页面时,它可以正常工作,即如果你去/colour/blue
它列出了所有蓝色产品。
我想要发生的是当你去/colour/blue
列出所有蓝色产品但是按照第二种分类法"样式"显示前三个产品,阅读更多链接。
所以
蓝色>产品风格1
查看更多..
蓝色>产品风格2
查看更多..
有人知道这是否可行?
目前的代码是这样的,我为术语taxonomy-colour.php创建了一个分类模板
<?php get_header(); ?>
<main role="main" class="blinds">
<h1 class="main-product-title">Products</h1>
<!-- section -->
<section class="main-product-content">
<h2><?php $term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) ); echo $term->name; ?></h2>
<?php if (have_posts()): while (have_posts()) : the_post(); ?>
<!-- article -->
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<!-- post image -->
<?php if ( has_post_thumbnail()) : // Check if thumbnail exists ?>
<?php the_post_thumbnail(array(720,400)); // Declare pixel size you need inside the array ?>
<?php endif; ?>
<!-- /post thumbnail -->
<!-- post title -->
<h4><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></h4>
<!-- /post title -->
<p><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>">View ></a></p>
</article>
<!-- /article -->
<?php endwhile; ?>
<?php else: ?>
<!-- article -->
<article>
<h2><?php _e( 'Sorry, nothing to display.', 'html5blank' ); ?></h2>
</article>
<!-- /article -->
<?php endif; ?>
<?php get_template_part('pagination'); ?>
</section>
<!-- /section -->
<div class="sidebar-wrapper">
<?php if(!function_exists('dynamic_sidebar') || !dynamic_sidebar('product-sidebar')) ?>
</div>
</main>
答案 0 :(得分:0)
如评论中所述,您需要使用usort()
过滤器上的the_posts
根据需要对帖子进行排序。
您可以尝试以下操作:( 注意: 以下代码未经测试,由于阵列解除引用而需要PHP 5.4+ )
add_filter( 'the_posts', function ( $posts, $q )
{
if ( $q->is_main_query() // Target only the main query
&& $q->is_tax( 'colour' ) // Only target the colour taxonomy term pages
) {
/**
* There is a bug in usort that will most probably never get fixed. In some instances
* the following PHP warning is displayed
* usort(): Array was modified by the user comparison function
* @see https://bugs.php.net/bug.php?id=50688
* The only workaround is to suppress the error reporting
* by using the @ sign before usort
*/
@usort( $posts, function ( $a, $b )
{
// Use term name for sorting. We will sort by style taxonomy term
$array_a = get_the_terms( $a->ID, 'style' );
$array_b = get_the_terms( $b->ID, 'style' );
// Add protection if posts don't have any terms, add them last in queue
if ( empty( $array_a ) || is_wp_error( $array_a ) ) {
$array_a = 'zzz'; // Make sure to add posts without terms last
} else {
$array_a = $array_a[0]->name;
}
// Add protection if posts don't have any terms, add them last in queue
if ( empty( $array_b ) || is_wp_error( $array_b ) ) {
$array_b = 'zzz'; // Make sure to add posts without terms last
} else {
$array_b = $array_b[0]->name;
}
/**
* Sort by term name, if term name is the same sort by post date
* You can adjust this to sort by post title or any other WP_Post property_exists
*/
if ( $array_a != $array_b ) {
// Choose the one sorting order that fits your needs
return strcasecmp( $array_a, $array_b ); // Sort term alphabetical ASC
//return strcasecmp( $array_b, $array_a ); // Sort term alphabetical DESC
} else {
return $a->post_date < $b->post_date; // Not sure about the comparitor, also try >
}
});
}
return $posts;
}, 10, 2 );
答案 1 :(得分:-1)
要做的第一件事是为您当前的分类术语获取可用的样式术语。为此,您可以获取当前分类的所有帖子ID,然后使用wp_get_object_terms
从中获取样式条款。然后循环遍历它们,查询具有这两个分类术语(颜色和样式)的三个帖子。
以下是您可以用于案例的示例:
<?php
// get the term...
$term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) );
// get all posts from this term and store the IDs
$term_posts = get_posts(array('tax_query' => array(array(
'taxonomy' => get_query_var('taxonomy'),
'terms' => $term->ID
))));
$term_posts_IDs = array();
foreach ($term_posts as $term_post) {
$term_posts_IDs[] = $term_post->ID;
}
// get the available styles from this set of posts
$styles = wp_get_object_terms($term_posts_IDs, 'style');
?>
<h2><?php echo $term->name; ?></h2>
<?php
if(!empty($styles)): // styles are availables for this term
foreach($styles as $style):
?>
<h3><?php echo $term->name; ?> > <?php echo $style->name; ?></h3>
<?php
// get the first three products with colour + style
$tax_posts = get_posts(array(
'posts_per_page' => 3,
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => get_query_var('taxonomy'),
'terms' => $term->ID
),
array(
'taxonomy' => 'style',
'terms' => $style->ID
)
)
));
?>
<ul>
<?php foreach($tax_posts as $tax_post): ?>
<li><?php echo $tax_post->post_title; ?></li>
<?php endforeach; ?>
</ul>
<!-- ... link to your style taxonomy template here ... -->
<?pgpp endforeach ; ?>
<?php else : ?>
<!-- ... default behaviour ... -->
<?php endif; ?>
您必须通过将样式术语和 颜色术语发送到样式<来构建您的阅读更多链接/ em>分类模板。