2026年6月19日

2026年6月19日

WordPressのWooCommerceチェックアウトをカスタマイズする方法

はじめに

「WooCommerceのチェックアウトに配送希望日や領収書宛名フィールドを追加したい」「不要なチェックアウトフィールドを削除したい」「チェックアウトのフィールド順序を変更したい」——WooCommerceはフックとフィルターでチェックアウトを詳細にカスタマイズできます。

症状・原因

WooCommerceのデフォルトチェックアウトフォームでは日本のECサイトに必要なフィールド(配送希望日・時間帯・領収書情報など)が不足しています。カスタマイズすることで購入体験を向上できます。

解決手順

ステップ1:チェックアウトフィールドを追加・変更・削除する

// functions.php: チェックアウトフィールドのカスタマイズ
add_filter( 'woocommerce_checkout_fields', function( array $fields ): array {

    // 不要なフィールドを削除
    unset( $fields['billing']['billing_company'] );    // 会社名を削除
    unset( $fields['shipping']['shipping_company'] );

    // フィールドを必須に変更
    $fields['billing']['billing_phone']['required'] = true;

    // フィールドの順序を変更(priorityで制御)
    $fields['billing']['billing_last_name']['priority']  = 10;
    $fields['billing']['billing_first_name']['priority'] = 20;

    // プレースホルダーを変更
    $fields['billing']['billing_postcode']['placeholder'] = '123-4567';

    // フィールドラベルを日本語に変更
    $fields['billing']['billing_state']['label']    = '都道府県';
    $fields['billing']['billing_city']['label']     = '市区町村';
    $fields['billing']['billing_address_1']['label'] = '番地・建物名';

    return $fields;
} );

ステップ2:カスタムフィールドを追加して注文メタに保存する

// functions.php: 配送希望日・時間帯・領収書フィールドを追加

// カスタムフィールドをチェックアウトフォームに表示
add_action( 'woocommerce_after_order_notes', function( WC_Checkout $checkout ): void {
    echo '<div id="custom-checkout-fields"><h3>配送・領収書オプション</h3>';

    // 配送希望日
    woocommerce_form_field( 'desired_delivery_date', [
        'type'        => 'text',
        'class'       => [ 'form-row-wide' ],
        'label'       => '配送希望日',
        'placeholder' => '例: 2024-04-01(空白=指定なし)',
        'required'    => false,
    ], $checkout->get_value( 'desired_delivery_date' ) );

    // 配送希望時間帯
    woocommerce_form_field( 'desired_delivery_time', [
        'type'    => 'select',
        'class'   => [ 'form-row-wide' ],
        'label'   => '配送希望時間帯',
        'options' => [
            ''         => '指定なし',
            'am'       => '午前中(8〜12時)',
            '14-16'    => '14〜16時',
            '16-18'    => '16〜18時',
            '18-20'    => '18〜20時',
            '19-21'    => '19〜21時',
        ],
    ], $checkout->get_value( 'desired_delivery_time' ) );

    // 領収書宛名
    woocommerce_form_field( 'receipt_name', [
        'type'        => 'text',
        'class'       => [ 'form-row-wide' ],
        'label'       => '領収書宛名(空白=不要)',
        'placeholder' => '例: 株式会社○○ 御中',
    ], $checkout->get_value( 'receipt_name' ) );

    echo '</div>';
} );

// バリデーション
add_action( 'woocommerce_checkout_process', function(): void {
    $date = sanitize_text_field( $_POST['desired_delivery_date'] ?? '' );
    if ( $date && ! preg_match( '/^\d{4}-\d{2}-\d{2}$/', $date ) ) {
        wc_add_notice( '配送希望日はYYYY-MM-DD形式で入力してください。', 'error' );
    }
} );

// 注文メタに保存
add_action( 'woocommerce_checkout_update_order_meta', function( int $order_id ): void {
    $fields = [
        'desired_delivery_date' => sanitize_text_field( $_POST['desired_delivery_date'] ?? '' ),
        'desired_delivery_time' => sanitize_text_field( $_POST['desired_delivery_time'] ?? '' ),
        'receipt_name'          => sanitize_text_field( $_POST['receipt_name']          ?? '' ),
    ];

    foreach ( $fields as $key => $value ) {
        if ( $value ) {
            update_post_meta( $order_id, '_' . $key, $value );
        }
    }
} );

ステップ3:管理画面の注文詳細にカスタムフィールドを表示する

