programing

WooCommerce에서 모든 체크아웃 필드를 가져오는 방법은?

minimums 2023. 11. 4. 10:31
반응형

WooCommerce에서 모든 체크아웃 필드를 가져오는 방법은?

타사 체크아웃 필드를 포함하여 사용 가능한 모든 체크아웃 필드를 얻고 싶습니다.

$fields = WC()->checkout()->checkout_fields;

치명적인 오류를 반환합니다.

Fatal error:  Call to a member function get_country() on a non-object in
../wp-content/plugins/woocommerce/includes/class-wc-checkout.php</b> on line 768

그것들을 얻을 수 있는 공식적인 방법이 있습니까?

편집:

내 플러그인은 백엔드에 사용 가능한 모든 체크아웃 필드가 있는 드롭다운 필드가 필요합니다.제가 좋아하는 것은 이런 배열입니다.var_dump$checkout_fields클래스의 변수) :

Array
(
    [billing] => Array
        (
            [billing_country] => Array
                (
                    [type] => country
                    [label] => Country
                    [required] => 1
                    [class] => Array
                        (
                            [0] => form-row-wide
                            [1] => address-field
                            [2] => update_totals_on_change
                        )

                )

            [billing_first_name] => Array
                (
                    [label] => First Name
                    [required] => 1
                    [class] => Array
                        (
                            [0] => form-row-first
                        )

                )

            [billing_last_name] => Array
                (
                    [label] => Last Name
                    [required] => 1
                    [class] => Array
                        (
                            [0] => form-row-last
                        )

                    [clear] => 1
                )

            [billing_company] => Array
                (
                    [label] => Company Name
                    [class] => Array
                        (
                            [0] => form-row-wide
                        )

                )

            [billing_address_1] => Array
                (
                    [label] => Address
                    [placeholder] => Street address
                    [required] => 1
                    [class] => Array
                        (
                            [0] => form-row-wide
                            [1] => address-field
                        )

                )

            [billing_address_2] => Array
                (
                    [placeholder] => Apartment, suite, unit etc. (optional)
                    [class] => Array
                        (
                            [0] => form-row-wide
                            [1] => address-field
                        )

                    [required] => 
                )

            [billing_postcode] => Array
                (
                    [label] => Postcode / Zip
                    [placeholder] => Postcode / Zip
                    [required] => 1
                    [class] => Array
                        (
                            [0] => form-row-wide
                            [1] => address-field
                        )

                    [clear] => 1
                    [validate] => Array
                        (
                            [0] => postcode
                        )

                )

            [billing_city] => Array
                (
                    [label] => Town / City
                    [placeholder] => Town / City
                    [required] => 1
                    [class] => Array
                        (
                            [0] => form-row-wide
                            [1] => address-field
                        )

                )

            [billing_state] => Array
                (
                    [type] => state
                    [label] => State / County
                    [placeholder] => State / County
                    [required] => 
                    [class] => Array
                        (
                            [0] => form-row-first
                            [1] => address-field
                        )

                    [validate] => Array
                        (
                            [0] => state
                        )

                )

            [billing_email] => Array
                (
                    [label] => Email Address
                    [required] => 1
                    [class] => Array
                        (
                            [0] => form-row-first
                        )

                    [validate] => Array
                        (
                            [0] => email
                        )

                )

            [billing_phone] => Array
                (
                    [label] => Phone
                    [required] => 1
                    [class] => Array
                        (
                            [0] => form-row-last
                        )

                    [clear] => 1
                    [validate] => Array
                        (
                            [0] => phone
                        )

                )

        )

    [shipping] => Array
        (
            [shipping_country] => Array
                (
                    [type] => country
                    [label] => Country
                    [required] => 1
                    [class] => Array
                        (
                            [0] => form-row-wide
                            [1] => address-field
                            [2] => update_totals_on_change
                        )

                )

            [shipping_first_name] => Array
                (
                    [label] => First Name
                    [required] => 1
                    [class] => Array
                        (
                            [0] => form-row-first
                        )

                )

            [shipping_last_name] => Array
                (
                    [label] => Last Name
                    [required] => 1
                    [class] => Array
                        (
                            [0] => form-row-last
                        )

                    [clear] => 1
                )

            [shipping_company] => Array
                (
                    [label] => Company Name
                    [class] => Array
                        (
                            [0] => form-row-wide
                        )

                )

            [shipping_address_1] => Array
                (
                    [label] => Address
                    [placeholder] => Street address
                    [required] => 1
                    [class] => Array
                        (
                            [0] => form-row-wide
                            [1] => address-field
                        )

                )

            [shipping_address_2] => Array
                (
                    [placeholder] => Apartment, suite, unit etc. (optional)
                    [class] => Array
                        (
                            [0] => form-row-wide
                            [1] => address-field
                        )

                    [required] => 
                )

            [shipping_postcode] => Array
                (
                    [label] => Postcode / Zip
                    [placeholder] => Postcode / Zip
                    [required] => 1
                    [class] => Array
                        (
                            [0] => form-row-wide
                            [1] => address-field
                        )

                    [clear] => 1
                    [validate] => Array
                        (
                            [0] => postcode
                        )

                )

            [shipping_city] => Array
                (
                    [label] => Town / City
                    [placeholder] => Town / City
                    [required] => 1
                    [class] => Array
                        (
                            [0] => form-row-wide
                            [1] => address-field
                        )

                )

            [shipping_state] => Array
                (
                    [type] => state
                    [label] => State / County
                    [placeholder] => State / County
                    [required] => 
                    [class] => Array
                        (
                            [0] => form-row-first
                            [1] => address-field
                        )

                    [validate] => Array
                        (
                            [0] => state
                        )

                )

        )

    [account] => Array
        (
            [account_password] => Array
                (
                    [type] => password
                    [label] => Account password
                    [required] => 1
                    [placeholder] => Password
                )

        )

    [order] => Array
        (
            [order_comments] => Array
                (
                    [type] => textarea
                    [class] => Array
                        (
                            [0] => notes
                        )

                    [label] => Order Notes
                    [placeholder] => Notes about your order, e.g. special notes for delivery.
                )

        )

)

