web-dev-qa-db-de.com

Wie ändere ich den Schaltflächentext unter "Option auswählen" in Woocommerce?

Wie gehe ich vor, um diesen PHP Code zu ändern? Wählen Sie eine Option basierend auf der ID des ausgewählten Elements im Woocommerce-Plugin für WordPress aus? Ich glaube, ich habe die richtige PHP Datei in wc-template-function.php gefunden, aber mein Mangel an PHP Fähigkeiten hält mich zurück. Folgendes habe ich bisher:

if ( ! function_exists( 'wc_dropdown_variation_attribute_options' ) ) {

    /**
     * Output a list of variation attributes for use in the cart forms.
     *
     * @param array $args
     * @since 2.4.0
     */
    function wc_dropdown_variation_attribute_options( $args = array() ) {
        $args = wp_parse_args( $args, array(
            'options'          => false,
            'attribute'        => false,
            'product'          => false,
            'selected'         => false,
            'name'             => '',
            'id'               => '',
            'class'            => '',
            'show_option_none' => __( 'Choose an option', 'woocommerce' ),
            'show_option_color' => __( 'Choose a color', 'woocommerce' ),
            'show_option_size' => __( 'Choose a size', 'woocommerce' )
        ) );

        $options   = $args['options'];
        $product   = $args['product'];
        $attribute = $args['attribute'];
        $name      = $args['name'] ? $args['name'] : 'attribute_' . sanitize_title( $attribute );
        $id        = $args['id'] ? $args['id'] : sanitize_title( $attribute );
        $class     = $args['class'];

        if ( empty( $options ) && ! empty( $product ) && ! empty( $attribute ) ) {
            $attributes = $product->get_variation_attributes();
            $options    = $attributes[ $attribute ];
        }

        echo '<select id="' . esc_attr( $id ) . '" class="' . esc_attr( $class ) . '" name="' . esc_attr( $name ) . '" data-attribute_name="attribute_' . esc_attr( sanitize_title( $attribute ) ) . '">';

        if ( $args['show_option_none'] ) {
            echo '<option value="">' . esc_html( $args['show_option_none'] ) . '</option>';
        }
        if ( $args['$id_colors'] ) {
            echo '<option value="">' . esc_html( $args['show_option_color'] ) . '</option>';
        }
        if ( $args['$id_sizes'] ) {
            echo '<option value="">' . esc_html( $args['show_option_size'] ) . '</option>';
        }

        if ( ! empty( $options ) ) {
            if ( $product && taxonomy_exists( $attribute ) ) {
                // Get terms if this is a taxonomy - ordered. We need the names too.
                $terms = wc_get_product_terms( $product->id, $attribute, array( 'fields' => 'all' ) );

                foreach ( $terms as $term ) {
                    if ( in_array( $term->slug, $options ) ) {
                        echo '<option value="' . esc_attr( $term->slug ) . '" ' . selected( sanitize_title( $args['selected'] ), $term->slug, false ) . '>' . apply_filters( 'woocommerce_variation_option_name', $term->name ) . '</option>';
                    }
                }
            } else {
                foreach ( $options as $option ) {
                    // This handles < 2.4.0 bw compatibility where text attributes were not sanitized.
                    $selected = sanitize_title( $args['selected'] ) === $args['selected'] ? selected( $args['selected'], sanitize_title( $option ), false ) : selected( $args['selected'], $option, false );
                    echo '<option value="' . esc_attr( $option ) . '" ' . $selected . '>' . esc_html( apply_filters( 'woocommerce_variation_option_name', $option ) ) . '</option>';
                }
            }
        }

        echo '</select>';
    }
}

Sie können sehen, wo ich versucht habe, show_option_color und show_option_size zum Array hinzuzufügen und dann if-Anweisungen für sie hinzuzufügen, aber es scheint nicht zu funktionieren. Ich bin nicht sicher, wie ich auf die ID des ausgewählten Elements verweisen und die if-Anweisung schreiben soll, basierend darauf, ob es das richtige select-Element ist.

Hier ist der HTML-Code, auf den ich abzielen möchte.

<select id="sizes" class="" name="attribute_sizes" data-attribute_name="attribute_sizes">Want this to say Choose a size</select>

<select id="colors" class="" name="attribute_sizes" data-attribute_name="attribute_sizes">Want this to say Choose a color</select>

