在Wordpress中对自定义分类术语页面进行排序

时间:2015-07-28 09:27:01

标签: php wordpress

我为具有两种自定义分类的产品创建了自定义帖子类型," color"和"风格"。产品都标记在这两个中。当你进入分类学术语页面时,它可以正常工作,即如果你去/colour/blue它列出了所有蓝色产品。

我想要发生的是当你去/colour/blue列出所有蓝色产品但是按照第二种分类法"样式"显示前三个产品,阅读更多链接。

所以

  

蓝色>产品风格1

  • 产品1
  • 产品2
  • 产品3

查看更多..

  

蓝色>产品风格2

  • 产品3
  • 产品4
  • 产品5

查看更多..

有人知道这是否可行?

目前的代码是这样的,我为术语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>

2 个答案:

答案 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; ?> &gt; <?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>分类模板。