web-dev-qa-db-ja.com

Woocommerceチェックアウトフィールドの並べ替え

チェックアウトページの請求フィールドを並べ替えようとしていますが、これまでに試したすべてが機能していません。

これが私が現在試しているスニペットです:

add_filter("woocommerce_checkout_fields", "order_fields");

function order_fields($fields) {
  $order = array(
    "billing_first_name", 
    "billing_last_name", 
    "billing_country", 
    "billing_state", 
    "billing_address_1", 
    "billing_address_2", 
    "billing_email", 
    "billing_phone"
  );

  foreach($order as $field) {
    $ordered_fields[$field] = $fields["billing"][$field];
  }

  $fields["billing"] = $ordered_fields;
  return $fields;
}

以前は私のために働いていたので、何かがこのスニペットをオーバーライドしている可能性があります。

8
Yahya Hussein

使用している方法は機能しません(WooCommerce 3.0.4アップデート以降- ここにgithubの問題へのリンク)。これはバグではなく、仕様の変更です。

これを修正するには、必要な順序に合うように各フィールドの優先度を調整する必要があります。

add_filter("woocommerce_checkout_fields", "custom_override_checkout_fields", 1);
function custom_override_checkout_fields($fields) {
    $fields['billing']['billing_first_name']['priority'] = 1;
    $fields['billing']['billing_last_name']['priority'] = 2;
    $fields['billing']['billing_company']['priority'] = 3;
    $fields['billing']['billing_country']['priority'] = 4;
    $fields['billing']['billing_state']['priority'] = 5;
    $fields['billing']['billing_address_1']['priority'] = 6;
    $fields['billing']['billing_address_2']['priority'] = 7;
    $fields['billing']['billing_city']['priority'] = 8;
    $fields['billing']['billing_postcode']['priority'] = 9;
    $fields['billing']['billing_email']['priority'] = 10;
    $fields['billing']['billing_phone']['priority'] = 11;
    return $fields;
}

add_filter( 'woocommerce_default_address_fields', 'custom_override_default_locale_fields' );
function custom_override_default_locale_fields( $fields ) {
    $fields['state']['priority'] = 5;
    $fields['address_1']['priority'] = 6;
    $fields['address_2']['priority'] = 7;
    return $fields;
}

順序の配置を調整するのはコードの行ではなく、フィールドに割り当てられた優先度であることに注意してください。この場合、['billing_state']優先度5は、[この例では)の後に['billing_country']以前['billing_address_1']


編集:

コメントによると、これは何らかの理由で機能していませんでした(最初のテストWooCommerceインストールでは機能しましたが、ストアの場所を変更した後、なんとか失敗しました)。

掘り下げた後、デフォルトのロケール設定がオーバーライドの上に適用されることがわかりました(他にこれを説明する方法はわかりませんが、我慢してください) 。

上記のコードが機能していない場所でインストールを実行し、次のコードも追加して修正することができました。

add_filter( 'woocommerce_default_address_fields', 'custom_override_default_locale_fields' );
function custom_override_default_locale_fields( $fields ) {
    $fields['state']['priority'] = 5;
    $fields['address_1']['priority'] = 6;
    $fields['address_2']['priority'] = 7;
    return $fields;
}

ブロック全体を検証するために、最初のコードブロックに追加のスニペットを追加しました。

19
Frits

Woocommerceチェックアウトフィールドを変更するには、フィールドの順序と、表示される必要なクラスベースも変更する必要があります。 functions.phpに以下のコードを追加すれば機能します。

add_filter("woocommerce_checkout_fields", "woocommerce_reorder_checkout_fields", 9999);

if ( ! function_exists( 'woocommerce_reorder_checkout_fields' ) ) {
    function woocommerce_reorder_checkout_fields( $fields ) {

        /* To reorder state field you need to add this array. */
        $order = array(
        "billing_first_name", 
        "billing_last_name", 
        "billing_country", 
        "billing_state", 
        "billing_address_1", 
        "billing_address_2", 
        "billing_email", 
        "billing_phone"
        );

        foreach($order as $field) {
        $ordered_fields[$field] = $fields["billing"][$field];
        }

        $fields["billing"] = $ordered_fields;

        /* To change email and phone number you have to add only class no need to add priority. */

        $fields['billing']['billing_email']['class'][0] = 'form-row-first';
        $fields['billing']['billing_phone']['class'][0] = 'form-row-last';

    return $fields;
    }
}

添付画像をご覧ください enter image description here 詳細については、これを確認してください リンク

3
Mukesh Panchal

順序付け(並べ替え)は、phpコードではなくaddress-i18n.min.jsで機能します。

enter image description here

私の場合、jsコードで何か問題がありました。そのため、順序付けはうまく機能しませんでした(JavaScriptはそこで停止します)。

開発コンソールとjsエラーを確認してください。

そして、これは優先度のみを変更するphpコードです。

function rpf_edit_default_address_fields($fields) {

  /* ------ reordering ------ */
  $fields['country']['priority'] = 10;
  $fields['first_name']['priority'] = 20;
  $fields['last_name']['priority'] = 30;
  $fields['address_1']['priority'] = 40;
  $fields['address_2']['priority'] = 50;
  $fields['city']['priority'] = 60;
  $fields['state']['priority'] = 70;
  $fields['postcode']['priority'] = 80;

  return $fields;
}
add_filter( 'woocommerce_default_address_fields', 'rpf_edit_default_address_fields', 100, 1 );

幸運を!

2
Byeongin Yoon

@Byeonginが彼の回答で正しく言及しているように、バックエンドの順序(@Fritsの回答がカバーする)とは別に、ユーザーがドロップダウンから特定の国を選択すると、フロントエンドにJavaSrciptを介して行われる順序もあります。メニュー。

このフロントエンドの並べ替えも発生しないようにしたい場合、これまでに遭遇した最善の解決策は、woocommerce_get_country_localeフィルターにフックして、そこに追加されているpriorityオーバーライドを削除することです。

次のようなものでうまくいきます(WooCommerce v3.5.4でテスト済み):

add_filter( 'woocommerce_get_country_locale', function( $locale ) {
    foreach ( $locale as $country_code => $locale_fields ) {
        foreach ( $locale_fields as $field_key => $field_options ) {
            if ( isset( $field_options['priority'] ) ) {
                unset( $field_options['priority'] );
            }

            $locale[ $country_code ][ $field_key ] = $field_options;
        }
    }

    return $locale;
} );

2
psymeons