サポート » プラグイン » WooCommerceでの日本の郵便番号でハイフンを入れたい

  • 解決済 hikkomijian

    (@hikkomijian)


    お世話になります。
    WordPressにWooCommerce(2.6.1)を入れてサイトを作っています。
    作っている最中にWooCommerceがバージョンアップされたため、適用しました。

    その後、テスト注文時に気づいたのですが、登録時に郵便番号のハイフンが削除されてしまうようで、ハイフンが無いということでエラーが出てしまいます。
    その際、注文画面でハイフンを入力すればその時はエラーは出ませんが、次回、またハイフンが削除されていてエラーが出てしまいます。

    ちなみに、会員情報をWooCommerceのマイアカウントや購入画面で編集するとハイフンは削除されてしまいます。
    WordPressのユーザー情報から編集するとハイフンは入力されたまま登録できます。その場合は次回はエラーは出ないのですが、注文時にまたハイフンが削除され、その次はエラーがでてしまいます。

    ハイフンが削除されないようにするには、どのようにすればよろしいでしょうか?どなたかご教授いただけませんでしょうか?何卒よろしくお願い致します。

15件の返信を表示中 - 1 - 15件目 (全15件中)
  • モデレーター Okamoto Hidetaka

    (@hideokamoto)

    これ入れてみると直るかもです。
    日本対応プラグインとのことですので。
    https://wordpress.org/plugins/woocommerce-for-japan/

    トピック投稿者 hikkomijian

    (@hikkomijian)

    ありがとうございます。こちらは入れてあったのですが、まだ、だめみたいです。作者さんに対応していただけると非常に助かるのですが、、。
    どなたか分かる方おられましたらお願いします。
    「データベースに送られるときにハイフンが削除されないようにする」か、「ハイフンが無くてもエラーがでないようにする」かどちらかかとは思うのですが、どちらが良いのかもわかりません、、。

    トピック投稿者 hikkomijian

    (@hikkomijian)

    どうすれば一番良いのかまだわかりませんが、新バージョンではハイフンはいらないから削除することになった、と勝手に考え、チェック時にハイフンを無視するようにしたほうが良いのかなと思いました。
    というわけで、その場所を探し、たぶんここかな?と思い修正しました。

    wp-content/plugins/woocommerce/includes/class-wc-validation.php
    の74行目付近

    case ‘JP’ :
    $valid = (bool) preg_match( ‘/^([0-9]{3})([-])([0-9]{4})$/’, $postcode );
    break;

    case ‘JP’ :
    $valid = (bool) preg_match( ‘/^([0-9]{3})([-])?([0-9]{4})$/’, $postcode );
    break;

    としてみました。
    そしたらエラーは出なくなりました。

    ただ、毎回直すのは面倒なので、これって、プラグインのfunctionに書いて修正できたりするのでしょうか?WordPressのfunction?でしょうか、、。勉強不足ですみません。

    検証していませんが、is_postcode 関数で郵便番号のチェックをしていること、そしてそのチェックの有無にはフックがありますので、これを利用して テーマの functions.php に次の独自チェックを追加するといけると思います。

    add_action( 'woocommerce_validate_postcode', 'check_postcode', 10, 3);
     function check_postcode($valid, $postcode, $country){
        if ($country === 'JP')
    	  $valid = (bool) preg_match( '/^([0-9]{3})([-])?([0-9]{4})$/', $postcode );
        return $valid;
     }

    どうもです。この投稿に気が付くのが遅くなりました。
    原因が分かりました。通常の入力規制が postcode の登録時のチェックと別のところで行っており、それが原因のようです。
    上記のkimipoohさんの方法で、入力する時にハイフンがあり無しどちらでも良いようにする方法もあります。
    そもそもの登録時のチェックの方でハイフン有りに対応するのは以下の関数となります。

    add_filter( 'woocommerce_format_postcode', 'format_postcode_jp', 10, 2);
     function format_postcode_jp($postcode, $country){
        if ($country === 'JP')
    	  $postcode = trim( substr_replace( $postcode, '-', 3, 0 ) );
        return $postcode;
     }

    コアの方にコードの追加申請をしておりますので、後のバージョンからは解決されていくと思います。

    すいません。上の説明が一部日本語がおかしかったです。補足説明までに。
    郵便番号の入力チェックとフォーマットが別々に働いており、それぞれに処理を追加しておかないと行けなかった所、入力チェックだけに処理が行われていたために今回の事が起きたという感じです。

    コアのコードの修正をしております。同じ事象がポルトガルでも起きていたようで、そのコードもマージされておりますので、次のマイナーバージョンアップ時には、このバグは修正されているかと思います。

    バグ報告ありがとうございました。

    トピック投稿者 hikkomijian

    (@hikkomijian)

    お世話になります。
    お二人さま、ありがとうございます!助かりました。

    ということは、これからのバージョンアップと、登録されていく顧客情報とエラーのことを考えると、登録時にハイフン有りで対応してくようにするのが一番スムーズですかね。

    functionへの登録についてはお二人に教えてもらった書き方等、いろいろ試してみます!
    ベストなのは以下のような感じでしょうかね〜。
    ・登録時は「ハイフン有り」に限定する。(例で123-4567と出ているため)
    ・データベースにはハイフン有りで登録され、次回買い物時もそれが呼び出される。
    ・買い物や登録、編集時、いずれの場合もハイフン無しの場合はエラーとする。

    ありがとうございました!

    あ!shohei.tanakaさん、内容が異なりスレ違いになってしまい申し訳ないのですが、
    WooCommerceでのお客様アカウントの、マイアカウント>「アカウント詳細」の「名」と「姓」をWooCommerce for japanで姓名の順に並べる修正ってしていただけませんでしょうか?
    請求書住所などはおかげさまで、姓名の順になるのですが、パスワードの変更ができるアカウント詳細のほうが、名姓になってまして、、。可能であれば次回更新時にお願い致します。

    今後ともよろしくお願い致します。

    shohei.tanakaさんの方法:「ハイフン有り」に補正して登録する

    kimipoohの方法:「ハイフン有り無し」どちらでも登録できるようにする

    の違いです。
    shohei.tanakaさんの方法だと、登録されたデータは日本の郵便番号の場合には、「ハイフン有り」に統一されて登録されます(無くても自動修正される)。
    私の方法だとどっちでも許容するよんということです。

    まぁ恐らくは統一したほうがいいと思うので、shohei.tanakaさんの方法がオススメかなーと思います。

    トピック投稿者 hikkomijian

    (@hikkomijian)

    kimipoohさん、ありがとうございます。
    なるほど、そういうことですね。勉強になります。
    ぼくが最初にやろうとしていた方法ですと、kimipoohさんの方法ですけど、今後のことを考えるとハイフン有りにしておいたほうが良さそうですね。
    教えていただきありがとうございました。

    と、いま、管理画面を見たらWooCommerceの修正版が出たみたいです。
    更新内容に

    Tweak – PT (Portugal) and JP (Japan) postcode formats.

    って書かれてたのできっと直ってるんでしょうね。
    時間できたらすべてバックアップとってバージョンアップしてみようと思います。
    ありがとうございました。

    shohei.tanakaさんがコアの方を修正されたのが反映されたのかなと思います。

    https://github.com/woothemes/woocommerce/blob/master/includes/wc-formatting-functions.php の P669 に

    $postcode = trim( substr_replace( $postcode, ‘-‘, 3, 0 ) );

    が入りました。
    今回ポルトガル等いくつかで同じ問題がでたとおっしゃっていたので、
    function wc_format_postcode( $postcode, $country )
    の関数でそのあたりを補正されているのかなーと思います。

    ので単純に 2.6.2 にアップデートをされることで、本問題は解消されます。
    つまりは
    shohei.tanakaさんの方法:「ハイフン有り」に補正して登録する
    が実装されたということになります。

    もうちょっと補足しておきます。

    $postcode = trim( substr_replace( $postcode, ‘-‘, 3, 0 ) );

    は単純に3文字目の後に「-」を追加するのみです。
    これだけでは、すでにハイフンがあった場合には — と二重になります。

    しかし
    $postcode = wc_normalize_postcode( $postcode );
    を先に呼び出していて、

    function wc_normalize_postcode( $postcode ) {
    return preg_replace( ‘/[\s\-]/’, ”, trim( strtoupper( $postcode ) ) );
    }

    とあるように、1バイトスペースとハイフンを入力された郵便番号データから除去してから、処理されています。ので、問題なく3文字目の後に1つだけハイフンが入るってことですね。

    あとせっかくなのでちょっと調べて
    http://kitaney-wordpress.blogspot.jp/2016/07/woocommerce-262.html
    にまとめておきました。

    トピック投稿者 hikkomijian

    (@hikkomijian)

    なるほど、二重になる可能性は想像力が足りず考えてませんでしたが、すでに登録されたデータはどうなるか?程度は考えてまして、いろいろテストをしてみようとは思ってました。が、ちゃんとそのような動きをしてくれるのですね。
    わかりやすく教えていただきありがとうございます。
    あとは、ビクビクしながらバージョンアップしてみるだけなのですが、それが怖いんですよね、、。

    あと、まとめていただいたページはブックマークというか、ぼくのGoogleSpaceに保存しておきました。GoogleSpaceって本来の使い方とは違うのでしょうが、ブックマークに使うと便利だと思ってます。笑

    すでにハイフン有り無しで登録してしまった場合にどうなるかは、テスト環境ででもチェックされるとよいとは思います。

    部分的なコードをみての直感では、ハイフンあるなしに関わらず、検索のために抽出された郵便番号は、チェック前にハイフンなしに補正されて、それからチェックされているように見えます。

    wo-core-functions.php
    https://github.com/woothemes/woocommerce/blob/master/includes/wc-core-functions.php

    のP1259 からの数行をみると

    function wc_postcode_location_matcher( $postcode, $objects, $object_id_key, $object_compare_key, $country = '' ) {
    	$postcode           = wc_normalize_postcode( $postcode );
    	$wildcard_postcodes = array_map( 'wc_clean', wc_get_wildcard_postcodes( $postcode, $country ) );

    となっており、wc_normalize_postcode にて郵便番号内の1バイトスペースとハイフンを除去。それから、wc_get_wildcard_postcodes にて、国ごとの郵便番号を識別した上で、パッチングパターンを、$wildcard_postcodesに配列として保存してます。
    123-4567 ならば、
    $wildcard_postcodes [0] = ‘123456*’:
    $wildcard_postcodes [1] = ‘12345*’:
    $wildcard_postcodes [2] = ‘1234*’:
    $wildcard_postcodes [3] = ‘123*’:
    $wildcard_postcodes [4] = ’12*’:
    $wildcard_postcodes [5] = ‘1*’:
    $wildcard_postcodes [6] = ‘*’:
    のような形で。

    なので、そうなのかなーというぐらいですけどね。

    トピック投稿者 hikkomijian

    (@hikkomijian)

    なるほど。まだオープン前なので大丈夫ですが、今後何らかの問題でハイフン無しで登録されたとしても大丈夫っぽいですね。
    ぼくももっと勉強しなきゃなぁ、、、^^;

15件の返信を表示中 - 1 - 15件目 (全15件中)
  • トピック「WooCommerceでの日本の郵便番号でハイフンを入れたい」には新たに返信することはできません。