16 Stimmen

Fügen Sie benutzerdefinierte CSS-Klasse zu WooCommerce Kassenfeldern hinzu

Ich möchte benutzerdefinierte CSS-Klassen zu meinen WooCommerce-Kassenfeldern hinzufügen können. Ich verwende Twitter Bootstrap und würde gerne ihre .form-control-Klasse verwenden.

Ich habe im WooCommerce-Vorlagenordner in form-billing.php nachgesehen, bin mir aber nicht sicher, wo ich die .form-control-Klasse zu jedem Textfeld hinzufügen soll.

Hier ist der Code für form-billing.php

cart->ship_to_billing_address_only() && WC()->cart->needs_shipping() ) : ?>

checkout_fields['billing'] as $key => $field ) : ?>

    get_value( $key ) ); ?>

enable_signup ) : ?>

    enable_guest_checkout ) : ?>

            get_value( 'createaccount' ) || ( true === apply_filters( 'woocommerce_create_account_default_checked', false ) ) ), true) ?> type="checkbox" name="createaccount" value="1" /> 

    checkout_fields['account'] ) ) : ?>

            checkout_fields['account'] as $key => $field ) : ?>

                get_value( $key ) ); ?>

Muss ich in einer anderen Vorlagendatei suchen?

Danke

46voto

Dan Smart Punkte 1038

Die Antwort von icc97 ist fast da, funktioniert aber nicht.

Ich habe icc97's Antwort genommen und debugged:

add_filter('woocommerce_checkout_fields', 'addBootstrapToCheckoutFields' );
public function addBootstrapToCheckoutFields($fields) {
    foreach ($fields as &$fieldset) {
        foreach ($fieldset as &$field) {
            // if you want to add the form-group class around the label and the input
            $field['class'][] = 'form-group'; 

            // add form-control to the actual input
            $field['input_class'][] = 'form-control';
        }
    }
    return $fields;
}

23voto

Adriano Monecchi Punkte 1075

Wie @Peanuts angemerkt hat, was ist, wenn wir nur bestimmten Eingabetypen CSS-Klassen hinzufügen möchten?

Nachdem ich mit den hier geposteten Lösungen experimentiert habe (danke an alle!), bin ich auf eine Modifikation mit einem einfachen "Switch-Case" gekommen, bei der die Logik aus /woocommerce/includes/wc-template-functions.php übernommen wird. Die Funktion ermöglicht es uns, alle Eingabetypen auf einmal anzusprechen, sei es die standardmäßigen Eingabetypen oder sogar benutzerdefinierte.

Es ist nicht erforderlich, die woocommerce_form_field Funktion neu zu schreiben, um einfach die $defaults-Argumente für die Eingabetypen zu ändern. Es ist erwähnenswert, dass die Funktion uns auch ermöglicht, mehr als nur CSS-Klassen zu den Feldern hinzuzufügen.

-- Hier ist die Funktion --

/*********************************************************************************************/
/** WooCommerce - Ändern der Standardargumente für jeden einzelnen Eingabetyp /**
/*********************************************************************************************/

add_filter('woocommerce_form_field_args','wc_form_field_args',10,3);

function wc_form_field_args( $args, $key, $value = null ) {

/*********************************************************************************************/
/** Dies soll hier nicht stehen, dient aber als Referenz
/** dafür, was verändert werden kann. /**

$defaults = array(
    'type'              => 'text',
    'label'             => '',
    'description'       => '',
    'placeholder'       => '',
    'maxlength'         => false,
    'required'          => false,
    'id'                => $key,
    'class'             => array(),
    'label_class'       => array(),
    'input_class'       => array(),
    'return'            => false,
    'options'           => array(),
    'custom_attributes' => array(),
    'validate'          => array(),
    'default'           => '',
);
/*********************************************************************************************/

// Start der switch case für den Feldtyp

switch ( $args['type'] ) {

    case "select" :  /* Zielt auf alle Select-Eingabeelemente ab, außer den Länder- und Bundesland-Select-Eingabetypen */
        $args['class'][] = 'form-group'; // Fügt dem HTML-Element-Wrapper des Feldes eine Klasse hinzu - WooCommerce-Eingabetypen (Felder) sind oft in einem -Tag eingebettet  
        $args['input_class'] = array('form-control', 'input-lg'); // Fügt dem Formulareingang selbst eine Klasse hinzu
        //$args['custom_attributes']['data-plugin'] = 'select2';
        $args['label_class'] = array('control-label');
        $args['custom_attributes'] = array( 'data-plugin' => 'select2', 'data-allow-clear' => 'true', 'aria-hidden' => 'true',  ); // Fügt benutzerdefinierte Datenattribute dem Formulareingang selbst hinzu
    break;

    case 'country' : /* Standardmäßig füllt WooCommerce ein Select mit den Ländernamen - $args für diesen spezifischen Eingabetyp zielt nur auf das Länder-Select-Element ab */
        $args['class'][] = 'form-group single-country';
        $args['label_class'] = array('control-label');
    break;

    case "state" : /* Standardmäßig füllt WooCommerce ein Select mit den Bundesländernamen - $args für diesen spezifischen Eingabetyp zielt nur auf das Länder-Select-Element ab */
        $args['class'][] = 'form-group'; // Fügt dem HTML-Element-Wrapper des Feldes eine Klasse hinzu 
        $args['input_class'] = array('form-control', 'input-lg'); // fügt dem Formulareingang selbst eine Klasse hinzu
        //$args['custom_attributes']['data-plugin'] = 'select2';
        $args['label_class'] = array('control-label');
        $args['custom_attributes'] = array( 'data-plugin' => 'select2', 'data-allow-clear' => 'true', 'aria-hidden' => 'true',  );
    break;

    case "password" :
    case "text" :
    case "email" :
    case "tel" :
    case "number" :
        $args['class'][] = 'form-group';
        //$args['input_class'][] = 'form-control input-lg'; // gibt ein Array von Klassen zurück, dasselbe wie unten
        $args['input_class'] = array('form-control', 'input-lg');
        $args['label_class'] = array('control-label');
    break;

    case 'textarea' :
        $args['input_class'] = array('form-control', 'input-lg');
        $args['label_class'] = array('control-label');
    break;

    case 'checkbox' :  
    break;

    case 'radio' :
    break;

    default :
        $args['class'][] = 'form-group';
        $args['input_class'] = array('form-control', 'input-lg');
        $args['label_class'] = array('control-label');
    break;
    }

    return $args;
}

