チェックアウトページの請求フィールドを並べ替えようとしていますが、これまでに試したすべてが機能していません。
これが私が現在試しているスニペットです:
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;
}
以前は私のために働いていたので、何かがこのスニペットをオーバーライドしている可能性があります。
使用している方法は機能しません(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;
}
ブロック全体を検証するために、最初のコードブロックに追加のスニペットを追加しました。
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;
}
}
添付画像をご覧ください 詳細については、これを確認してください リンク
順序付け(並べ替え)は、phpコードではなくaddress-i18n.min.jsで機能します。
私の場合、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 );
幸運を!
@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;
} );