php 按当前类别对文章排序的问题

2sbarzqh  于 2023-04-19  发布在  PHP
关注(0)|答案(2)|浏览(116)

这是我对stackoverflow的第一个问题。
我有排序的职位问题。我写小插件按字母顺序排序职位。它的工作确定。有一个代码:

function wpb_custom_query( $query ) {
    if( $query->is_main_query() AND !($query->is_home()) ) {
        $query->set( 'orderby', 'title' );
        $query->set( 'order', 'ASC' );
    }
}
add_action( 'pre_get_posts', 'wpb_custom_query' );

查询监视器将查询视为:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (133,134,135,136,137,161) )
AND ((wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'private')))
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_title ASC
LIMIT 0, 70

但现在我需要更改订单的职位时,当前类别的用户是。我尝试通过添加“如果”条件,当我检查什么类别是当前加载并获得类别名称,下一个检查类别名称是否是euqal“NEWSY”改变它。修改后的代码:

function wpb_custom_query( $query ) {
    if( $query->is_main_query() AND !($query->is_home()) ) {

        $current_category = get_queried_object();

        if($current_category->name == 'NEWSY') 
        { 
            $query->set( 'orderby', 'date' );
            $query->set( 'order', 'DESC' );
        }
        else
        {
            $query->set( 'orderby', 'title' );
            $query->set( 'order', 'ASC' );
        }
    }
}
add_action( 'pre_get_posts', 'wpb_custom_query' );

查询监视器将查询视为:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (133) )
AND ((wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'private')))
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_title ASC
LIMIT 0, 70

当我去名为“NEWSY”的类别时,它可以工作,但问题是在父类别中(133)所有的帖子都消失了。我没有帖子添加到父类别,所有的帖子都被分配到子类别。当我按类别为用户设置权限时,它依赖于另一个插件。在查询监视器中,我看到查询条件“wp_term_relationships.term_taxonomy_id”只有一个父类别(133)和子类别消失了。我不知道为什么它从查询中删除了所有的儿童类别。
我需要帮助来解决这个问题,看到在父类别回来的职位,仍然改变类别名称排序顺序。
我将感激你的帮助。

5sxhfpxr

5sxhfpxr1#

我不确定你的代码有什么问题,但我怀疑get_queried_object()是导致这个问题的原因。
但是,您可以以一种干净的方式编写这样的代码。

function wpb_custom_query( $query ) {
    if ( ! is_admin() && $query->is_main_query() && is_tax( 'category' ) ) {
        if ( is_tax( 'category', 'NEWSY' ) ) {
            $query->set( 'orderby', 'date' );
            $query->set( 'order', 'DESC' );
        } else {
            $query->set( 'orderby', 'title' );
            $query->set( 'order', 'ASC' );
        }
    }
}
add_action( 'pre_get_posts', 'wpb_custom_query' );
代码说明

1.首先,我正在检查以停止后端的此自定义,为此,我添加了检查! is_admin()
1.然后检查它是否是主查询,使用$query->is_main_query()
1.然后我检查我们是否在分类页面上,为此,我使用is_tax函数并将category作为分类名称传递。
1.如果所有条件都通过,那么我再次使用is_tax,但这次我也使用is_tax( 'category', 'NEWSY' )传递TERM值,我在示例中使用术语名称,但我建议您使用slug或ID。这一行将让我们知道我们是否在NEWSY类别页面上。
1.基于类别页面检查我写了一个if和else语句,并设置了orderbyorder参数。

**注意:**如果您使用的是自定义分类法,则必须将category更改为自定义分类法名称,并使用术语/类别slug而不是术语/类别名称。

dojqjjoe

dojqjjoe2#

我迟了,但我遇到了同样的问题,我已经能够使用$query->set( 'suppress_filters', true );解决它
所以你的代码应该是:

function wpb_custom_query( $query ) {
    if( $query->is_main_query() AND !($query->is_home()) ) {
        $query->set( 'orderby', 'title' );
        $query->set( 'order', 'ASC' );
        $query->set( 'suppress_filters', true );
    }
}
add_action( 'pre_get_posts', 'wpb_custom_query' );

相关问题