Die obige Funktion hat das Problem gelöst, alle Checkout-Formularfelder auf einmal anzusprechen, was wirklich einfach ist für die standardmäßigen Checkout-Formular-Eingabetypen oder sogar benutzerdefinierte neue. Es scheint jedoch nicht möglich zu sein, jede Ausgabe des HTML-Formulareingabetyps zu drucken, ohne eine neue Funktion zu erstellen, wie @abhisek es in seiner Antwort zeigt.

Bonus

Es scheint, dass die Funktion auch andere Formularfelder betrifft, die von WooCommerce-Funktionen oder -Vorlagen außerhalb der Checkout-Seite gedruckt werden. Ich habe es geschafft, die Funktion bedingt nur auf der Checkout-Seite anzuwenden, indem ich die is_page()-Funktion verwendet habe. Ihre Checkout-Seite hat möglicherweise ein anderes Slug, also ändern Sie das entsprechend.

Wenn Sie die Funktion nur für die Checkout-Seite anwenden müssen, tun Sie Folgendes:

Kommentieren Sie add_filter()

//add_filter('woocommerce_form_field_args','wc_form_field_args', 10, 3);

Und verwenden Sie stattdessen add_action

add_action('woocommerce_form_field_args', 'wc_form_field_args', 10, 3);

function wc_form_field_args( $args, $key, $value = null ) {

...

// Direkt nach 
    return $args;

// Fügen Sie folgendes ein

if ( !is_page('checkout') ) {
  add_filter('woocommerce_form_field_args','wc_form_field_args', 10, 3);
} else {
  remove_filter('woocommerce_form_field_args','wc_form_field_args', 10, 3);
}

}

Danach wirkt die Funktion nur auf der Checkout-Seite.

4voto

icc97 Punkte 9849

Die Antwort von @Chetan's Link and Run gibt Ihnen irgendwie, was Sie wollen, aber wie immer sind sie nie sehr gute Antworten.

Die beste Ressource dafür ist die WooCommerce-Codex-Seite zu Anpassen von Kassenfeldern mit Aktionen und Filtern.

In der 'Anpassung von WooCommerce-Kassenfeldetiketten und Platzhaltertext' auf Chetans Seite haben Sie den folgenden Code, den Sie zu Ihrer functions.php hinzufügen müssen. Ich habe ihn so modifiziert, dass er tun sollte, was Sie wollen, aber ich habe den Code nicht getestet:

// Einhaken
add_filter( 'woocommerce_checkout_fields' , 'my_theme_custom_override_checkout_fields' );

// Unsere eingehakte Funktion - $fields werden über den Filter übergeben!
function my_theme_custom_override_checkout_fields( $fields ) {
     foreach ($fields as $fieldset) {
         foreach ($fieldset as $field) {
             $field['class'] = array('form-control');
         }
     }
     return $fields;
}

0voto

Amit Gupta Punkte 7
/* Neue Kassenseitenfelder */
add_filter('woocommerce_form_field_args', 'custom_wc_form_field_args', 20, 3);
function custom_wc_form_field_args($args, $key, $value)
{
    if (is_checkout()) {

    if ($key != 'billing_phone' && $key != 'billing_email' && $key != 'billing_postcode' && $key != 'billing_country') {
        $args['class'] = array('inline-input');

    }elseif($key == 'billing_country'){
        $args['class'] = array('inline-input update_totals_on_change');
    }
    else {
        $args['class'] = array();
    }
    // if ($key == 'billing_country' || $key == 'shipping_country') {
    //     $args['class'] = array('inline-input', 'hidden');
    // }
    // $args['input_class'] = array('inline-text');
    if ($args['type'] == 'checkbox') {
        $args['label_class'] = array('custom-checkbox');
    } else {
        $args['label_class'] = array('sr-only');
    }
}
return $args;

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X