自定义帖子类型上的pre_get_post

时间:2015-06-23 作者:evu

我有一个自定义的帖子类型,当我使用自定义的wp\\u查询时,它可以在页面上很好地显示帖子,但是这会破坏分页,所以我尝试使用pre\\u get\\u posts来代替,因为我已经在使用它来处理分页偏移,并且可以在普通帖子上找到。

但是,当我尝试使用pre\\u get\\u posts设置特定页面/帖子类型的帖子类型时,它显示了404。我确实有一篇自定义帖子,其名称中的字符串与自定义帖子类型中的字符串相同;\'“业务挑战”是帖子类型,“面对业务挑战”是它重定向到的帖子。自从我删除了那篇帖子,现在只显示了404。

我的预获取帖子功能:

    function query_business_challenges( $query ) {

        if ( ! is_admin() && $query->is_main_query() && is_page(\'business-challenges\')) {
            $query->set( \'post_type\', \'business-challenges\' );
        } // end if
    }
    add_action( \'pre_get_posts\', \'query_business_challenges\', 1 );
和我的自定义帖子类型:

    function pt_business_challenges() {
        $labels = array(
            \'name\'                => \'Business Challenges\',                        
            \'singular_name\'       => \'Business Challenge\',                         
            \'menu_name\'           => \'B. Challenges\',                        
            \'parent_item_colon\'   => \'Business Challenges\',                        
            \'all_items\'           => \'All Business Challenges\',                    
            \'view_item\'           => \'View Business Challenge\',                    
            \'add_new_item\'        => \'Add New Business Challenge\',                 
            \'add_new\'             => \'Add New\',
            \'edit_item\'           => \'Edit Business Challenge\',                    
            \'update_item\'         => \'Update Business Challenge\',                  
            \'search_items\'        => \'Search Business Challenges\',                 
            \'not_found\'           => \'Not found\',
            \'not_found_in_trash\'  => \'Not found in Trash\',
        );
        $args = array(
            \'label\'               => \'business-challenges\',                         
            \'description\'         => \'For New and Previous Business Challenges\',   
            \'labels\'              => $labels,
            \'supports\'            => array( \'title\', \'editor\', \'excerpt\', \'thumbnail\', \'revisions\', \'custom-fields\', ),
            \'hierarchical\'        => false,
            \'public\'              => true,
            \'show_ui\'             => true,
            \'show_in_menu\'        => true,
            \'rewrite\' => array( \'slug\' => \'/business-challenges\'),                  
            \'show_in_nav_menus\'   => true,
            \'show_in_admin_bar\'   => true,
            \'menu_position\'       => 7,
            \'menu_icon\'           => \'dashicons-chart-area\',         
            \'can_export\'          => true,
            \'has_archive\'         => true,
            \'exclude_from_search\' => false,
            \'publicly_queryable\'  => true,
            \'capability_type\'     => \'page\',
        );
        register_post_type( \'business-challenges\', $args );                         
    }
    add_action( \'init\', \'pt_business_challenges\', 0 );
我做错了什么?

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

pre_get_posts 不适用于页面模板和静态首页。它将是404。如果我读了WP_Query 正确初始化时,页面ID将传递给参数,如p 解析URL后。您可以尝试取消设置此参数并检查它是否更改了查询,但我怀疑这是否是唯一可以更改以使其正常工作的参数。从来没有玩过这个,所以一切都只是猜测。这是一个很好的机会pre_get_posts 页面上的模板

您必须在此处使用自定义查询来输出所需内容。至于分页,您需要添加以下自定义查询以使其正常工作

这是在定义参数之前进行的

$paged = get_query_var( \'paged\' ) ? get_query_var( \'paged\' ) : 1;
记住要改变\'paged\'\'page\' 对于静态首页

然后需要设置\'paged\' 查询参数中的参数

\'paged\' => $paged,
那么,通过$max_num_pages 对分页函数的自定义查询的属性。

实例

如果自定义查询如下所示

$q = new WP_Query( $args );
那你需要通过$q->max_num_pages 到分页函数,如下所示

next_posts_link( \'Next posts\', $q->max_num_pages );
编辑代码上的一个或两个注释

如果要在页面模板上显示自定义帖子类型,需要设置has_archivefalse, 否则,存档模板将用于显示自定义帖子类型

如果您在自定义帖子类型上遇到404个错误archive 模板,然后您只需要通过访问permalink设置页面来刷新permalinks。不需要任何类型的自定义代码或过滤器。

从你的粘贴中编辑2(这应该是对你的问题的编辑),你有一些小问题

  • wp_reset_query() 是错误的。它与一起使用query_posts 你永远不应该使用它。您应该使用wp_reset_postdata()

    似乎您正在尝试将分页添加到查询的顶部。为了使其工作,您需要首先定义自定义查询。但是,您可以在循环之前添加分页。

    正如我所说,您需要设置$max_pages 中的参数next_posts_link()

    您的查询应该与此类似

    $paged = get_query_var( \'paged\' ) ? get_query_var( \'paged\' ) : 1;
    $args = array(
        \'paged\' => $paged,
        //Rest of your arguments
    );
    $loop = new WP_Query( $args );
    
    /*
     * If you need your pagination above the loop,
     * this is the earliest to add it. You cannot add it above
     */
    next_posts_link( \'Next Posts\', $loop->max_num_pages );
    previous_posts_link( \'Previous Posts\' );
    
    if ( $loop->have_posts() ) {
        while ( $loop->have_posts() ) {
        $loop->the_post();
    
            //YOUR LOOP
    
        } // endwhile
    
        // Add pagination here
        next_posts_link( \'Next Posts\', $loop->max_num_pages );
        previous_posts_link( \'Previous Posts\' );
        // Reset postdata, VERY VERY IMPORTANT
        wp_reset_postdata();
    } // endif
    

结束

相关推荐