Zeigen Sie benutzerdefinierte DOB-Felder auf den Bestellbearbeitungsseiten des WooCommerce-Adminbereichs an

Lesezeit: 10 Minuten

Benutzer-Avatar
cmcau

Ich habe diesen Code zu functions.php hinzugefügt

// Hook in
add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
add_filter( 'woocommerce_ship_to_different_address_checked', '__return_false' );
add_action( 'woocommerce_before_order_notes', 'competitor_details' );
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');

// Our hooked in function - $fields is passed via the filter!
function custom_override_checkout_fields( $fields ) {
     unset($fields['order']['order_comments']);

     return $fields;
}

function competitor_details( $checkout ) {

    echo '<div id="competitor_details"><h3>' . __('Competitor\'s Details') . '</h3>';

    woocommerce_form_field( 'competitor_first_name',array('label' => 'First name', 'type' => 'text', 'required' => 'true')
        , $checkout->get_value( 'my_field_name' ));

    woocommerce_form_field( 'competitor_last_name',array('label' => 'Last name', 'type' => 'text', 'required' => 'true')
        , $checkout->get_value( 'my_field_name' ));

    echo '<div id="competitor_details"><h4>' . __('Date of birth') . '</h4>';
    woocommerce_form_field( 'competitor_dob_day',array('label' => 'Day', 'type' => 'select', 'required' => 'true', 'options' => array(''=>'','1'=>'1','2'=>'2','3'=>'3','4'=>'4','5'=>'5','6'=>'6','7'=>'7','8'=>'8','9'=>'9','10'=>'10','11'=>'11','12'=>'12','13'=>'13','14'=>'14','15'=>'15','16'=>'16','17'=>'17','18'=>'18','19'=>'19','20'=>'20','21'=>'21','22'=>'22','23'=>'23','24'=>'24','25'=>'25','26'=>'26','27'=>'27','28'=>'28','29'=>'29','30'=>'30','31'=>'31'))
        , $checkout->get_value( 'my_field_name' ));
    woocommerce_form_field( 'competitor_dob_month',array('label' => 'Month', 'type' => 'select', 'required' => 'true', 'options' => array(''=>'','Jan'=>'Jan','Feb'=>'Feb','Mar'=>'Mar','Apr'=>'Apr','May'=>'May','Jun'=>'Jun','Jul'=>'Jul','Aug'=>'Aug','Sep'=>'Sep','Oct'=>'Oct','Nov'=>'Nov','Dec'=>'Dec'))
        , $checkout->get_value( 'my_field_name' ));
    woocommerce_form_field( 'competitor_dob_year',array('label' => 'Year', 'type' => 'text', 'required' => 'true')
        , $checkout->get_value( 'my_field_name' ));

    echo '<div id="consent_to_rules"><h4>' . __('I have read the Rules and agree to abide by them') . '</h4>';
    
    woocommerce_form_field( 'consent_to_rules',array('label' => 'YES, I agree', 'type' => 'checkbox', 'required' => 'true')
        , $checkout->get_value( 'my_field_name' ));

    echo '</div>';


}


function my_custom_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( ! $_POST['competitor_first_name'] )
        wc_add_notice( __( 'Please enter Competitors First Name' ), 'error' );
    if ( ! $_POST['competitor_last_name'] )
        wc_add_notice( __( 'Please enter Competitors Last Name' ), 'error' );
    if ( ! $_POST['competitor_dob_day'] )
        wc_add_notice( __( 'Please enter Competitors date of birth' ), 'error' );
    if ( ! $_POST['competitor_dob_month'] )
        wc_add_notice( __( 'Please enter Competitors date of birth' ), 'error' );
    if ( ! $_POST['competitor_dob_year'] )
        wc_add_notice( __( 'Please enter Competitors date of birth' ), 'error' );
    if ( ! $_POST['consent_to_rules'] )
        wc_add_notice( __( 'Please agree that you have read the Rules' ), 'error' );
}