파티에 늦었다는 것은 알지만, 정확한 특징을 찾고 있었고, 대답이 만족스럽지 않아 이에 대해 자세히 알아봤습니다.

질문 소유자가 말했듯이, 그는 (플러그인의) 관리 영역에서 사용 가능한 모든 체크아웃 필드를 가져와야 합니다.

그 시점에는 체크아웃이 가능하지 않기 때문에(고객 또는 WooCommerce 세션도 없음) 바로 실행할 수 없습니다.

따라서 솔루션은 세션과 고객을 위장하는 것이므로 관리 영역(기본 사용자 데이터로)에서 체크아웃할 수 있습니다.

/*
* WooCommerce does not load session class on backend, so we need to do this manually
*/
if ( ! class_exists( 'WC_Session' ) ) {
    include_once( WP_PLUGIN_DIR . '/woocommerce/includes/abstracts/abstract-wc-session.php' );
}

/*
* admin_init hook for testing purposes
*/
add_action('admin_init', function(){
    /*
    * First lets start the session. You cant use here WC_Session directly
    * because it's an abstract class. But you can use WC_Session_Handler which
    * extends WC_Session
    */
    WC()->session = new WC_Session_Handler;

    /*
    * Next lets create a customer so we can access checkout fields
    * If you will check a constructor for WC_Customer class you will see
    * that if you will not provide user to create customer it will use some
    * default one. Magic.
    */
    WC()->customer = new WC_Customer;

    /*
    * Done. You can browse all chceckout fields (including custom ones)
    */
    var_dump(WC()->checkout->checkout_fields);
    die();
});

저도 같은 문제에 직면해 있었습니다. 제가 어떻게 대처했는지는 이렇습니다.

class my_checkout_fields_class {
    var $countries;

function __construct() {

        $this->countries = new WC_Countries();

}


}

이제 이 클래스에서 청구 필드와 배송 필드를 각각 얻을 수 있습니다.

$billlingfields             = $this->countries->get_address_fields( $this->countries->get_base_country(),'billing_');

$shippingfields             = $this->countries->get_address_fields( $this->countries->get_base_country(),'shipping_');

안부 전해요

늦은 답변이지만 저는 무엇이 저에게 효과가 있는지 찾으려고 노력했고 이 (불완전하지만) 해결책을 결정했습니다.

함수 [WC_Countries::get_default_address_fields()[1]은(는) 우커머스 세션이나 체크아웃에 신경 쓰지 않으므로 조건부로 필드를 숨길 때 카트에 있는 것을 무시합니다(나는 이런 경우였습니다).

부르기WC()->countries->get_default_address_fields()플러그인에 의해 필드가 가려진 경우에도 매개 변수 없이 모든 과금 필드(사용자 지정 필드 제외)를 가져왔습니다.비록 두번째 매개변수가$type접두사가 될 수 있습니다.'billing_' 'shipping_'. 함수가 내 세션에서 다음을 반환했습니다(label & placeholder의 스웨덴 로케일).

Array (
    [billing_first_name] => Array (
        [label] => Förnamn
        [required] => 1
        [class] => Array (
            [0] => form-row-first
        )
        [autocomplete] => given-name
        [priority] => 10
    )
    [billing_last_name] => Array (
        [label] => Efternamn
        [required] => 1
        [class] => Array (
            [0] => form-row-last
        )
        [autocomplete] => family-name
        [priority] => 20
    )
    [billing_country] => Array (
        [type] => country
        [label] => Land/Region
        [required] => 1
        [class] => Array (
            [0] => form-row-wide
            [1] => address-field
            [2] => update_totals_on_change
        )
        [autocomplete] => country
        [priority] => 40
    )
    [billing_address_1] => Array (
        [label] => Gatuadress
        [placeholder] => Gatunamn och nummer
        [required] => 1
        [class] => Array (
            [0] => form-row-wide
            [1] => address-field
        )
        [autocomplete] => address-line1
        [priority] => 50
    )
    [billing_city] => Array (
        [label] => Ort
        [required] => 1
        [class] => Array (
            [0] => form-row-wide
            [1] => address-field
        )
        [autocomplete] => address-level2
        [priority] => 70
    )
    [billing_state] => Array (
        [type] => state
        [label] => Stat/län
        [required] => 1
        [class] => Array (
            [0] => form-row-wide
            [1] => address-field
        )
        [validate] => Array (
            [0] => state
        )
        [autocomplete] => address-level1
        [priority] => 80
        [country_field] => billing_country
        [country] => SE
    )
    [billing_postcode] => Array (
        [label] => Postnummer
        [required] => 1
        [class] => Array (
            [0] => form-row-wide
            [1] => address-field
        )
        [validate] => Array (
            [0] => postcode
        )
        [autocomplete] => postal-code
        [priority] => 90
    )
    [billing_phone] => Array (
        [label] => Telefon
        [required] => 
    )
    [billing_email] => Array (
        [label] => E-postadress
        [required] => 1
        [type] => email
        [class] => Array (
            [0] => form-row-wide
        )
        [validate] => Array (
            [0] => email
        )
        [autocomplete] => email
        [priority] => 110
    )
)

언급URL : https://stackoverflow.com/questions/27130234/how-to-get-all-checkout-fields-from-woocommerce

반응형