サポート » 使い方全般 » カスタムメニュー機能の「カスタムリンク」のURLに「http://~」を付加しな

  • 解決済モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)


    カスタムメニュー機能内にある「カスタムリンク」の「URL」欄に、http://で始まらない文字列を入力した場合、勝手に「http://」を頭につけてくれます。

    さらに、 "javascript:void(0);"というような「;」が含まれたものなどを入れると、
    登録しても中身を空っぽにしてくれちゃいます。

    100歩譲って空なら空のままでもいいとしても、
    空の場合href属性がつきません。これでは、ある特定のブラウザでの挙動が怪しい!
    <a href="">じゃなくて<a>になるってことです

    このあたりの自動整形を外すためのフックってあるんでしょうか?
    nav-menu.phpやnav-menu-template.phpあたりを眺めてみたのですが、解読に至らず。。。

    何か情報をお持ちの方、いらっしゃいましたらよろしくお願いいたします。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • モデレーター Takuro Hishikawa

    (@hissy)

    まあ、Javascriptが通らないのはセキュリティ的に正しい挙動だと思いますが…。
    URLは「#」にしておいて、表示オプションでCSSクラスをつけられますので、任意のクラスを追加し、jQueryでclickアクションを設定するのが簡単だと思いますよ。

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    hissyさん、ありがとうございます。
    おかげさまでJSの実装の方は「#」を入れて特に問題なくできております。
    とはいえ、整形ストップっていうことができるのかな?と単純に気になりまして。
    XSSの懸念もありますし、整形できなくて正解ってことでいいんでしょうかねー。

    popup

    (@popup)

    直接整形してからupdate_post_metaで更新しているようですから、フック等による整形停止は出来ないように思います。

    nav-menu.phpのwp_update_nav_menu_item()内にあります。

    update_post_meta( $menu_item_db_id, '_menu_item_url', esc_url_raw($args['menu-item-url']) );

    esc_url()の以下の部分で判断して、http://を追加しているようです。(esc_url_raw()はesc_url()を実行しています。)

    if ( strpos($url, ':') === false && ! in_array( $url[0], array( '/', '#', '?' ) ) &&
    		! preg_match('/^[a-z0-9-]+?\.php/i', $url) )
    		$url = 'http://' . $url;

    「/blog/xxxx.html」など、「/」から始まるWEBのルートパスは整形されませんので、そのままでも特に問題ないと思いますが、いかがでしょうか?

    モデレーター のむらけい (Kei Nomura)

    (@mypacecreator)

    popupさん
    ふむふむなるほどなるほど、そこで処理してるんですね。
    ありがとうございます。

    <まとめ>
    ・フックはないっぽい
    ・スクリプトを入れられるようにするとセキュリティ上よくない
    ・有効なのは、/ # ? で始まるリンク
    ・それ以外の文字列が入った時は http:// を付加

    どういう処理をしているのかも分かりましたので、解決済みといたします。
    お二方、私の素朴な疑問へのお付き合いありがとうございましたm(_ _)m

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「カスタムメニュー機能の「カスタムリンク」のURLに「http://~」を付加しな」には新たに返信することはできません。