我希望我的帖子链接看起来像/%post\\u id62%\\u%postname%/其中%post\\u id62%是base62编码中的帖子ID(例如。http://example.com/y9Rlf_test/) 我的短链接由/%post\\u id62%组成(例如。http://example.com/y9Rlf). 这是我到目前为止(在我的functions.php
) 这显然不起作用:
add_action( \'init\', \'yoyo_init\' );
function yoyo_init() {
add_rewrite_tag( \'%post_id62%\', \'([A-Za-z0-9]+)\' );
}
add_action(\'generate_rewrite_rules\',\'yoyo_generate_rewrite_rules\');
function yoyo_generate_rewrite_rules($yoyo_rewrite) {
global $wp_rewrite;
$new_rules[\'/([0-9A-Za-z]+)/?$\'] = \'index.php?p=\' .
base622dec($wp_rewrite->preg_index(1)); // DOESNT WORK OF COURSE (executed only once when rewrite_rules are generated)
$wp_rewrite->rules = array_merge($new_rules, $wp_rewrite->rules);
}
add_filter( \'post_link\', \'yoyo_post_link\', 10, 2 );
function yoyo_post_link( $permalink, $post ) {
if ( false !== strpos( $permalink, \'%post_id62%\' ) ) {
$post_id62 = dec2base62( $post->ID );
$permalink = str_replace( \'%post_id62%\', $post_id62, $permalink );
}
return $permalink;
}
add_filter(\'pre_get_shortlink\', \'yoyo_custom_shortlink\', 10, 4);
function yoyo_custom_shortlink($false, $post_id, $context, $allow_slugs) {
global $wp_query;
if($post_id or ($context == \'query\' and $post_id = $wp_query->get_queried_object_id())) {
return home_url(\'/\' . dec2base62($post_id));
}
return false;
}
function dec2base62($number) {
$digits = \'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\'; $string = \'\'; while($number > 0) { $string = $digits[$number % 62] . $string; $number = floor($number / 62); }
return $string;
}
function base622dec($string) {
$digits = \'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\'; $number = 0; while(strlen($string) and ($number *= 62 or strlen($string))) { $number += strpos($digits, $string[0]); $string = substr($string, 1); }
return $number;
}
你知道怎么解决这个问题吗?当创建了另一篇具有相同标题的文章时,避免使用-N slug后缀的额外点数(在将链接结构设置为“/%post\\u id62%\\u%postname%/”时,实际上可以避免使用该后缀,但为了具有短链接功能,我想应该是“/%post\\u id62%”;cf。
Turn off %postname% auto-incrementing?)!谢谢
最合适的回答,由SO网友:Jan Fabry 整理而成
您只在最后一步中犯了一个错误,将base62编码的ID转换回十进制ID。您不应该通过更改重写规则来实现这一点,因为它们只是模式,而不是每个帖子的实际规则。
您需要的是获取传入URL,让WordPress使用重写规则对其进行解析,但在将其传递给查询引擎之前,请检查post_id62
变量并设置实际p
(post id)基于它的变量。您可以在request
过滤器,其中is applied in WP::parse_request()
.
add_action( \'request\', \'wpse22253_request\' );
function wpse22253_request( $query_vars )
{
if ( array_key_exists( \'post_id62\', $query_vars ) ) {
$query_vars[\'p\'] = base622dec( $query_vars[\'post_id62\'] );
}
return $query_vars;
}
然而,这并不能解决
postname-N
问题WordPress仍将呼叫
wp_unique_post_slug
在
post_name
字段,以及
post_name
将不包括
post_id62
部分(因为数据库独立于重写规则)。正如Mike在
the followup comments to his answer, 您应该想办法将
post_id62
中的一部分
post_name
字段,或者(这可能是更好的方法)忽略
%postname%
在URL中加入一部分,只需在末尾添加一个带数字后缀的postname。
你也会遇到短链接的问题,因为它们的格式(任何字母或数字)与页面相同。是/banana/
标题为“香蕉”的页面或指向ID为34440682410的帖子的短链接banana
在base-62编码中?