每个当前类别的帖子排序问题

问题描述 投票:0回答:2

这是我关于 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

但是现在我需要在用户出现时按当前类别更改订单帖子。 当我检查当前加载的类别并获取类别名称时,我尝试通过添加“if”条件来更改它,接下来检查类别名称是否为 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),子类别消失了。 我不知道为什么它会从查询中删除所有 chils 类别。

我需要帮助来解决这个问题以查看父类别中的帖子并仍然按类别名称更改排序顺序。
我会很感激你的帮助。

php wordpress sorting posts
2个回答
0
投票

我不太确定你的代码有什么问题,但我怀疑

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()
  2. 然后我检查它是否是主要查询,使用
    $query->is_main_query()
  3. 然后我检查我们是否在类别页面上,为此,我使用
    is_tax
    函数并传递
    category
    作为分类名称。
  4. 如果所有条件都通过,那么我将再次使用
    is_tax
    但这次我也使用
    is_tax( 'category', 'NEWSY' )
    传递 TERM 值,我在示例中使用的是术语名称,但是 我建议您使用 slug 或 ID。这一行会让我们知道我们是否在NEWSY类别页面上。
  5. 基于类别页面检查我正在写一个 if 和 else 语句并设置
    orderby
    order
    args.

注意: 如果您使用任何自定义分类法,则必须将

category
更改为您的自定义分类法名称,并使用术语/类别别名而不是术语/类别名称。


0
投票

我迟到了,但我遇到了同样的问题,我已经能够使用

$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' );
© www.soinside.com 2019 - 2024. All rights reserved.