Dadurch werden die erforderlichen Felder zur Checkout-Seite hinzugefügt. Ich möchte keine Datumsauswahl, weil das Geburtsdatum wirklich alles sein kann – es muss nur einfach einzugeben sein.

Der Checkout funktioniert einwandfrei, aber ich sehe die Feldwerte nicht, wenn ich die Bestelldetails im Admin-Bereich überprüfe.

Irgendwelche Hilfe dabei?

Benutzer-Avatar
7uc1f3r

Zunächst einmal habe ich Ihren aktuellen Code umgeschrieben, da er einige kleinere Fehler aufwies

// Unset order comments field
function filter_woocommerce_checkout_fields( $fields ) {
     unset( $fields['order']['order_comments'] );

     return $fields;
}
add_filter( 'woocommerce_checkout_fields' , 'filter_woocommerce_checkout_fields', 10, 1 );

// NOT checked by default
add_filter( 'woocommerce_ship_to_different_address_checked', '__return_false' );

// Add custom fields
function action_woocommerce_before_order_notes( $checkout ) {
    echo '<h3>' . __( 'Competitor\'s Details', 'woocommerce' ) . '</h3>';
    
    // First name
    woocommerce_form_field( 'competitor_first_name', array(
        'label'       => __( 'First name', 'woocommerce' ), 
        'type'        => 'text', 
        'required'    => 'true'
    ), $checkout->get_value( 'competitor_first_name' ) );

    // Last name
    woocommerce_form_field( 'competitor_last_name', array(
        'label'       => __( 'Last name', 'woocommerce' ), 
        'type'        => 'text',
        'required'    => 'true'
    ), $checkout->get_value( 'competitor_last_name' ) );

    echo '<h4>' . __( 'Date of birth', 'woocommerce' ) . '</h4>';
    
    // Options day
    $options_day = array( '' => __( 'Please select a day', 'woocommerce' ) );
    $from = 1;
    $to = 31;
    $options_day_combine = $options_day + array_combine( range( $from, $to ), range( $from, $to ) ); 
    
    // Dob day
    woocommerce_form_field( 'competitor_dob_day', array(
        'label'       => __( 'Day', 'woocommerce' ), 
        'type'        => 'select', 
        'required'    => 'true',
        'options'     => $options_day_combine
    ), $checkout->get_value( 'competitor_dob_day' ) );
    
    // Dob month
    woocommerce_form_field( 'competitor_dob_month', array(
        'label'       => __( 'Month', 'woocommerce' ),  
        'type'        => 'select', 
        'required'    => 'true',
        'options'     => array(
            ''    => __( 'Please select a month', 'woocommerce' ),
            'Jan' => __( 'Jan', 'woocommerce' ),
            'Feb' => __( 'Feb', 'woocommerce' ),
            'Mar' => __( 'Mar', 'woocommerce' ),
            'Apr' => __( 'Apr', 'woocommerce' ),
            'May' => __( 'May', 'woocommerce' ),
            'Jun' => __( 'Jun', 'woocommerce' ),
            'Jul' => __( 'Jul', 'woocommerce' ),
            'Aug' => __( 'Aug', 'woocommerce' ),
            'Sep' => __( 'Sep', 'woocommerce' ),
            'Oct' => __( 'Oct', 'woocommerce' ),
            'Nov' => __( 'Nov', 'woocommerce' ),
            'Dec' => __( 'Dec', 'woocommerce' ),
        )
    ), $checkout->get_value( 'competitor_dob_month' ) );
    
    // Options year
    $options_year = array( '' => __( 'Please select a year', 'woocommerce' ) );
    $from = 2021;
    $to = 1910;
    $options_year_combine = $options_year + array_combine( range( $from, $to ), range( $from, $to ) );
    
    // Dob year
    woocommerce_form_field( 'competitor_dob_year', array(
        'label'       => __( 'Year', 'woocommerce' ),  
        'type'        => 'select',
        'required'    => 'true',
        'options'     => $options_year_combine
    ), $checkout->get_value( 'competitor_dob_year' ) );

    echo '<h4>' . __( 'I have read the Rules and agree to abide by them', 'woocommerce' ) . '</h4>';
    
    // Rules
    woocommerce_form_field( 'consent_to_rules', array(
        'label'       => __( 'Yes, I agree', 'woocommerce' ),  
        'type'        => 'checkbox', 
        'required'    => 'true'
    ), $checkout->get_value( 'consent_to_rules' ) );
}
add_action( 'woocommerce_before_order_notes', 'action_woocommerce_before_order_notes', 10, 1 );

