2016-06-15 9 views
0

In meinem WooCommerce Shop können Kunden nur ein Produkt kaufen. Sie können dieses einzelne Produkt mehrmals zum Einkaufswagen hinzufügen, aber mit unterschiedlichen benutzerdefinierten Metawerten. Kunden sind in der Lage, ihre Produkte aus dem Warenkorb (WooCommerce Standardfunktionalität) zu bearbeiten und die Meta ändern sie in ErstbefüllungWooCommerce erhalten Produkt benutzerdefinierte Meta aus Warenkorb

In meinem functions.php Ich habe den folgenden Code:.

function add_names_on_tshirt_field() { 
    global $post; 
    $name_one_on_tshirt = ""; 
    $name_two_on_tshirt = ""; 
    $name_three_on_tshirt = ""; 

    foreach (WC()->cart->cart_contents as $key => $value) { 
     if($value["product_id"] == $post->ID && isset($value["name_one_on_tshirt"])) { 
      $name_one_on_tshirt = $value["name_one_on_tshirt"]; 
     } 
     if($value["product_id"] == $post->ID && isset($value["name_two_on_tshirt"])) { 
      $name_two_on_tshirt = $value["name_two_on_tshirt"]; 
     } 
     if($value["product_id"] == $post->ID && isset($value["name_three_on_tshirt"])) { 
      $name_three_on_tshirt = $value["name_three_on_tshirt"]; 
     } 
    } 

    echo '<table class="variations" cellspacing="0"> 
     <tbody> 
      <tr> 
      <td class="label"><label for="color">Name 1 on T-Shirt</label></td> 
      <td class="value"> 
       <input type="text" name="name-one-on-tshirt" value="'. esc_attr($name_one_on_tshirt) .'" /> 
      </td> 
     </tr> 
     <tr> 
      <td class="label"><label for="color">Name 2 on T-Shirt</label></td> 
      <td class="value"> 
       <input type="text" name="name-two-on-tshirt" value="'. esc_attr($name_two_on_tshirt) .'" /> 
      </td> 
     </tr> 
     <tr> 
      <td class="label"><label for="color">Name 3 on T-Shirt</label></td> 
      <td class="value"> 
       <input type="text" name="name-three-on-tshirt" value="'. esc_attr($name_three_on_tshirt) .'" /> 
      </td> 
     </tr> 
     </tbody> 
    </table>'; 
} 
add_action('woocommerce_before_add_to_cart_button', 'add_names_on_tshirt_field'); 

Das Problem darin liegt, wenn Meine Kunden versuchen ein Produkt aus dem Warenkorb zu bearbeiten. Da alle Produkte dieselbe ID haben (ich habe nur ein Produkt), wird das Meta vom letzten Produkt, das dem Warenkorb hinzugefügt wurde, in die Textfelder geladen. Ich erhalte derzeit die Meta in meinem foreach mit der Produkt-ID, aber die ID ist die gleiche wie alle anderen Produkte in meinem Warenkorb. Gibt es eine andere Möglichkeit, die Meta ohne die product_id/$post->ID, wie die cart_item_key abrufen oder Sitzungen verwenden abrufen? Hier

Antwort

0

ist die Idee, wie man erreichen kann, dass

Sie haben wird bearbeiten your-theme/woocommerce/cart.php (vor allem Produkt-Thumbnail-TD und Produkt-Namen TD)

<?php 

$query_str = ""; 

if(isset($cart_item["name_one_on_tshirt"])) { 
    $query_str .= "?name_one_on_tshirt=" . $cart_item["name_one_on_tshirt"]; 
} 

if(isset($cart_item["name_two_on_tshirt"])) { 
    if($query_str == "") { 
     $query_str .= "?name_two_on_tshirt=" . $cart_item["name_two_on_tshirt"]; 
    } else { 
     $query_str .= "&name_two_on_tshirt=" . $cart_item["name_two_on_tshirt"]; 
    } 
} 

if(isset($cart_item["name_three_on_tshirt"])) { 
    if($query_str == "") { 
     $query_str .= "?name_three_on_tshirt=" . $cart_item["name_three_on_tshirt"]; 
    } else { 
     $query_str .= "&name_three_on_tshirt=" . $cart_item["name_three_on_tshirt"]; 
    } 
} 
?> 

<td class="product-thumbnail"> 
<?php 
$thumbnail = apply_filters('woocommerce_cart_item_thumbnail', $_product->get_image(), $cart_item, $cart_item_key); 

if (! $_product->is_visible()) { 
    echo $thumbnail; 
} else {  
    printf('<a href="%s">%s</a>', esc_url($_product->get_permalink($cart_item) . $query_str), $thumbnail);  
} 
?> 
</td> 

<td class="product-name" data-title="<?php _e('Product', 'woocommerce'); ?>"> 
    <?php 
     if (! $_product->is_visible()) { 
      echo apply_filters('woocommerce_cart_item_name', $_product->get_title(), $cart_item, $cart_item_key) . ' '; 
     } else {   
      echo apply_filters('woocommerce_cart_item_name', sprintf('<a href="%s">%s</a>', esc_url($_product->get_permalink($cart_item) . $query_str), $_product->get_title()), $cart_item, $cart_item_key);           
     } 
     // Meta data 
     echo WC()->cart->get_item_data($cart_item); 

      // Backorder notification 
     if ($_product->backorders_require_notification() && $_product->is_on_backorder($cart_item['quantity'])) { 
      echo '<p class="backorder_notification">' . esc_html__('Available on backorder', 'woocommerce') . '</p>'; 
     } 
    ?> 
</td> 

und aktualisieren Sie dann Ihre add_name_on_tshirt_field Funktion wie diese

function add_names_on_tshirt_field() { 
    global $post; 
    $name_one_on_tshirt = ""; 
    $name_two_on_tshirt = ""; 
    $name_three_on_tshirt = ""; 

    if(isset($_GET["name_one_on_tshirt"])) { 
     $name_one_on_tshirt = $_GET["name_one_on_tshirt"]; 
    } 

    if(isset($_GET["name_two_on_tshirt"])) { 
     $name_two_on_tshirt = $_GET["name_two_on_tshirt"]; 
    } 

    if(isset($_GET["name_three_on_tshirt"])) { 
     $name_three_on_tshirt = $_GET["name_three_on_tshirt"]; 
    } 

    echo '<table class="variations" cellspacing="0"> 
     <tbody> 
      <tr> 
      <td class="label"><label for="color">Name 1 on T-Shirt</label></td> 
      <td class="value"> 
       <input type="text" name="name-one-on-tshirt" value="'. esc_attr($name_one_on_tshirt) .'" /> 
      </td> 
     </tr> 
     <tr> 
      <td class="label"><label for="color">Name 2 on T-Shirt</label></td> 
      <td class="value"> 
       <input type="text" name="name-two-on-tshirt" value="'. esc_attr($name_two_on_tshirt) .'" /> 
      </td> 
     </tr> 
     <tr> 
      <td class="label"><label for="color">Name 3 on T-Shirt</label></td> 
      <td class="value"> 
       <input type="text" name="name-three-on-tshirt" value="'. esc_attr($name_three_on_tshirt) .'" /> 
      </td> 
     </tr> 
     </tbody> 
    </table>'; 
} 
add_action('woocommerce_before_add_to_cart_button', 'add_names_on_tshirt_field'); 

Also im Grunde, was ich tat, ist, habe ich sie als Abfragevariable bei cart.php und in add_name_on_tshirt _field Ich überprüfe die entsprechende Abfrage var, wenn ich eine finde, können wir dieses Feld value Attribut füllen.