带有Base62编码帖子ID的自定义固定链接/短链接

时间:2011-07-07 作者:user6254

我希望我的帖子链接看起来像/%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?)!谢谢

1 个回复
最合适的回答,由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_slugpost_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编码中?

结束

相关推荐

URLs of plugin resources?

我正在尝试将插件的脚本和css文件添加到管理标头中。是否有类似的功能get_bloginfo(\'url\') 我可以使用它来正确引用文件,而不必硬编码url?