// Validate custom fields
function action_woocommerce_checkout_process() {
    // Isset and empty, add an error
    if ( isset( $_POST['competitor_first_name'] ) && empty( $_POST['competitor_first_name'] ) ) {
        wc_add_notice( __( 'Please enter Competitors First Name', 'woocommerce' ), 'error' );
    }
    
    if ( isset( $_POST['competitor_last_name'] ) && empty( $_POST['competitor_last_name'] ) ) {
        wc_add_notice( __( 'Please enter Competitors Last Name', 'woocommerce' ), 'error' );
    }
    
    if ( isset( $_POST['competitor_dob_day'] ) && empty( $_POST['competitor_dob_day'] ) ) {
        wc_add_notice( __( 'Please enter Competitors date of birth - day', 'woocommerce' ), 'error' );
    }
    
    if ( isset( $_POST['competitor_dob_month'] ) && empty( $_POST['competitor_dob_month'] ) ) {
        wc_add_notice( __( 'Please enter Competitors date of birth - month', 'woocommerce' ), 'error' );
    }

    if ( isset( $_POST['competitor_dob_year'] ) && empty( $_POST['competitor_dob_year'] ) ) {
        wc_add_notice( __( 'Please enter Competitors date of birth - year', 'woocommerce' ), 'error' );
    }
    
    if ( ! isset( $_POST['consent_to_rules'] ) ) {
        wc_add_notice( __( 'Please agree that you have read the Rules', 'woocommerce' ), 'error' );
    }
}
add_action( 'woocommerce_checkout_process', 'action_woocommerce_checkout_process', 10, 0 );

Um Ihre Frage zu beantworten, speichern und anzeigen

Verwenden Sie die woocommerce_checkout_create_order und woocommerce_admin_order_data_after_billing_address Aktionen Haken.

Diese Teile können mit einer foreach-Schleife optimiert werden, anstatt jedes Mal eine if-Bedingung hinzuzufügen, aber ich habe dies nicht angewendet, damit alles klar bleibt.

Sie erhalten also:

// Save fields
function action_woocommerce_checkout_create_order( $order, $data ) {
    // Isset and NOT empty, save
    if ( isset( $_POST['competitor_first_name'] ) && ! empty( $_POST['competitor_first_name'] ) ) {
        // Update meta data
        $order->update_meta_data( 'competitor_first_name', sanitize_text_field( $_POST['competitor_first_name'] ) );
    }
    
    if ( isset( $_POST['competitor_last_name'] ) && ! empty( $_POST['competitor_last_name'] ) ) {
        // Update meta data
        $order->update_meta_data( 'competitor_last_name', sanitize_text_field( $_POST['competitor_last_name'] ) );
    }
    
    if ( isset( $_POST['competitor_dob_day'] ) && ! empty( $_POST['competitor_dob_day'] ) ) {
        // Update meta data
        $order->update_meta_data( 'competitor_dob_day', sanitize_text_field( $_POST['competitor_dob_day'] ) );
    }
    
    if ( isset( $_POST['competitor_dob_month'] ) && ! empty( $_POST['competitor_dob_month'] ) ) {
        // Update meta data
        $order->update_meta_data( 'competitor_dob_month', sanitize_text_field( $_POST['competitor_dob_month'] ) );
    }

    if ( isset( $_POST['competitor_dob_year'] ) && ! empty( $_POST['competitor_dob_year'] ) ) {
        // Update meta data
        $order->update_meta_data( 'competitor_dob_year', sanitize_text_field( $_POST['competitor_dob_year'] ) );
    }
    
    if ( isset( $_POST['consent_to_rules'] ) ) {
        // Update meta data
        $order->update_meta_data( 'consent_to_rules', sanitize_text_field( $_POST['consent_to_rules'] ) );
    }
}
add_action( 'woocommerce_checkout_create_order', 'action_woocommerce_checkout_create_order', 10, 2 );

