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.