Casse et tableau de variation woocommerce.

  • Statut : non résolu
15 sujets de 16 à 30 (sur un total de 31)
  • Auteur
    Messages
  • #982518
    didier07
    Participant
    Maître WordPress
    1965 contributions

    La réponse que tu cites est un autre plugin pour faire la même chose dans un tableau de livraison.
    A 2h hier, j’ai pas commencé à recoder code du premier lien. Je vais voir d’ici demain peut-être

    Didier

    #982519
    snkarius
    Membre
    Initié WordPress
    44 contributions

    Voici le code que j’utilise, il y a des modifs par rapport au code original

    <?php
    /**
     * WooCommerce Variations Add-to-Cart
     * 
     * Changes the default add-to-cart scheme for variable products to a grid-style, with one add-to-cart button.
     * 
     * 
     *
     * @author Shawn Wernig, Eggplant Studios, www.eggplantstudios.ca
     * @version 1
     */
     
     
    /*
    Plugin Name: Eggplant Variations Add-to-Cart
    Plugin URI: http://www.eggplantstudios.ca
    Description: This plugin changes the default add-to-cart scheme for variable products to a grid-style, with one add-to-cart button.
    Version: 1.0.0
    Author: Shawn Wernig http://www.eggplantstudios.ca
    License: GPLv2 or later
    License URI: http://www.gnu.org/licenses/gpl-2.0.html
    */
    
    
    
    
    if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
     
    add_action( 'init', 'eps_variations_init' );
    function eps_variations_init() {
        remove_action( 'woocommerce_variable_add_to_cart', 'woocommerce_variable_add_to_cart', 30 );
        add_action( 'woocommerce_variable_add_to_cart', 'eps_variable_add_to_cart', 30 );
    }
    
     
     
     
     // Display Fields
    add_action( 'woocommerce_product_options_general_product_data', 'eps_advanced_fields' );
    function eps_advanced_fields() {
      global $woocommerce, $post;
      echo '<div class="options_group">‘;
    
      
        woocommerce_wp_select( 
        array( 
            ‘id’      => ‘eps_add_to_cart_active’, 
            ‘label’   => __( ‘Use EPS Add to Cart’, ‘woocommerce’ ), 
            ‘options’ => array(
                ‘false’   => __( ‘Yes’, ‘woocommerce’ ),
                ‘true’   => __( ‘No’, ‘woocommerce’ )
                )
            )
        );
        
        woocommerce_wp_select( 
        array( 
            ‘id’      => ‘eps_add_to_cart_thumbnails’, 
            ‘label’   => __( ‘Show Grid Thumbnails’, ‘woocommerce’ ), 
            ‘options’ => array(
                ‘false’   => __( ‘No’, ‘woocommerce’ ),
                ‘true’   => __( ‘Yes’, ‘woocommerce’ )
                )
            )
        );
        
        woocommerce_wp_select( 
        array( 
            ‘id’      => ‘eps_add_to_cart_skus’, 
            ‘label’   => __( ‘Show Grid SKUs’, ‘woocommerce’ ), 
            ‘options’ => array(
                ‘true’   => __( ‘Yes’, ‘woocommerce’ ),
                ‘false’   => __( ‘No’, ‘woocommerce’ )
                )
            )
        );
        
        echo ‘</div>‘;
     
    }
    
    
    
    // Save Fields
    add_action( ‘woocommerce_process_product_meta’, ‘eps_advanced_fields_save’ );
    function eps_advanced_fields_save( $post_id ) {
    
        if( !empty( $_POST[‘eps_add_to_cart_active’] ) )
            update_post_meta( $post_id, ‘eps_add_to_cart_active’, esc_attr( $_POST[‘eps_add_to_cart_active’] ) );
        if( !empty( $_POST[‘eps_add_to_cart_thumbnails’] ) )
            update_post_meta( $post_id, ‘eps_add_to_cart_thumbnails’, esc_attr( $_POST[‘eps_add_to_cart_thumbnails’] ) );
        if( !empty( $_POST[‘eps_add_to_cart_skus’] ) )
            update_post_meta( $post_id, ‘eps_add_to_cart_skus’, esc_attr( $_POST[‘eps_add_to_cart_skus’] ) );
    }
    
    function find_valid_variations() {
        global $product;
        
        $variations = $product->get_available_variations();
        $attributes = $product->get_attributes();
        $new_variants = array();
        
        // Loop through all variations
        foreach( $variations as $variation ) {
            
            // Peruse the attributes. 
            
            // 1. If both are explicitly set, this is a valid variation
            // 2. If one is not set, that means any, and we must ‘create’ the rest.
            
            $valid = true; // so far
            foreach( $attributes as $slug => $args ) {
                if( array_key_exists(« attribute_$slug », $variation[‘attributes’]) && !empty($variation[‘attributes’][« attribute_$slug »]) ) {
                    // Exists
                    
                } else {
                    // Not exists, create
                    $valid = false; // it contains ‘anys’
                    // loop through all options for the ‘ANY’ attribute, and add each
                    foreach( explode( ‘|’, $attributes[$slug][‘value’]) as $attribute ) {
                        $attribute = trim( $attribute );
                        $new_variant = $variation;
                        $new_variant[‘attributes’][« attribute_$slug »] = $attribute;
                        $new_variants[] = $new_variant;
                    }
                    
                }
            }
            
            // This contains ALL set attributes, and is itself a ‘valid’ variation.
            if( $valid ) 
                $new_variants[] = $variation;
            
        }
        
        return $new_variants;
    }
    
    
    
    function eps_variable_add_to_cart(){
        global $woocommerce, $product, $post;
    	$product_attributes = $product->get_attributes();        
        
        // Check if the special ‘price_grid’ meta is set, if it is, load the default template:
        if ( get_post_meta( get_the_ID(), ‘eps_add_to_cart_active’,true) === ‘true’ ) {
            // Enqueue variation scripts
            wp_enqueue_script( ‘wc-add-to-cart-variation’ );
    
            // Load the template
            wc_get_template( ‘single-product/add-to-cart/variable.php’, array(
                    ‘available_variations’  => $product->get_available_variations(),
                    ‘attributes’            => $product->get_variation_attributes(),
                    ‘selected_attributes’   => $product->get_variation_default_attributes()
                ) );
            return;
        }       
        
        
        // Cool, lets do our own template! 
        $variations = find_valid_variations();
        ?>
        <form class="cart" action="add_to_cart_url() ); ?> » method= »post » enctype=’multipart/form-data’>
        
        <table class="variations variations-grid en-variations-table" cellspacing="0">
            <tbody>
    			<thead>			
    			<tr>
    			 $options) :?>
    			<th style="padding-top:5px;padding-bottom:3px;background-color:#eee;border:1px solid #dbdbdb;text-align:center">
    			attribute_label($name);
    			$attr_name = $options[‘name’];
    			if (0 === strpos($attr_name, ‘pa_’)){
    			$attr_name = $woocommerce->attribute_label($attr_name);
    			}
    			echo $attr_name;
    			?>
    			</th>
    			
    			<th style="padding-top:5px;padding-bottom:3px;background-color:#eee;border:1px solid #dbdbdb;text-align:center"></th>
    			<th style="padding-top:5px;padding-bottom:3px;background-color:#eee;border:1px solid #dbdbdb;text-align:center"></th>
    			</tr>
    			</thead>
                 $value) {
                    if( !$value[‘variation_is_visible’] ) continue;
                ?>
    			<tr>
    <!--  ************************************** Copied show_skus placed here -->
    			<?php
                    if( $show_skus === 'true' || $show_skus === false  ) {
                        printf( '<td>%s</td>‘, $value[‘sku’] );
                        }
                    ?>
                    <?php
                    if( $show_thumbnails === 'true' || $show_thumbnails === false ) {
                        if ( isset( $value['image_src'] ) && !empty( $value['image_src'] )) {
                            echo sprintf( '<td><img src="%s" alt="%s" width="50"></td>‘, $value[‘image_src’], $value[‘image_title’] );
                        } else {
                            echo sprintf( ‘<td><img src="%s" alt="%s" width="50"></td>‘, wc_placeholder_img_src(), $value[‘image_title’] );
                        }
                    }
                    ?>
                         $attr_value ) {
    	                    $attr_value = str_replace(array(‘-‘,’_’), ‘ ‘, $attr_value);
    						if (strpos($attr_name, ‘_pa_’)){ // variation is a pre-definted attribute
    						$attr_name = substr($attr_name, 10);
    						$attr = get_term_by(‘slug’, $attr_value, $attr_name);
    						$attr_value = $attr->attribute_name($attr_value);
    						
    						} else { // variation is a custom attribute
    						//$attr = maybe_unserialize( get_post_meta( $post->ID, ‘_product_attributes’ ) );
    						//$attr_value = var_dump($attr);
    						//$attr = get_term_by(‘slug’, $attr_value, $attr_name);
    						//$attr_value = $attr->name;
    						} ?> 
    						
    						 <?php echo '<td>‘, $attr_value, ‘</td>‘;} ?>
    						
    				
                    <td>
                        
                    </td>
    <!--  ************************************** Original show_skus position -->
    				<td>
                        
                            
                            
                            <div class="quantity buttons_added">
                                
                                <input type="number" step="1" name="multi_add_to_cart[][quantity] » value= »0″ title= »Qty » class= »input-text qty text » size= »4″/>
                                
                            </div>
    
                             $attr_value) {
                                ?>
                                <input type="hidden" name="multi_add_to_cart[][attributes][] » value= » »>
                                
                            <input type="hidden" name="multi_add_to_cart[][variation_id] » value= » » />
                            <input type="hidden" name="multi_add_to_cart[][product_id] » value= »ID ); ?> » />
                            <input type="hidden" name="multi_add_to_cart[][add-to-cart] » value= »ID ); ?> » />
                        
                            <p class="stock out-of-stock"></p>
                        
                    </td>
                </tr>
                
            </tbody>
        </table>
        
        <button type="submit" class="single_add_to_cart_button btn btn-primary">Ajouter au panier</button>
    
        </form>
    
         $variation ) {
            if( (int) $variation[‘quantity’] > 0 ) {
    
                $woocommerce->cart->add_to_cart(
                        $variation[‘product_id’],   // string $product_id
                        $variation[‘quantity’],     // string $quantity = 1
                        (int) $variation_id,        // integer $variation_id =  »
                        ( isset($variation[‘attributes’]) && !empty($variation[‘attributes’]) ) ? $variation[‘attributes’] : false // Attributes!
                );
               $added_products ++;
                
            }
        }
        if( $added_products > 0 )  woocommerce_add_to_cart_message( $variation[‘product_id’] );
    }
    
    }

    #982520
    didier07
    Participant
    Maître WordPress
    1965 contributions

    C’est dans la fonction find_valid_variations() qu’il faut récupérer les infos de départ. Je vais regarder rapidement mais je ne sais pas encore quand. J’ai des bricoles à faire pour clients avant

    #982521
    snkarius
    Membre
    Initié WordPress
    44 contributions

    Merci Didier pour cette aide!
    Ce n’est donc pas à cause des slug?

    #982522
    didier07
    Participant
    Maître WordPress
    1965 contributions

    Si le slug est une version normalisée du nom compatible avec une url donc tous les espaces sont remplacés par des – et tout est mis en minuscule. Lui ne récupère que le slug et cherche à recréer le nom avec ça. La casse est perdu dans l’opération.

    #982523
    snkarius
    Membre
    Initié WordPress
    44 contributions

    Qu’elqu’un a une idée concernant le fait de pouvoir afficher le nom complet des attributs en lieu et place des slug qui ne permettent pas d’afficher le format saisi à l’origine dans les variations?

    #982524
    didier07
    Participant
    Maître WordPress
    1965 contributions

    J’ai cherché un bon moment hier. C’est des informations qui ne sont enregistrées que dans la table terms de wordpress mais pas avec les infos d’attributs woocommerce. I faut utiliser les fonctions du core de wordpress comme get_the_terms() par exemple.
    J’ai pas poussé la solution jusqu’au bout pour le moment.

    #982525
    snkarius
    Membre
    Initié WordPress
    44 contributions

    Merci!

    Si d’autre on des idées je suis preneur, sachant que les « , » disparaissent aussi, c’est vraiment un problème pour moi…

    #982526
    didier07
    Participant
    Maître WordPress
    1965 contributions

    C’est la qu’on voit les limites d’un plugins par rapport à un vrai cms ecommerce !
    Woocommerce gère les attributs produit par produit, et QUE par les slugs des valeurs rentrées. Pour afficher une valeur, il repart du slug pour recréer une donnée, mais il perd les accents, les ‘, ‘les ‘)’ etc…:fire:

    Pour arriver à ce que tu veux, il faut définir les attributs dans l’onglet dédié du menu produit de woocommerce avec EXACTEMENT le même slug.

    Ensuite, il faut aller chercher dans la table term le libellé qu’on veut par la fonction get_terms

    #982527
    snkarius
    Membre
    Initié WordPress
    44 contributions

    Prenons le problème autrement.

    Est-il possible de protéger les caractères spéciaux pour qu’il soit enregistrés dans le slug. Ainsi je n’aurais à modifier que mes saisies d’attributs. Par exemple avec un code à insérer pour un « , » ou un m »² » (mettre carré)…

    Merci de votre aide, je ne suis pas expert en php et la manipulation des fonction ne m’indique pas comment faire…

    #982528
    snkarius
    Membre
    Initié WordPress
    44 contributions

    Voici le code de Woocommerce original qui gère les variation non pas en tableau mais en listes déroulante, la casse est bien respectée:

    if ( ! defined( ‘ABSPATH’ ) ) exit; // Exit if accessed directly
    
    global $product, $post;
    ?>
    
    
    
    <form class="variations_form cart" method="post" enctype='multipart/form-data' data-product_id="ID; ?> » data-product_variations= » »>
    	
    		<table class="variations" cellspacing="0">
    			<tbody>
    				 $options ) : $loop++; ?>
    					<tr>
    						<td class="label"><label for=" »></label></td>
    						<td class="value"><select id=" » name= »attribute_ »>
    							…
    							 ‘name’, ‘hide_empty’ => false, ‘menu_order’ => false );
    											break;
    											case ‘id’ :
    												$args = array( ‘orderby’ => ‘id’, ‘order’ => ‘ASC’, ‘menu_order’ => false, ‘hide_empty’ => false );
    											break;
    											case ‘menu_order’ :
    												$args = array( ‘menu_order’ => ‘ASC’, ‘hide_empty’ => false );
    											break;
    										}
    
    										$terms = get_terms( sanitize_title( $name ), $args );
    
    										foreach ( $terms as $term ) {
    											if ( ! in_array( $term->slug, $options ) )
    												continue;
    
    											echo ‘slug ) . ‘ » ‘ . selected( sanitize_title( $selected_value ), sanitize_title( $term->slug ), false ) . ‘>’ . apply_filters( ‘woocommerce_variation_option_name’, $term->name ) .  »;
    										}
    									} else {
    
    										foreach ( $options as $option ) {
    											echo  » . esc_html( apply_filters( ‘woocommerce_variation_option_name’, $option ) ) .  »;
    										}
    
    									}
    								}
    							?>
    						 <?php
    							if ( sizeof( $attributes ) == $loop )
    								echo '<a class="reset_variations" href="#reset">‘ . __( ‘Clear selection’, ‘woocommerce’ ) . ‘</a>‘;
    						?></td>
    					</tr>
    		        
    			</tbody>
    		</table>
    
    		
    
    		<div class="single_variation_wrap">
    			
    
    			<div class="single_variation"></div>
    
    			<div class="variations_button">
    				
    				<button type="submit" class="single_add_to_cart_button button alt">single_add_to_cart_text(); ?></button>
    			</div>
    
    			<input type="hidden" name="add-to-cart" value="id; ?> » />
    			<input type="hidden" name="product_id" value="ID ); ?> » />
    			
    
    			
    		</div>
    
    		
    
    	
    
    		<p class="stock out-of-stock"></p>
    
    	
    
    </form>

    Comment intégrer cela dans mon code?

    #982529
    didier07
    Participant
    Maître WordPress
    1965 contributions
    snkarius wrote:
    Prenons le problème autrement.

    Est-il possible de protéger les caractères spéciaux pour qu’il soit enregistrés dans le slug. Ainsi je n’aurais à modifier que mes saisies d’attributs. Par exemple avec un code à insérer pour un « , » ou un m »² » (mettre carré)…

    Merci de votre aide, je ne suis pas expert en php et la manipulation des fonction ne m’indique pas comment faire…

    C’est pas possible

    Il faut remplacer la fonction find_valid_variations d’origine par

    private function get_valid_variations() {
    		global $product;
    
    		$variations = $product->get_available_variations();
    		$attributes = $product->get_attributes();
    
    		foreach( $attributes as $attribute_slug => $s) {
    			$a = explode( WC_DELIMITER, $s[‘value’]);
    			$attributes_labels[  « attribute_$attribute_slug » ] = array_combine( array_map( ‘sanitize_title’, $a), array_map( ‘trim’, $a) );
    		}
    
    		$variants = array();
    
    		// Loop through all variations
    		foreach( $variations as $variation ) {
    			extract( $variation);
    
    		foreach( $variation[‘attributes’] as $attribute_slug => $attribute )
    				$variation[ ‘attributes’ ][ $attribute_slug ] = $attributes_labels[ $attribute_slug ][ $attribute ];
    			$variants[] = $variation;
    		}
    		return $variants;
    	}

    J’ai pas testé dans tous les cas mais ça devrait marcher

    #982530
    snkarius
    Membre
    Initié WordPress
    44 contributions

    Quand je remplace la fonction, le site ne charge plus. Page blanche…

    #982531
    didier07
    Participant
    Maître WordPress
    1965 contributions

    J’ai oublié de changer la premiere ligne
    Il faut mettre [c]function find_valid_variations {[/c] au lieu de [c]private function get_valid_variations() {[/c]

    #982532
    snkarius
    Membre
    Initié WordPress
    44 contributions

    CELA FONCTIONNE!!!!

    Merci Didier! Je te tiens au courant en cas de dysfonctionnement sur d’éventuels caractères mais tout à l’air d’aller!
    MERCI MERCI MERCI.

    Tu penses l’utiliser dans ton All in one hack?

15 sujets de 16 à 30 (sur un total de 31)
  • Vous devez être connecté pour répondre à ce sujet.