对于wordpress,它自带的文章url固定连接可选样式有很多,带日期的,文章名,文章ID,但是自己输入难免麻烦,文章ID已经不合符理想了,现在Wordpress历史版本,ID数字不太好。
但如果想要每一篇文章一个随机字符串的slug(别名,显示在url后面),就要自己动手了,如果你不理解那是怎样的,看看简书的文章详情页的url就知道了。
function.php中加入下面的代码即可:
add_filter( 'wp_unique_post_slug', 'unique_slug_so_customer', 10, 6 ); function unique_slug_so_customer( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) { if($post_type != 'post' || get_post_meta($post_ID,'unique_slug', true) ==1){ if(!empty($slug)){ return $slug; } }; add_post_meta($post_ID, 'unique_slug', 1, true); $newSlug = auto_unique_post_slug('guid'); wp_update_post(array('post_name' => $newSlug )); } function auto_unique_post_slug($col,$table='wp_posts'){ //上面的参数wp_posts为自己的表名,如果不是默认,改为自己的 global $wpdb; // WordPress slug 更新后大写会自动转成小写,所以不建议用大写字母 $str = 'abcdefghijklmnopqrstuvwxyz0123456789'; $alphabet = str_split($str); $already_exists = true; do { $guidchr = array(); //下面的参数36为上面 $str 的字符串数量 for ($i=0; $i<36; $i++) $guidchr[] = $alphabet[array_rand( $alphabet )]; //yl是前缀,可以改成自己的,下面的参数10为生成的字符串位数 $guid = sprintf( "yl%s", implode("", array_slice($guidchr, 0, 10, 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; }
参考文章:
https://www.jianshu.com/p/fdc62f68c48e
更新#2023.12.17
上面这段代码,好像会有一些问题,如果觉得不好用,可以参考下面这段代码,auto_unique_post_slug函数不变,将unique_slug_so_customer函数及其挂钩换成下面这段即可:
add_filter('name_save_pre', function ($slug) { // 检查是否是文章发布操作 if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } // 手动编辑时,不自动转换 if ($slug && $slug !== '') { return $slug; } // 替换文章标题 $slug = auto_unique_post_slug('guid'); return $slug; }, 10, 1);
这段代码的好处就是不用判定更新文章或者已经有slug的文章,而且也不需要添加自定义栏目,减少数据库数据,缺点就是自动保存时生成的slug与发布文章时不同,主要是因为自动保存时生成的slug没有被写入数据库,当被写入数据库后就不会有变化了。
此段代码参考wenprise-pinyin-slug插件
声明:本文采用 BY-NC-SA 协议进行授权,如无注明均为原创,转载请注明转自 你好!刘
本文地址:WordPress文章别名slug自动生成随机字符串
本文地址:WordPress文章别名slug自动生成随机字符串
发表评论