variable.php Codezeilen 27 - 38:

<?php foreach ( $attributes as $attribute_name => $options ) : ?>
                    <tr>
                        <td class="label"><label for="<?php echo sanitize_title( $attribute_name ); ?>"><?php echo wc_attribute_label( $attribute_name ); ?></label></td>
                        <td class="value">
                            <?php
                                $selected = isset( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ? wc_clean( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) : $product->get_variation_default_attribute( $attribute_name );
                                wc_dropdown_variation_attribute_options( array( 'options' => $options, 'attribute' => $attribute_name, 'product' => $product, 'selected' => $selected ) );
                                echo end( $attribute_keys ) === $attribute_name ? '<a class="reset_variations" href="#">' . __( 'Clear selection', 'woocommerce' ) . '</a>' : '';
                            ?>
                        </td>
                    </tr>
                <?php endforeach;?>
8
jfoutch

Dies ist ein perfekter Anwendungsfall für einen benutzerdefinierten Filter! Ich werde zuerst eine Methode beschreiben, die nicht der schnellste Weg ist, aber wahrscheinlich die sauberste und am leichtesten zu verstehende Methode für alle anderen, die Ihren Code lesen müssen. Ich werde auch einen "schmutzigeren" Weg beschreiben, der die Arbeit erledigen sollte, wenn Sie in einer Zeitnot stehen.

Schneller Weg:

Der Ort, an dem gesucht wird, wo dies angezeigt wird, befindet sich in der Datei:

/wp-content/plugins/woocommerce/templates/single-product/add-to-cart/variable.php

In Zeile 27 wird je nach WooCommerce-Version etwa folgende Zeile angezeigt:

<option value=""><?php echo __( 'Choose an option', 'woocommerce' ) ?>&hellip;</option>

Die __ () - Funktion führt den ersten Parameter über das WordPress-Übersetzungssystem mit der Textdomäne "woocommerce" aus. Es ist am besten, die Möglichkeit der Übersetzung beizubehalten, so dass wir diesen Text ändern möchten, bevor wir ihn über die Übersetzungsfunktion senden. 

Diese Codezeile geschieht während einer Schleife, in der alle Produktvariationsattribute ausgegeben werden. Auf diese Weise können Sie leicht erkennen, welches Attribut ausgegeben wird, indem Sie die Variable $ name betrachten.

Wir müssen eine Funktion erstellen, die die Variable $ name aufnimmt und einen darauf basierenden String ausgibt. Es würde ungefähr so ​​aussehen:

function get_text_for_select_based_on_attribute($attribute) {

// Find the name of the attribute for the slug we passed in to the function
$attribute_name = wc_attribute_label($attribute);

// Create a string for our select
$select_text = 'Select a ' . $attribute_name;

// Send the $select_text variable back to our calling function
return $select_text;
}

Nun, vor dem Code in Zeile 27 von variable.php, können wir etwas wie folgt setzen:

<?php 

  $select_text = get_text_for_select_based_on_attribute($name);

?>

Dann tauschen Sie einfach 'Choose a option' mit Ihrer $ select_text-Variablen aus:

<option value=""><?php echo __( $select_text, 'woocommerce' ) ?>&hellip;</option>

Vergessen Sie nicht, dies alles in einer überschriebenen Vorlage zu tun, da sonst Ihre Anpassungen beim nächsten Update verloren gehen!

http://docs.woothemes.com/document/template-structure/

Cleaner Way:

Eine bessere und erweiterbarere Methode besteht darin, einen benutzerdefinierten Filter hinzuzufügen, um dies durchzuleiten. Dies ist ein paar zusätzliche Schritte, aber Sie können problemlos weitere benutzerdefinierte Logik hinzufügen, wenn Sie die Funktionalität je nach Produkt von Fall zu Fall überschreiben möchten. 

Erstellen Sie zunächst einen benutzerdefinierten Filter mit einem semantisch sinnvollen Namen, und fügen Sie ihn für das Thema irgendwo in Ihre Datei "functions.php" ein:

add_filter('variable_product_select_text', 'get_text_for_select_based_on_attribute', 10, 1);

Übergeben Sie die Funktion dann in der Datei variable.php, anstatt die Funktion direkt aufzurufen, durch Ihren neuen Filter:

$select_text = apply_filters('variable_product_select_text', $name);

Das Einrichten von benutzerdefinierten Filtern für solche Dinge dauert etwas länger, aber Sie profitieren von der Wartungsfreundlichkeit, da Sie Funktionen stapeln oder deaktivieren können, ohne den vorhandenen Code weiter bearbeiten zu müssen.

Update für WC 2.4

Mit Version 2.4 von WooCommerce werden Attribute und zugehörige Auswahlmöglichkeiten auf andere Weise abgerufen. Da sie noch keinen Filter dafür bereitgestellt haben, würde ich empfehlen, die Funktion wc_dropdown_variation_attribute_options mit den oben beschriebenen Methoden zu überschreiben. Kopieren Sie die gesamte Funktion und fügen Sie sie ab der Deklaration in die functions.php-Datei Ihres Themas ein. Fügen Sie dann eine Variable für den Auswahltext hinzu, wenn es sich nicht um Farbe oder Größe handelt:

//Don't include the if(!function_exists(...) part.

wc_dropdown_variation_attribute_options($args = array()) {
  // Uses the same function as above, or optionally a custom filter
  $select_text = get_text_for_select_based_on_attribute($args['attribute']);

  wc_dropdown_variation_attribute_options( $args = array() ) {
    $args = wp_parse_args( $args, array(
        'options'          => false,
        'attribute'        => false,
        'product'          => false,
        'selected'         => false,
        'name'             => '',
        'id'               => '',
        'class'            => '',
        'show_option_none' => __( $select_text, 'woocommerce' ),
        'show_option_color' => __( 'Choose a color', 'woocommerce' ),
        'show_option_size' => __( 'Choose a size', 'woocommerce' )
    ) );
// Put the rest of the function here
10
Josh LaBau

Es gibt tatsächlich eine einfachere Möglichkeit, es anzupassen.

Wenn Sie einen Blick auf die zentrale WC-Datei wc-template-functions.php werfen, sehen Sie, dass das Array in der Funktion wc_dropdown_variation_attribute_options tatsächlich seine Argumente mit den folgenden Schlüsselwertpaaren ist:

'options'          => false,
'attribute'        => false,
'product'          => false,
'selected'         => false,
'name'             => '',
'id'               => '',
'class'            => '',
'show_option_none' => __( 'Choose an option', 'woocommerce' )

Jetzt müssen Sie nur noch dasselbe Schlüsselwertpaar in der Funktion in der Vorlagendatei variable.php ändern. Also wollte ich die Dropdown-Beschriftung anstelle des Textes Choose An Option anzeigen, damit ich die Fu wechsle

wc_dropdown_variation_attribute_options(
    array(
         'options' => $options,
         'attribute' => $attribute_name,
         'product' => $product,
         'selected' => $selected,
         'show_option_none' => wc_attribute_label( $attribute_name )
    )
);

Gleiches gilt für andere Paare. Hoep das hilft. Das funktioniert übrigens nur in WC 2.4+, seien Sie also vorsichtig.

6
Hooman Askari

Ich habe einen Weg mit WC 2.5 gefunden. Fügen Sie dies zu functions.php hinzu:

function my_dropdown_variation_attribute_options_html($html, $args){
    $html = str_replace('Choose an option', 'Choose', $html);
    return $html;
}
add_filter('woocommerce_dropdown_variation_attribute_options_html', 'my_dropdown_variation_attribute_options_html', 10, 2);
5
Marc

Ich habe dies mit einer Kombination der anderen Antworten hier gemacht und es hat gut für mich funktioniert. 

Dies wurde mit WooCoommerce 3.3.5 durchgeführt und es wird davon ausgegangen, dass der Filter erst kürzlich hinzugefügt wurde. 

Sie verwenden den Filter für die Funktion wc_dropdown_variation_attribute_options()

// define the woocommerce_dropdown_variation_attribute_options_args callback 
function filter_woocommerce_dropdown_variation_attribute_options_args( $array ) { 

    // Find the name of the attribute for the slug we passed in to the function
    $attribute_name = wc_attribute_label($array['attribute']);

    // Create a string for our select
    $select_text = 'Select a ' . $attribute_name;

    $array['show_option_none'] = __( $select_text, 'woocommerce' );
    return $array; 
}; 

// add the filter 
add_filter( 'woocommerce_dropdown_variation_attribute_options_args', 'filter_woocommerce_dropdown_variation_attribute_options_args', 10, 1 ); 

Hoffe das hilft jemandem. 

4
Joe

Hier ist eine recht einfache Lösung für WC> 2.4, die das Umschreiben von Funktionen und das Durcheinander von Funktionen verhindert.php ..

Fügen Sie die Datei variable.php Ihrem Thema hinzu ( http://docs.woothemes.com/document/template-structure/ ) und ändern Sie dies (ab Zeile 27):

<?php foreach ( $attributes as $attribute_name => $options ) : ?>
<tr>
    <td class="label"><label for="<?php echo sanitize_title( $attribute_name ); ?>"><?php echo wc_attribute_label( $attribute_name ); ?></label></td>
    <td class="value">
        <?php
            $selected = isset( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ? wc_clean( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) : $product->get_variation_default_attribute( $attribute_name );
            wc_dropdown_variation_attribute_options( array( 'options' => $options, 'attribute' => $attribute_name, 'product' => $product, 'selected' => $selected ) );
            echo end( $attribute_keys ) === $attribute_name ? '<a class="reset_variations" href="#">' . __( 'Clear selection', 'woocommerce' ) . '</a>' : '';
        ?>
    </td>
</tr><?php endforeach;?>

zu diesem:

<?php 
$variations_arr = array();
foreach ( $attributes as $attribute_name => $options ) : 
    ob_start(); ?>
    <tr>
        <td class="label"><label for="<?php echo sanitize_title( $attribute_name ); ?>"><?php echo wc_attribute_label( $attribute_name ); ?></label></td>
        <td class="value">
            <?php $selected = isset( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ? wc_clean( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) : $product->get_variation_default_attribute( $attribute_name );
            wc_dropdown_variation_attribute_options( array( 'options' => $options, 'attribute' => $attribute_name, 'product' => $product, 'selected' => $selected ) );
            echo end( $attribute_keys ) === $attribute_name ? '<a class="reset_variations" href="#">' . __( 'Clear selection', 'woocommerce' ) . '</a>' : ''; ?>
        </td>
    </tr>
    <?php $variations_ob = ob_get_clean();
    $variations_arr[wc_attribute_label($attribute_name)] = $variations_ob;
endforeach;

foreach ($variations_arr as $name => $ob) {
    echo str_ireplace('choose an option', 'Choose '.$name, $ob );
} ?>

Dies ersetzt 'Wählen Sie eine Option' durch 'Größe auswählen', 'Farbe wählen' usw., abhängig vom Namen Ihres Attributs.

2
tommm

Wenn Sie den Dropdown-Text aus "Wählen Sie eine Option" in Woocommerce ändern möchten, fügen Sie der Datei "functions.php" in Ihrem Design Folgendes hinzu:

add_filter('woocommerce_dropdown_variation_attribute_options_args', 'my_change_choose_an_option_text_func', 10, 2);

function my_change_choose_an_option_text_func($args){ 
    $args['show_option_none'] = __( 'New Text', 'your_text_domain' ); 
    return $args; 
}
1
Sigma Wadbude

Wenn Sie sich fragen, wie Sie „Wählen Sie eine Option“ durch den entsprechenden Attribut-/Variationsnamen ersetzen können, können Sie Folgendes tun: Edit variable.php und suchen Sie den Code wie unten gezeigt

Öffnen Sie die Datei variable.php (wp-content/plugins/woocommerce/includes/variable.php) in Ihrem Woocommerce und ändern Sie diese (von Zeile 41 in 43): (Entfernen Sie diesen 3-Zeilencode)

$selected = isset( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ? wc_clean( urldecode( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ) : $product->get_variation_default_attribute( $attribute_name );
wc_dropdown_variation_attribute_options( array( 'options' => $options, 'attribute' => $attribute_name, 'product' => $product, 'selected' => $selected ) );
echo end( $attribute_keys ) === $attribute_name ? apply_filters( 'woocommerce_reset_variations_link', '<a class="reset_variations" href="#">' . __( 'Clear', 'woocommerce' ) . '</a>' ) : '';

Dann fügen Sie diesen Code hinzu

wc_dropdown_variation_attribute_options
array( 'options' => $options,
'attribute' => $attribute_name,
'product' => $product,
'selected' => $selected,
'show_option_none'=> wc_attribute_label( $attribute_name )
) );

Es funktioniert alle WordPress-Version Danke

0
Savan Dholu