在自定义分类归档页面上对CPT进行排序

时间:2021-04-08 作者:rudtek

我创建了一个自定义的帖子类型,名为;al\\U产品“;并附加了一个自定义分类法,称为;产品类别;。

在我的archive-product\\u类别中。php我有以下(相关)代码:

            if ( $termchildren  ) {
                // we have kids...just show the terms.
          
                $i=1;
                foreach ( $termchildren as $child ) {
                    if ($i % 2 == 0) {
                        echo \'<div class="tax-entry flex">\';
                    } else {
                        echo \'<div class="tax-entry flex" style="flex-direction: row-reverse;">\';
                    }
                    ?>
                        <figure class="wp-block-media-text__media">
                            <?php if ( get_field(\'product_category_img\', $child) ) echo wp_get_attachment_image( get_field(\'product_category_img\', $child), \'full\' ) ;?>
                        </figure>
                        <div style="flex:60% 0 0;" class="wp-block-media-text__content">
                            <h2><?php echo $child->name ;?></h2>
                            <p>
                                <?php
                                if (get_field(\'short_description\', $child )){ 
                                    echo get_field(\'short_description\', $child );
                                }else{
                                    echo $child->description;
                                }?>
                            </p>
                            <?php
                            // Get (at most) 2 "product" posts in the child term.
                            $posts = get_posts( array(
                                \'post_type\'      => \'al_product\',
                                \'posts_per_page\' => 2,
                                $taxonomy_name   => $child->slug,
                            ) );

                            // If there\'s exactly 1 post, use the post permalink.
                            if ( 1 === count( $posts ) ) : ?>
                                <a class="button" href="<?php the_permalink( $posts[0] ); ?>">See this Product</a>
                            <?php // Else, use the term link.
                            else : ?>
                                <a class="button" href="<?php echo esc_url( get_term_link( $child, $taxonomy_name ) ); ?>">See this Series</a>
                            <?php endif; ?>

                        </div>
                    </div> <!-- END FLEX -->
                    <?php
                    $i++;
                }
            } else { 
                // no kids...show the products
                echo \'<div class="productCategories grid">\';
                while ( have_posts() ) : the_post();
                    ?>

                    <div class="product_cat">
                        <a href="<?php the_permalink();?>">
                            <?php the_post_thumbnail(\'small\');?>
                            <h2><?php the_title();?></h2>
                            <?php
                            $subtitle = get_field(\'subtitle\');
                            if ( $subtitle ) { 
                            echo \'<h3 class="entry-subtitle">\'.$subtitle.\'</h3>\';
                            }
                            ?>
                        </a>
                        <?php //if (get_field(\'specs\')[\'part_number\']) echo \'<span>\'.get_field(\'specs\')[\'part_number\'].\'</span>\';?>
                    </div>

                <?php
                endwhile;
                echo \'</div>\';
            }
我要问的部分是当没有孩子的时候,所以我们展示产品。

目前,这是返回正确的产品,但按标题排序。我想按menu\\u顺序排序。

我将此添加到我的函数中。php:

add_action( \'pre_get_posts\', \'rt_change_product_sort_order\'); 
function rt_change_product_sort_order($query){
    if(get_query_var( \'product_category\' )):
       //Set the order ASC or DESC
       $query->set( \'order\', \'DESC\' );
       //Set the orderby
       $query->set( \'orderby\', \'menu_order\' );
    endif;    
};
没用。我也尝试过替换;“如果”;以下各项的声明:

if(is_post_type_archive( \'product_category\' )):
if(get_query_var( \'product_category\' )):
if(get_query_var( \'al_product\' )):
我错过了什么?

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

在我的archive-product\\u类别中。php我有这个(相关)代码

你确定那是正确的名字吗?因为对于post type 存档,应该是archive-al_product.php 对于taxonomy 存档页,应该是taxonomy-product_category.php.

无论如何,(正如我在评论中所说)如果你想针对taxonomy 存档页,您应该使用is_tax(), 或者如果是post type 存档页面,然后您将使用is_post_type_archive().

请注意is_post_type_archive() 一个或多个post类型名称/slug类似al_product 在你的情况下。因此,在您的代码/尝试中is_post_type_archive( \'product_category\' ) 实际上是not 正确..=)

此外,您的帖子类型应具有has_archive argument 设置为true 或者像鼻涕虫一样al-products. 这样,当您访问example.com/?post_type=al_productexample.com/al-products, is_post_type_archive() 将返回true。

为了正确排序帖子(在WordPress主查询中),您可以尝试以下操作:

// In the rt_change_product_sort_order() function:
// Instead of using get_query_var(), you would use is_tax().
if ( is_tax( \'product_category\' ) ) :
    // ... your code.
endif;

// Or use is_post_type_archive() to target the CPT archive.
if ( is_post_type_archive( \'al_product\' ) ) :
    // ... your code.
endif;

// Or combine the conditional tags, if you want to:
if ( is_tax( \'product_category\' ) || is_post_type_archive( \'al_product\' ) ) :
    // ... your code.
endif;
<额外资源https://developer.wordpress.org/themes/basics/conditional-tags/

相关推荐