如何通过链接在搜索结果和类别列表中打开/关闭分页?

时间:2017-01-31 作者:wwwolf

在此网站上,用户希望能够关闭分页,以便能够将搜索或类别查询的整个结果发送到一个大文档中打印。看起来很明显,所以我惊讶地发现没有插件。。。现在也许我知道为什么了。

我一直在努力解决这个问题有一段时间了,我担心我对WordPress的理解不够。。。我一直在尝试的是:

向URL添加查询字符串:?onepageprint=1(起作用)

  • 注册“禁用分页”函数(起作用)
  • 测试查询字符串并有条件调用该函数(不起作用)
  • 我认为我面临的问题是,分页在WordPress过程中设置得太早,在它到达我可以从URL中获取查询字符串并对其进行测试的位置之前(而不需要对核心进行黑客攻击!)

    所以有两个问题和一个想法:

    我这样做对吗redirect_canonical (我承认我一点也不理解!)我已经处理了这方面的无数变化-这是最新的尝试(尽管可能有一些重复)。设置查询字符串并将其从URL中取出似乎可以很好地工作,并且禁用分页的功能也可以工作。。。但当它就位时,它总是工作(或从不工作),我找不到任何有条件地打开和关闭它的方法:

    在函数中。php:

    /* register custom query var (from URL) to toggle pagination */
    function jr_add_query_vars_filter( $displayvars ){
        $displayvars[] = "onepageprint";
        return $displayvars;
    }
    add_filter( \'query_vars\', \'jr_add_query_vars_filter\' );
    get_query_var( \'onepageprint\', 0 );
    
    /* disable pagination conditionally on custom query var setting (from URL query string) 
     * NOT WORKING YET */
    add_Action(\'init\', \'remove_pagination\');
    
    function remove_pagination() {
    if ( ! $onepageprint == 1 )
        return; // stop here.
        /* Disable content pagination, based on
         * https://wp-types.com/forums/topic/remove-pagination-from-archive-view/ */
        add_action(\'parse_query\', \'no_nopaging\');
        function no_nopaging($query) {
        $query->set(\'nopaging\', 1);
        }
    }
    
    在页面模板中(许多尝试之一)——我想这或类似的东西需要在两个搜索中都使用。php和归档。php:

    // call no-pagination function - DIDN\'T WORK
    if ( $onepageprint == 1 ) {
    no_nopaging($query);
    }
    
    我希望这有点道理,如果您还需要我的配置来回答,请告诉我。不幸的是,我不能发布到实际网站的链接,因为这是一个私人研究网站,而且上面的一切都是机密的!

    即使是一些更好的方法也很好。非常感谢。

    [编辑:发布后标题改善!]

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

    我认为应该通过pre_get_posts:

    function wpse_254661_remove_pagination( $query ) {
        if ( $query->is_main_query() &&  get_query_var( \'onepageprint\', 0 ) ) {
            $query->query_vars[\'nopaging\'] = 1;
            $query->query_vars[\'posts_per_page\'] = -1;
        }
    }
    add_action( \'pre_get_posts\', \'wpse_254661_remove_pagination\' );
    
    这样,您就可以在获取查询之前修改查询,并将查询对象通过钩子传递到函数中。还有一个只影响主查询的检查。