@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] );
}
最合适的回答,由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\' );
这将在重写规则堆栈的最顶端注册一条规则,该规则将捕获表单的URL
suche/<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\' );
这应该足以实现您想要的行为。