मैंने एक कस्टम फ़ंक्शन के साथ WooCommerce एकल उत्पाद पृष्ठ पर छह कस्टम विशेषताएँ बनाईं। उनमें शामिल हैं: एक आइकन, एक लेबल और शर्तें।

पर आधारित WooCommerce विशेषता बदलें प्रत्येक उत्तर कोड के लिए एक कस्टम छवि द्वारा लेबल, मैंने निम्नलिखित फ़ंक्शन का उपयोग किया (कस्टम HTML मार्कअप के साथ, WooCommerce product-attributes.php टेम्पलेट में मार्कअप से अलग) :

add_action('woocommerce_single_product_summary', 'pa_custom_attributes', 25);
function pa_custom_attributes(){
    global $product;

    $attributes = $product->get_attributes();

    if ( ! $attributes ) return;

    $out = '<div class="custom-attributes">';

    foreach ( $attributes as $attribute ) {

        if ( $attribute->get_variation() ) continue;

        if ( $attribute->is_taxonomy() ) {
            
            $taxonomy = $attribute->get_name();
            $taxo_obj = $attribute->get_taxonomy_object();
            $name = $taxo_obj->attribute_name;
            $label = $taxo_obj->attribute_label;
            $label_name = wc_attribute_label( $taxonomy );

            $out .= '<div class="' . esc_attr( $taxonomy ) . ' single-attribute">';

            $out .= '<div><img class="attribute-image" src="'.get_stylesheet_directory_uri().'/woocommerce/attributes/'.$name.'.svg" alt="Attribute '.$label.'"/></div>';

            $out .= '<div class="attribute-label '.$label.'">'.$label_name.'</div>';
            
            $out .= '<div class="attribute-values">';

            $terms = wp_get_post_terms( $product->get_id(), $taxonomy, array('fields' => 'names') );

            foreach ( $terms as $term_name )
                $term_names['names'] = $term_name;

            $out .= implode(', ', $term_names);
            $out .= '</div></div>';

        } else {
            $value_string = implode( ', ', $attribute->get_options() );
            $out .= '<div class="' . sanitize_title($taxonomy) . ' ' . sanitize_title( $value_string ) . '">';
            $out .= '<div class="attribute-label">' . $taxonomy . ': </div> ';
            $out .= '<div class="attribute-value">' . esc_html( $value_string ) . '</div></div>';
        }
    }
    $out .= '</div>';

    echo $out;
}

फ़ंक्शन सही ढंग से काम करता है, लेकिन इसमें एक समस्या है: यदि किसी विशिष्ट विशेषता की शर्तें एक से अधिक हैं (जैसे रंग: लाल, नीला, हरा), स्क्रीन पर फ़ंक्शन केवल सरणी के अंतिम मान को प्रिंट करता है।

मैंने प्रलेखन पढ़ा और कई परीक्षण किए और जाँच की कि सीएसएस पर कोई समस्या नहीं है। मैंने यहां स्टैक ओवरफ्लो और ऑनलाइन पर इस विषय पर प्रश्नों के प्रत्येक उत्तर को व्यावहारिक रूप से पढ़ा लेकिन मुझे कोई उत्तर नहीं मिला।

क्या कोई है जो मुझे यह समझने में मदद कर सकता है कि त्रुटि कहाँ है?

2
Wonderer 22 जून 2020, 18:55

1 उत्तर

सबसे बढ़िया उत्तर

समस्या आपके कोड में निम्नलिखित से आती है:

            $terms = wp_get_post_terms( $product->get_id(), $taxonomy, array('fields' => 'names') );

            foreach ( $terms as $term_name )
                $term_names['names'] = $term_name;

            $out .= implode(', ', $term_names);

कि आप इसे इससे प्रतिस्थापित कर सकते हैं:

            $terms = wp_get_post_terms( $product->get_id(), $taxonomy, array('fields' => 'names') );

            $term_names = []; // Initializing

            // Loop through each terms
            foreach ( $terms as $term_name ) {
                $term_names[] = $term_name;
            }

            $out .= implode(', ', $term_names);

या कोड की एक पंक्ति के साथ और भी बेहतर:

            $out .= $product->get_attribute( $taxonomy );
2
LoicTheAztec 23 जून 2020, 01:22