// functions.php: 注文詳細にカスタムフィールドを表示
add_action( 'woocommerce_admin_order_data_after_shipping_address', function( WC_Order $order ): void {
    $delivery_date = $order->get_meta( '_desired_delivery_date' );
    $delivery_time = $order->get_meta( '_desired_delivery_time' );
    $receipt_name  = $order->get_meta( '_receipt_name' );

    $time_labels = [
        'am'    => '午前中(8〜12時)',
        '14-16' => '14〜16時',
        '16-18' => '16〜18時',
        '18-20' => '18〜20時',
        '19-21' => '19〜21時',
    ];

    echo '<div class="custom-order-fields">';
    echo '<h4>配送・領収書オプション</h4>';

    if ( $delivery_date ) {
        printf(
            '<p><strong>配送希望日:</strong> %s</p>',
            esc_html( $delivery_date )
        );
    }
    if ( $delivery_time ) {
        printf(
            '<p><strong>配送希望時間帯:</strong> %s</p>',
            esc_html( $time_labels[ $delivery_time ] ?? $delivery_time )
        );
    }
    if ( $receipt_name ) {
        printf(
            '<p><strong>領収書宛名:</strong> %s</p>',
            esc_html( $receipt_name )
        );
    }

    echo '</div>';
} );

ステップ4:注文確認メールにカスタムフィールドを含める

// functions.php: 注文メールにカスタム情報を追加
add_action( 'woocommerce_email_order_meta', function(
    WC_Order $order, bool $sent_to_admin, bool $plain_text
): void {
    $delivery_date = $order->get_meta( '_desired_delivery_date' );
    $delivery_time = $order->get_meta( '_desired_delivery_time' );
    $receipt_name  = $order->get_meta( '_receipt_name' );

    if ( ! $delivery_date && ! $delivery_time && ! $receipt_name ) {
        return;
    }

    if ( $plain_text ) {
        echo "========================================\n";
        echo "配送・領収書オプション\n";
        if ( $delivery_date ) echo "配送希望日: {$delivery_date}\n";
        if ( $delivery_time ) echo "配送希望時間帯: {$delivery_time}\n";
        if ( $receipt_name  ) echo "領収書宛名: {$receipt_name}\n";
    } else {
        ?>
        <h2>配送・領収書オプション</h2>
        <table cellspacing="0" cellpadding="6" style="width:100%;border:1px solid #e5e5e5">
            <?php if ( $delivery_date ) : ?>
            <tr>
                <th style="text-align:left;padding:6px;border:1px solid #e5e5e5">配送希望日</th>
                <td style="padding:6px;border:1px solid #e5e5e5"><?php echo esc_html( $delivery_date ); ?></td>
            </tr>
            <?php endif; ?>
            <?php if ( $receipt_name ) : ?>
            <tr>
                <th style="text-align:left;padding:6px;border:1px solid #e5e5e5">領収書宛名</th>
                <td style="padding:6px;border:1px solid #e5e5e5"><?php echo esc_html( $receipt_name ); ?></td>
            </tr>
            <?php endif; ?>
        </table>
        <?php
    }
}, 10, 3 );

ステップ5:チェックアウトページのレイアウトをCSSで調整する

/* style.css: チェックアウトレイアウトの調整 */

/* 2カラムを1カラムに変更(モバイルファースト) */
.woocommerce-checkout .col2-set {
    display: block;
}
.woocommerce-checkout .col2-set .col-1,
.woocommerce-checkout .col2-set .col-2 {
    float: none;
    width: 100%;
}

/* カスタムフィールドセクションのスタイル */
#custom-checkout-fields {
    border: 1px solid #e0e0e0;
    border-radius: 4px;
    padding: 1.5rem;
    margin-top: 1.5rem;
    background: #f9f9f9;
}

#custom-checkout-fields h3 {
    margin-top: 0;
    font-size: 1.1rem;
    color: #1d2327;
}

/* 注文概要をスティッキーに */
@media ( min-width: 768px ) {
    .woocommerce-checkout #order_review {
        position: sticky;
        top: 2rem;
    }
}

注意事項

  • woocommerce_checkout_fieldsフィルターで変更できるのはbillingshippingaccountorderグループのフィールドです。カスタムで追加したフィールドはこのフィルターでは管理できません。
  • チェックアウトフィールドのバリデーションはwoocommerce_checkout_processで行い、wc_add_notice()でエラーを追加してください。wp_die()は使わないでください。
  • 注文メタへの保存はwoocommerce_checkout_update_order_metaではなく、WooCommerce 7.1以降ではwoocommerce_checkout_order_createdの使用を推奨します。

まとめ

WooCommerceチェックアウトのカスタマイズは「woocommerce_checkout_fieldsフィルターでデフォルトフィールドを変更→woocommerce_after_order_notesフックでカスタムフィールドを追加→woocommerce_checkout_processでバリデーション→woocommerce_checkout_update_order_metaで注文メタに保存→woocommerce_admin_order_data_after_shipping_addressで管理画面に表示→woocommerce_email_order_metaでメールに含める」の流れで整備します。関連記事:WordPressのWooCommerceメールテンプレートをカスタマイズする方法WordPressのWooCommerce商品タイプをカスタマイズする方法

お気軽にご相談ください

お見積りへ お問い合わせへ