WordPress需求:唯一且固定长度的网址

2023年7月27日 | 分类: 【源码】

参考:https://beltxman.com/2929.html
参考:https://wordpress.stackexchange.com/questions/73983/how-to-automatically-generate-a-unique-random-slug

对于wordpress,它自带的文章url固定连接可选样式有很多,带日期的,文章名,文章ID,但如果想要每一篇文章一个随机字符串的slug(别名,显示在url后面),就要自己动手了,如果你不理解那是怎样的,看看简书的文章详情页的url就知道了。

主题的function.php中加入下面的代码即可:

add_filter( 'wp_unique_post_slug', 'unique_slug_so_custmoer', 10, 6 );

function unique_slug_so_custmoer( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) {
    $real_status = get_post_status($post_ID); 
    if ($post_type == 'post' && in_array( $real_status, array( 'draft', 'pending', 'auto-draft' )) && empty(get_post_meta($post_ID,'unique_slug', true))) {
        $new_slug = so_custmoer_unique_post_slug('guid');
        add_post_meta($post_ID, 'unique_slug', 1, true);
        return $new_slug;
    } else {
        return $slug;
    }
}

# From: https://stackoverflow.com
function so_custmoer_unique_post_slug($col,$table='wp_posts'){
    global $wpdb;

    // 一些在url中不好看的字符比如pqjyil0,在这里去除了
    $str = 'abcdefhkmnorstuvwwxz2345678923456789234567892345678923456789';
    $alphabet = str_split($str);

    $already_exists = true;

    do {
        $guidchr = array();
        for ($i=0; $i<32; $i++)
            $guidchr[] = $alphabet[array_rand( $alphabet )];
        $guid = sprintf( "%s", implode("", array_slice($guidchr, 0, 12, true)) );
        // check that GUID is unique
        $already_exists = (boolean) $wpdb->get_var("SELECT COUNT($col) as the_amount FROM $table WHERE $col = '$guid'");
    } while ( true == $already_exists );

    return $guid;

}

主要是利用了wordpress的内置函数wp_unique_post_slug来做文章。在wordpress尝试自动生成别名时,我们自定义了它,的时候会生成一个12位长度的随机字符串,作为这篇文章的别名,而且再你再次编辑,或者把文章变成草稿,编辑之后再发布,不会再生成新的slug,避免同一篇文章多次生成。

参考:https://zhuanlan.zhihu.com/p/183863245

短网址的一般结构,比如新浪的 SwuTjn,其中后端的一段6位字符串,就是用来唯一标记一条记录的ID。那么,使用什么算法,可以生成一条无重复的ID呢?

使用通用的做法,使用 0-9 A-Z a-z 一共62个字符,我们看使用hash键位数分别有多少种排列组合情况。

  • 1位:pow(62,1) = 62 种
  • 2位:pow(62,2) = 3844 种
  • 3位:pow(62,3) = 238328 种
  • 4位:pow(62,4) = 14776336 种
  • 5位:pow(62,5) = 916132832 种
  • 6位:pow(62,6) = 56800235584 种

一般情况下,6个字符,就足够使用了,共计568亿种可能。