用于搜索和分页的自定义固定链接

时间:2012-09-04 作者:mathiregister

@Chip Bennet在前面的一个问题中帮了我,并发布了他的整个分页功能。这个函数对我来说非常好,但我想用德语定制permalinks。

/**
 * Paginate Archive Index Page Links
 */
function oenology_get_paginate_archive_page_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\',\'%#%\'),
        \'format\' => \'\',
        \'total\' => $wp_query->max_num_pages,
        \'current\' => $current,
        \'show_all\' => false,
        \'end_size\' => $endsize,
        \'mid_size\' => $midsize,
        \'type\' => $type,
        \'prev_text\' => \'<<\',
        \'next_text\' => \'>>\'
    );

    if( $wp_rewrite->using_permalinks() )
        $pagination[\'base\'] = user_trailingslashit( trailingslashit( remove_query_arg( \'s\', get_pagenum_link( 1 ) ) ) . \'page/%#%/\', \'paged\' );

    if( !empty($wp_query->query_vars[\'s\']) )
        $pagination[\'add_args\'] = array( \'s\' => get_query_var( \'s\' ) );

    return paginate_links( $pagination );
}
我在我的search.php 像这样的模板。

<div class="pagination">
    <?php echo oenology_get_paginate_archive_page_links(); ?>
</div>
如果我在搜索栏中搜索,结果页面的url如下所示

mysite.com/?s=term

我想要德国人suche (表示“搜索”)而不是…

mysite.com/suche/term

第二位…当点击分页的第2页时,url当前如下所示…

mysite.com/page/2/?s=term

我想要德语单词德语单词seite (用于“第页”)。也许甚至像这样…

mysite.com/suche/term/seite/2

通过@Chip提供的这个函数,这有可能吗?我似乎找不到有效的解决办法。

提前谢谢你。我非常感谢你的帮助。

<小时>

UPDATE

function oenology_get_paginate_archive_page_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\',\'%#%\'),
        \'format\' => \'?paged=%#%\',
        \'total\' => $wp_query->max_num_pages,
        \'current\' => $current,
        \'show_all\' => false,
        \'end_size\' => $endsize,
        \'mid_size\' => $midsize,
        \'type\' => $type,
        \'prev_next\'    => false
    );

    if ( $wp_rewrite->using_permalinks() )
        $pagination[\'base\'] = user_trailingslashit( trailingslashit( remove_query_arg( \'s\', get_pagenum_link( 1 ) ) ) . \'seite/%#%/\', \'paged\' );

    /*if ( !empty($wp_query->query_vars[\'s\']) )
            $pagination[\'add_args\'] = array( \'s\' => get_query_var( \'s\' ) );*/

    return paginate_links( $pagination );
}

/**
 * Change search- & paginationbase
 */

add_action( \'generate_rewrite_rules\', \'wr_generate_rewrite_rules\' );

function wr_generate_rewrite_rules( $rewrite ) {
    $rewrite->rules = array_merge( array(
         \'suche/([^/]+)(?:/seite/(\\d+))?/?\' => \'index.php?s=\'.$rewrite->preg_index(1).\'&paged=\'.$rewrite->preg_index(2)
    ), $rewrite->rules );
}

add_filter( \'get_pagenum_link\', \'wr_search_pagenum_link\' );

function wr_search_pagenum_link( $link ) { 
    if ( !is_search() )
        return $link;

    // Attempt to parse the page number from the provided URL
    if ( !preg_match( \'#/page/(\\d+)#\', $link, $matches ) )
        return $link;

    // Return a re-formed URL
    return home_url( \'/suche/\' . urlencode( get_query_var( \'s\' ) ) . \'/seite/\' . $matches[0] );
}

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

我认为GET参数格式仍然用于搜索的主要原因是,搜索表单是常规的GET表单,在提交表单URL时会附加GET参数。

但使用自定义URL捕获搜索的另一个问题是,搜索词可以是任意文本,包括斜杠等,当烘焙到URL中时可能看起来很难看。

假设我们使用了您想要的搜索URL格式:

mysite.com/suche/term

我搜索了这个词"belegte brot", 带引号。我们以URL结束:

mysite.com/suche/%22belegte+brot%22

这并不十分漂亮,对于任何其他特殊角色都需要进行类似的转义。

尽管如此,仍然有可能实现您正在寻找的permalink结构。

Step 1: 寄存器permalink结构

钩住generate_rewrite_rules 操作,以添加新模式:

function my_generate_rewrite_rules( $rewrite ) {
    $rewrite->rules = array_merge( array(
        \'suche/([^/]+)(?:/seite/(\\d+))?/?\' => \'index.php?s=\'.$rewrite->preg_index(1).\'&paged=\'.$rewrite->preg_index(2)
    ), $rewrite->rules );
}
add_action( \'generate_rewrite_rules\', \'my_generate_rewrite_rules\' );
这将在重写规则堆栈的最顶端注册一条规则,该规则将捕获表单的URLsuche/<term>, suche/<term>/, seite/<term>/seite/<page>seite/<term>/seite/<page>/ 并将其转换为查询变量s=<term>paged=<page>

Step 1a: 通过访问Settings > Permalinks 页面位于WP管理区域。

Step 2: 在搜索表单中插入JavaScript,该表单将重定向到上述表单的URL,而不是使用GET参数提交表单:

<form id="search" action="<?php echo home_url( \'/suche/\' ); ?>">
    <input name="s" />
</form>
<script>
    jQuery(\'#search\').submit(function(ev) {
        ev.preventDefault();
        location.href = jQuery(this).attr(\'action\') + escape( jQuery(\'#search\').find(\'[name="s"]\').val() );
    });
</script>
此示例显示一个窗体submit 事件被捕获并取消,而不是更新URL。NB: 这是未经测试的。

Step 3: 在上添加挂钩get_pagenum_link 筛选以形成预期的URL:

function my_search_pagenum_link( $link ) { 
    if( !is_search() )
        return $link;    // Do nothing unless on a search

    // Attempt to parse the page number from the provided URL
    if( !preg_match( \'#/page/(\\d+)#\', $link, $matches ) )
        return $link;

    // Return a re-formed URL
    return home_url( \'/suche/\' . urlencode( get_query_var( \'s\' ) ) . \'/seite/\' . $matches[0] );
}
add_filter( \'get_pagenum_link\', \'my_search_pagenum_link\' );
这应该足以实现您想要的行为。

结束

相关推荐

Gallery Pagination by Row

我在以下位置创建了一个图片库:http://ellenandjosh.com/?page_id=5. 目前,我有一个循环,在一定数量的图像之后显示分页:http://pastebin.com/N6nRRUei.通常情况下,这很好。。。但通常我没有不同宽度的图像。WordPress按高度裁剪图像,宽度可变。我想做的是在三行图像之后,然后添加分页按钮。。。而不是在一定数量的图像后显示分页按钮。。。这可能吗?第1页还可以,虽然底部行中可能会有更多图像-第2页只有两行,第3页第三行只有一个图像-尽管有更多图像。。