重写搜索和分页库

时间:2012-11-07 作者:mathiregister

在尝试了几个星期之后,我放弃了大部分函数和尝试,只在函数下面留下分页函数。phh文件:

/**
 * Pagination links for search and archives
 */

function get_pagination_links( $type = \'plain\', $endsize = 1, $midsize = 1 ) {
    global $wp_query, $wp_rewrite;
    $wp_query->query_vars[\'paged\'] > 1 ? $current = $wp_query->query_vars[\'paged\'] : $current = 1;

    // Sanitize input argument values
    if ( ! in_array( $type, array( \'plain\', \'list\', \'array\' ) ) ) $type = \'plain\';
    $endsize = (int) $endsize;
    $midsize = (int) $midsize;

    // Setup argument array for paginate_links()
    $pagination = array(
        \'base\'          => @add_query_arg(\'paged\',\'%#%\'),
        \'total\'         => $wp_query->max_num_pages,
        \'current\'       => $current,
        \'show_all\'      => false,
        \'end_size\'      => $endsize,
        \'mid_size\'      => $midsize,
        \'type\'          => $type,
        \'prev_next\'     => false,
        \'paged\'         => get_query_var( \'paged\' )
    );

    return paginate_links( $pagination );
}
我的搜索表单如下所示:

<form class="search-form" action="<?php echo home_url( \'/\' ); ?>" method="get">
    <fieldset>
        <div class="input-inside-label">
            <label for="s">Suchen …</label>
            <input type="text" name="s" class="s" value="<?php the_search_query(); ?>" />
        </div>
        <button type="submit" class="search-button">Suchen</button>
    </fieldset>
</form>
What I wanna do:我想重写标准/?s= 德语单词/suche

因此,在搜索“测试”时,我希望我的URL如下所示:www.mydomain.com/suche/test (而不是/?s=test)

此外,我还想重写分页……所以当搜索“test”并单击page 2 我希望地址像这样…

www.mydomain.com/suche/test/seite/2

所以本质上我想重写/?s= 德语单词suche (用于搜索)和重写&paged=2 德语单词seite (第页)

正如您所看到的,我现在的代码中只有上面的分页函数,因为我删除了所有其他的试用版-我似乎无法让它工作。

有什么好主意吗?我正在使用最新的wordpress版本,希望找到一个基于过滤器的解决方案。我不希望任何JS与搜索表单交互。

提前谢谢你

1 个回复
SO网友:sanchothefat

实现目标有三个步骤。

1-重写规则-wordpress需要知道要查找什么以及映射到什么

add_rewrite_rule( \'suche/([^/]+)/?$\', \'index.php?s=$matches[1]\', \'top\' );
add_rewrite_rule( \'suche/([^/]+)(/seite/(\\d+))/?$\', \'index.php?s=$matches[1]&paged=$matches[3]\', \'top\' );
以上内容将直接重写规则添加到重写规则数组中,以便任何人访问URL时,如/suche/apfel/ 内部翻译为index.php?s=apfel.

2-将搜索重定向到我们的新结构

// redirect immediately
if ( isset( $_GET[ \'s\' ] ) ) {
    $location = \'/suche/\' . $_GET[ \'s\' ];
    if ( isset( $_GET[ \'paged\' ] ) && $_GET[ \'paged\' ] )
        $location .= \'/seite/\' . $_GET[ \'paged\' ];
    wp_redirect( trailingslashit( home_url( $location ) ), 301 );
    exit;
}
将此放置在functions.php. 一旦检测到搜索请求,wordpress将重定向到nice搜索URL,浏览器将记住重定向,因为301 我们要传递到的状态wp_redirect().

我们正在此处构建用于搜索的替换URL,如果$paged 参数存在,我们也添加了该参数。

3-创建分页链接

function pagination_links( $type = \'plain\', $endsize = 1, $midsize = 1 ) {
    global $wp_query, $wp_rewrite;
    $wp_query->query_vars[\'paged\'] > 1 ? $current = $wp_query->query_vars[\'paged\'] : $current = 1;

    // Sanitize input argument values
    if ( ! in_array( $type, array( \'plain\', \'list\', \'array\' ) ) ) $type = \'plain\';
    $endsize = (int) $endsize;
    $midsize = (int) $midsize;

    // Setup argument array for paginate_links()
    $pagination = array(
        \'base\'          => home_url( \'/suche/\' . get_search_query() . \'%_%\' ),
        \'format\'        => \'/seite/%#%/\', // ?page=%#% : %#% is replaced by the page number
        \'total\'         => $wp_query->max_num_pages,
        \'current\'       => $current,
        \'show_all\'      => false,
        \'end_size\'      => $endsize,
        \'mid_size\'      => $midsize,
        \'type\'          => $type,
        \'prev_next\'     => false
    );

    return paginate_links( $pagination );
}
此函数中唯一缺少的是使用修改后的formatbase 参数创建当前搜索的nice URL基和nice URL页参数。

这应该可以满足你的需要。您可以更深入地挖掘并重新映射更多URL,以使用其他过滤器进行翻译,但有很多,因此这是一个很好的起点!

结束

相关推荐

从子主题函数声明父主题中包含的类的实例。php

Please note this is all \"working\" - the question is about the best practice and to try and work out why I need to include the PHP file which contains the class in two places for it to work correctly.我正在研究一个简单的父主题,以加快我自己的开发周期,并且已经达到了测试一个简单的子主题的程度。我知道func