// Display the custom 'select' field value on admin order pages after billing adress
function action_woocommerce_admin_order_data_after_billing_address( $order ) {  
    // Get meta
    $competitor_first_name = $order->get_meta( 'competitor_first_name' );
    
    // NOT empty
    if ( ! empty ( $competitor_first_name ) ) {
        echo '<p><strong>' . __( 'Competitor first name', 'woocommerce' ) . ':</strong> ' . $competitor_first_name . '</p>';
    }
    
    // Get meta
    $competitor_last_name = $order->get_meta( 'competitor_last_name' );
    
    // NOT empty
    if ( ! empty ( $competitor_last_name ) ) {
        echo '<p><strong>' . __( 'Competitor last name', 'woocommerce' ) . ':</strong> ' . $competitor_last_name . '</p>';
    }
    
    // Get meta
    $competitor_dob_day = $order->get_meta( 'competitor_dob_day' );
    
    // NOT empty
    if ( ! empty ( $competitor_dob_day ) ) {
        echo '<p><strong>' . __( 'Competitor dob day', 'woocommerce' ) . ':</strong> ' . $competitor_dob_day . '</p>';
    }
    
    // Get meta
    $competitor_dob_month = $order->get_meta( 'competitor_dob_month' );
    
    // NOT empty
    if ( ! empty ( $competitor_dob_month ) ) {
        echo '<p><strong>' . __( 'Competitor dob month', 'woocommerce' ) . ':</strong> ' . $competitor_dob_month . '</p>';
    }
    
    // Get meta
    $competitor_dob_year = $order->get_meta( 'competitor_dob_year' );
    
    // NOT empty
    if ( ! empty ( $competitor_dob_year ) ) {
        echo '<p><strong>' . __( 'Competitor dob year', 'woocommerce' ) . ':</strong> ' . $competitor_dob_year . '</p>';
    }
    
    // Get meta
    $consent_to_rules = $order->get_meta( 'consent_to_rules' );
    
    // NOT empty
    if ( ! empty ( $consent_to_rules ) ) {
        echo '<p><strong>' . __( 'Yes, I agree', 'woocommerce' ) . '</strong></p>';
    }
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'action_woocommerce_admin_order_data_after_billing_address', 10, 1 );

  • TOLLE !!! … Danke für die Antwort, ich kann sehen, was ich getan habe, und es ist großartig zu sehen, wie Sie es getan haben. Gibt es eine Möglichkeit, die DOB-Felder in einer einzigen Zeile zu erstellen? (Ich weiß, wahrscheinlich eine neue Frage – ich werde bei Bedarf eine neue Frage stellen)

    – cmcau

    8. Juni 2021 um 10:51 Uhr


  • @cmcau hat sie in einem div zusammengefügt, wie echo '<div class="wrapper">' …meine Geburtsdatumsfelder… echo '</div>'; und wenden Sie dann das gewünschte CSS darauf an

    – 7uc1f3r

    8. Juni 2021 um 12:35 Uhr

  • Die Seite ist jetzt live und ich habe gerade festgestellt, dass die benutzerdefinierten Felder über das mobile Design nicht sichtbar sind 🙁

    – cmcau

    14. Juni 2021 um 4:04 Uhr

  • BEHOBEN 🙂 Ich habe ein Plugin namens WPtouch Mobile Plugin verwendet und wenn ich es deaktiviere, funktioniert die Seite im Desktop-Modus, aber auf einem Telefon sieht es jetzt gut aus 🙂

    – cmcau

    14. Juni 2021 um 4:09 Uhr

1010980cookie-checkZeigen Sie benutzerdefinierte DOB-Felder auf den Bestellbearbeitungsseiten des WooCommerce-Adminbereichs an

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy