(補充說明:此bug已經在4.0.1版修正了)

111
在後台撰寫文章的時候,若是使用自定網址的功能,系統一定會幫你產生一個『固定網址』,有時候還會出現亂碼。

 

這段程式是在檔案 /wp-admin/includes/post.php 裡面,請找到一個 function 名稱為 get_sample_permalink_html。

該判斷字元的程式片段如下

if ( function_exists( 'mb_strlen' ) && mb_strlen( $post_name ) > 30 ) { //第一判斷式
  $post_name_abridged = mb_substr( $post_name, 0, 14 ) . '…' . mb_substr( $post_name, -14 );
} elseif ( strlen( $post_name ) > 30 ) {  // 第二判斷式
  $post_name_abridged = substr( $post_name, 0, 14 ) . '…' . substr( $post_name, -14 );
} else {
  $post_name_abridged = $post_name;
}

 

說明

這一段判斷其實可有可無,因為他並不會影響網址的自定結果,只是顯示在文章編輯標題區底下,會呈現一個亂碼字元,看起來很礙眼。

一共有兩個判斷條件,首先是判斷主機是否支援 mb_strlen 函數,這是個計算字串的長度,對於 utf-8 字元,他也只算一個字元。因此第一行判斷是,若標題超過30個字元就進行擷取字串前14個字、後14個字。舉例來說『我的文章標題在wordpress 中可以算是宇宙無敵非常長的字串。』,底下就顯示為『我的文章標題在wordpre…中可以算是宇宙無敵非常長的字』。

但是我們標題命名通常沒有那麼長,所以一般都會進入第二個判斷式去,出錯就在這裡。strlen 也是用來計算字串長度,不過他計算每一個中文字是3個字元組,因此 strlen( $post_name ) > 30 表示中文標題超過10個字就會進入此判斷式,進行截字的動作。問題就出現這段截字的語法,substr( $post_name, 0, 14 ),取14個字元。因為substr 也是將一個中文字算3個字元組,所以這樣子就會將單一個中文字硬生生切斷。在中英文混和的字串中,用 substr 來截字非常不好用。

修正方式

直接拿掉第二判斷式

if ( function_exists( 'mb_strlen' ) && mb_strlen( $post_name ) > 30 ) { 
  $post_name_abridged = mb_substr( $post_name, 0, 14 ) . '…' . mb_substr( $post_name, -14 );
} else {
  $post_name_abridged = $post_name;
}

 

或是不用判斷了

$post_name_abridged = $post_name;

 

但以上方式都會因為系統更新,就蓋過我們的修正地方,所以最好的方式是採用 hook 寫在佈景的 functions.php

function custom_get_sample_permalink_html( $return, $id, $new_title, $new_slug )
{
  // 將原本的 get_sample_permalink_html 函數,整段放入這裡再改寫
}
add_filter( 'get_sample_permalink_html', 'custom_get_sample_permalink_html', 15, 4 );