へっぽこ、ミニマル、DIY
2017-08-23 footfoot (9)

【PluXml】タグ名に日本語を使うとURLが生成されないバグを解消

PluXmlにはタグ名に日本語を使うと日本語部分のURLが生成されないバグがあるので、解決方法を書いときます。試したPluXmlのバージョンは5.5と5.6。

参考元のフォーラム

1. タグ名に英数字を混ぜる

一番簡単な方法はタグ名に英数字を混ぜることです。日本語に混ぜてもいいので英数字を入れとけばURLは生成されます。

2. class.plx.utils.phpのtitle2url関数を編集

こちらはPluXmlのコアをいじる方法。2通りあります。core/lib/class.plx.utils.phpの341行目にtitle2urlという関数があります。これがタイトル(タグ名)をURLに変換する関数なので編集します。↓元の状態。

	public static function title2url($str) {

		$str = strtolower(plxUtils::removeAccents($str,PLX_CHARSET));
		$str = preg_replace('/[^[:alnum:]]+/',' ',$str);
		return strtr(trim($str), ' ', '-');
	}

方法1

こっちはtitle2urlに3行追加して手動でタグ名とURLを追加していく方法。$aにタグ名の日本語を、$bにはそのURLをカンマで区切って入力。次の行で$aを$bに変えてるという感じ。日本語とURLのarrayの順番は同じにしないとめちゃくちゃになるので注意。

	public static function title2url($str) {

		$str = strtolower(plxUtils::removeAccents($str,PLX_CHARSET));
		$a = array('写真','100均','スマホゲーム'); 
		$b = array('picture','100kin','mobile-game');
		$str = str_replace($a, $b, $str); 
		$str = preg_replace('/[^[:alnum:]]+/',' ',$str);
		return strtr(trim($str), ' ', '-');
	}

これで$aのタグ名の場合は$bのURLにすることができます。

思い通りのURLにできますが、新しく日本語のタグを作る場合、また$aと$bに値を入れなきゃいけません。

方法2

こちらはコメントで教えていただいた、title2urlに一行追加して日本語タグ名を自動でURLにする方法。

	public static function title2url($str) {

		$str = urlencode($str);
		$str = strtolower(plxUtils::removeAccents($str,PLX_CHARSET));
		$str = preg_replace('/[^[:alnum:]]+/',' ',$str);
		return strtr(trim($str), ' ', '-');
	}

こちらは自動でURLが生成されるので手間がかかりませんが、URLが記号的になります。
タグ名「東京」の例 : xxx.com/index.php?tag/e6-9d-b1-e4-ba-ac

英字は混ざってても使えます。

どちらかの方法で対応はできますが、タグもカテゴリーのように管理画面でタグ名やURLを編集できるようになれば一番いいので、次のアップデートで改善に期待ですね。

PluXml なし
シェア

9 コメント

#1  - たなか :

たぶん、strtolowerをurlencodeになおせば、大丈夫かも。テスト用のブログをつくって、ためしてみるといいですね。strtolowerというのは、大文字を小文字に変換させる。urlencodeは、日本語とかの文字をurlに使える文字に変換。で、クリックしても大丈夫になるはずです。

返信
#2  - footfoot :

たなかさん、情報ありがとうございます。
テスト用ブログで試しにtitle2urlのstrtolowerをurlencodeに変えてみたのですが、日本語のタグ名でURLは生成されましたがURLをクリックすると「エラー ページが見つかりません」となって表示されませんでした。
strtolowerでは問題なかった英数のタグ名もエラーになったので、仕様的にurlencodeは使えないんでしょうかね。
PHPは素人(というかプログラミングはかじった程度)なので何がどうなってるのか分かりませんけど。

返信
#3  - たなか :

こちらもやってみて、plxUtils::removeAccentsで、文字数を削っているので、これもはずしたら、おかしくなりましたね。なので、素朴にマルチバイトにプラグインで追加すれば、とかは思いますが、とりあえず、footfootさんの方法がベストでしょう。

返信
#4  - たなか :

マルチバイトのプラグインを入れてみたのですが、どうも、うまくいきません。うまくいけば、たぶん、大丈夫な感じなんですけどね。設定が保存できないで、いきずまりました。URLを削らないとか説明されているみたいですし。では。

返信
#5  - たなか :

ゼロから英語でインストールして、あれころ、面倒な設定をしたら、マルチ言語になりましたけど、思っているものとは、ぜんぜん違っていました。あれは、どうも、一つのブログで、英語とフランス語のページをリンクしあうもののようです。あくまで、欧米向けとしか、まだ、つくられていないようです。URL関係を、全部書き換えればいいのでしょうけど、ちょっと、無理があるし、しない方がいいですね。なので、footfootさんの方法か、ローマ字でタグをつくるということでしょうね。いずれ、本家で、中国や日本の利用が増えれば、要望がわくと思うので、そうなると改良されると思います。

返信
#6  - footfoot :

マルチ言語のプラグインはこのウェブコミックを配信してるサイトで使ってますね。
https://www.peppercarrot.com/
手動で翻訳してるのかな?にしてもすごいサイト。

返信
#7  - たなか :

できたみたいです!

public static function title2url($str) {

$str=urlencode($str);

$str = strtolower(plxUtils::removeAccents($str,PLX_CHARSET));
$str = preg_replace('/[^[:alnum:]]+/',' ',$str);
return strtr(trim($str), ' ', '-');
}

strtolowerの行の前に、上記のように追加すればいいみたいです。
そちらでテストしてみられて、動くようなら、とりあえず完成ですね。
そうなったら、タグが自由に使えるようになります。

日本語だと、全部削ってしまうので、日本語を最初にURL語にしてしまえば、うまくファイル名を作れるようです。ただ、リンクが、記号の羅列になりますが。便利さからいえば、改良でしょう。(ただ、私は、タグ使わないのですが・・・)

返信
#8  - footfoot :

おお!
こちらでも試してみたましたが、このコードだと日本語のタグ名でURLが生成されてリンク先の結果も正常ですね。
後で整理して記事にも追記しときます。
たなかさん、お疲れ様でした〜

返信
#9  - たなか :

あとわかったことですが、改良せず。タグやタイトルをつくるとき、

3月[sangatu] とか、日本語と英字をまぜれば、うまくタグがリンクされるはずです。こちらの方が、URLは綺麗だと思います。素朴に、英字だけをさがしているようです。タイトルの場合は、英字がなければ、勝手な英字なタイトルに変換していて、タグの方は、しないってことみたいです。ただ、タイトルやタグには3月[sangatu] と表示されてurlに、ただ、sangatuとついているはずです。

返信

コメントを書く

2番目のアルファベットを入力してください znervk?

このコメントのRSS