サポート » 開発版 » post_class() が不正な CSS クラス名を生成

  • モデレーター IKEDA Yuriko

    (@lilyfan)


    2.7 から導入される予定の post_class() 関数がとんでもない仕様であることが判明しました。

    新機能として、投稿に割り当てられるカテゴリー/タグ名をもとにした CSS クラス名が付与されます。これによって、カテゴリーごとにデザインを変更するといったことが自在になります。
    しかし、CSS クラス名はカテゴリー/タグスラッグをもとに生成されるため、日本語名だと、不正な CSS クラス名になってしまいます。

    例: 「携帯」カテゴリー → category-%e6%90%ba%e5%b8%af となる

    しかし、CSS のクラス名は、[-_a-zA-Z0-9] と、ASCII 以外の Unicode 文字しか認められていません。% 記号は不可です。これでは CSS 違反となってしまいます。

    とりあえずチケット8446を発行しました。ただ、妥当な解決案としては「スラッグではなくカテゴリー ID を使う」という方法しかなく、これは重大な機能変更となるため、フォーラムでも報告させていただきます。(バックスラッシュでエスケープするのは可能ですが、ユーザーから見ると使いにくいですよね)

    これの修正が 2.8 とかに先送りされたりするようでは、「WordPress は I18N 軽視がひどい」ということで、真剣に「WordPress ME 復活」を検討せねばならないかもしれません……。(とはいえ、自作プラグインのメンテナンスがおいついてない現状で ME 2.7 を作るなんて時間がありませんが 😉

7件の返信を表示中 - 16 - 22件目 (全22件中)
  • i18n以前な気が。割と安直に実装してその結果をあんまり考えてないっぽい感じで嫌ですねぇ。

    よって、わたしは slug を urldecode() して、NMTOKENS に使えない文字を削除するのが簡単で安全だろうと思ってます。

    なるほど、たしかにそうですね。
    slugって名前からの変換だけでなくてユーザが編集できますしね。

    http://www.atmarkit.co.jp/fxml/rensai/w3cread35/w3cread35_2.html
    を読んでいると pregのUTF-8モードの/p{xx}とかを使うと出来そうな感じが…

    モデレーター IKEDA Yuriko

    (@lilyfan)

    i18n以前な気が。割と安直に実装してその結果をあんまり考えてないっぽい感じで嫌ですねぇ。

    まあ、オープンソースなので、安直な実装でも、他の人がすぐ指摘すればよいわけですが、WordPress はまだそのレベルに達してない感じでしょうか。
    今回は華華しく新機能として告知されたので、「じゃあ日本語カテゴリーではどうなるの?」という疑問が真っ先に出てきてソース確認して問題を見つけましたが、こっそり機能追加されていたら見逃していました。

    を読んでいると pregのUTF-8モードの/p{xx}とかを使うと出来そうな感じが…

    わたしもこれを検討したのですが、UTF-8 モードは「あまり速くない」らしいことと、PHP 4.3.x, 5.0.x で使えない (4.4.0 および 5.1.0 以降のみ対応) というのが難点でしょうか。

    他でやんわりと私にはまだ書き込みの技量が少ないと注意されているので積極的に書き込みしないようにしています

    たまたまロードマップでどれ位の進行か確認した時
    ついでに8446はどんコメント付いているか確認したら数時間前に2.8に先送りがされていた、上記もあるから必要なら他の方が何かするだろうと放置(WPのRCから正式に変わるのは物凄いチケット先送りで締め切り守る、のがいいのか?)

    しかし上記(tai さん、tenpura さん、Nao さん)の議論が完了してあれば先送り報告をここに投稿したと思うけど
    それか議論はこっちでやっても、本家(チケット)に仕込みでも良いから?必要性の議論を見せないとI18N を理解していない者に先送りされるのでは

    —–
    スクリプト(プログラム)の変更を伴う提案に対して
    本家にチケット流してと書き込まれるより
    FAQの蓄積が無いから(他からの乗り入れ者には”Tracへも投げてもらえると”手順が???かも知れない)

    チケットの切り方は
    言語は英語で記述する必要があります
    http://wordpress.org/ のRegisterでユーザ登録し
    http://trac.wordpress.org/ のlog inで上記ユーザ、パスワードで入り…

    モデレーター IKEDA Yuriko

    (@lilyfan)

    他でやんわりと私にはまだ書き込みの技量が少ないと注意されているので積極的に書き込みしないようにしています

    書いた本人です;-) 「やんわりと」どころか、かなりきつい指摘のつもりでした。気に障ったのでしたら申し訳ありません。

    ただ、こういう技術的なフォーラムは文字だけでコミュニケーションするため、できるだけ「日本語として意味が分かる文章を書く」「簡潔で読み違いのない内容とする」ことが望まれます。まして、質問への回答者として活動をされるならば、より高いレベルでそれが求められます。質問をしたり、バグ・要望の投稿をされるのであれば、多少文章が不自然であっても回答者がフォローすればいいのですが、回答者はそうはいきません。

    three-eye さんが日本語のネイティブ話者でないならば、多少不自然な日本語になってても仕方ないとは思いますが、それならば、フォーラムの回答者として活躍するのは無理があります。フォーラムの回答者として活動されたいのであれば、まずは正確な日本語を学習されるようお願いいたします。

    たまたまロードマップでどれ位の進行か確認した時
    ついでに8446はどんコメント付いているか確認したら数時間前に2.8に先送りがされていた、上記もあるから必要なら他の方が何かするだろうと放置(WPのRCから正式に変わるのは物凄いチケット先送りで締め切り守る、のがいいのか?)

    しかし上記(tai さん、tenpura さん、Nao さん)の議論が完了してあれば先送り報告をここに投稿したと思うけど
    それか議論はこっちでやっても、本家(チケット)に仕込みでも良いから?必要性の議論を見せないとI18N を理解していない者に先送りされるのでは

    これなんて、さっぱり意味不明です。

    今頃になってようやくpost_class() がどういうテンプレートタグなのか分かりました(汗)。
    で、ようやく理解できて、ピンときたんですが、これってSandboxテーマのsandbox_post_class()と同じですよね?ソースコードを1行1行確認したわけではありませんが、もしかしたらコピってきたのかも、と思いました。

    そこで確認してみたんですが、Sandboxの最新版ver 1.6でも全く同じように

    例: 「携帯」カテゴリー → category-%e6%90%ba%e5%b8%af となる

    となります。やっぱり。タグも同様です。

    ちなみに、日本語のカテゴリとタグのスラッグを試しに英語にしてみると、ちゃんと英数字で表示されました。カテゴリだけならまだしも、日本語タグのスラッグを1つ1つ、いちいち編集してくのはちょっと現実適な解決方法じゃないですよね。

    それから、Sandboxにはsandbox_body_class()と言う、sandbox_post_class()と似た事をするテンプレートタグがあります。こちらはXHTMLのbody用です。確認したところ問題も同じです。

    Sandboxのfunction.phpの42行目あたりから10行くらいに、問題のコードがかかれていると思うんですが…

    ちょっとググってみましたが、Sandboxのこの問題に関する記事は見つかりませんでした。

    モデレーター IKEDA Yuriko

    (@lilyfan)

    これってSandboxテーマのsandbox_post_class()と同じですよね?

    Sandbox は使ってないのでよく分からないのですが、そうだとすると Sandbox 開発者が、CSS 規格について詳しくないということになりますね 😉 修正するならば、同じ方法を取らないといけないので、Sandbox 開発者にもコンタクトを取ってみることにしましょう。

    ちなみに、日本語のカテゴリとタグのスラッグを試しに英語にしてみると、ちゃんと英数字で表示されました。カテゴリだけならまだしも、日本語タグのスラッグを1つ1つ、いちいち編集してくのはちょっと現実適な解決方法じゃないですよね。

    はい、タグは絶望的だと思います。また、下書きを作ったときは、いまだに「タグの重複問題」が発生することが分かっていますので、これを回避するには、できるだけ英数字のスラッグを使わないことが要求されてしまいます。

    それから、Sandboxにはsandbox_body_class()と言う、sandbox_post_class()と似た事をするテンプレートタグがあります。こちらはXHTMLのbody用です。確認したところ問題も同じです。

    実は WordPress 2.7 で、これも導入される予定だったのですが、間に合わずに 2.8 に先送りになりました。post_class() 問題を片づければ、body_class() も同じ対応がされるはずなので心配はしていません。

    この問題ですが、正式リリースされた2.8でサクッと確認してみました。(XAMPP)

    <div class="post-639 post hentry category-diary category-105 tag-45 tag-61 tag-64" id="post-639">

    このcategory-105は「海外の事」です。タグも全て日本語のタグです。IDに変更されてますね。

    ちなみに新しく実装されたbody_classのほうもこうなっています。

    <body class="single postid-639 logged-in">

    チケットを読む限り、結局結論は持ち越しになったと解釈したのですが、どうなってるんでしょうね。

7件の返信を表示中 - 16 - 22件目 (全22件中)
  • トピック「post_class() が不正な CSS クラス名を生成」には新たに返信することはできません。