【问题标题】:pre_get_posts() stops pages from working in WordPresspre_get_posts() 阻止页面在 WordPress 中工作
【发布时间】:2015-03-02 12:29:54
【问题描述】:

我有一个 WordPress 网站,基于 320 WP-Bootstrap 主题,带有自定义的帖子类型的视频。我正在使用 pre_get_posts() 将自定义帖子类型包含在完美运行的主循环中。

使用以下功能时,页面链接停止工作,重定向到 404 页面。

add_action( 'pre_get_posts', 'add_my_post_types_to_query' );

function add_my_post_types_to_query( $query ) {
    if ( (!is_admin()) && $query->is_main_query() )
        $query->set( 'post_type', array( 'post', 'video' ) );
    return $query;
}

我已经隔离了对函数文件所做的所有更改。如果没有此查询,页面链接可以正常工作。

非常感谢任何帮助。

【问题讨论】:

    标签: wordpress


    【解决方案1】:

    您正在检查您不在管理页面上并且正在执行主查询,这很棒。您缺少的部分是检查您是否在存档中。

    目前,无论原始查询是什么,您都在告诉它将帖子类型设置为帖子和视频。当您访问页面时,查询会从页面更改为帖子+视频,从而导致 404。

    尝试以下方法:

    function add_my_post_types_to_query( $query ) {
        if ( ! is_admin() && $query->is_main_query() ) {
    
            // Check we're on an archive page.
            if ( $query->is_archive ) { 
                $query->set( 'post_type', array( 'post', 'video' ) );
            }
    
        }
    
        return $query;
    }
    add_action( 'pre_get_posts', 'add_my_post_types_to_query' );
    

    【讨论】:

    • 这解决了我遇到的问题,但从主页中删除了cpt。除了 is_archive() 之外的 is_home() 测试解决了这个问题。感谢您的帮助。
    • 顺便说一句,“return $query”是无用的,因为这是一个动作,而不是过滤器,所以你可以删除它或用一个普通的“return;”替换它。对查询对象的更改通过引用应用于原始对象。
    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多