2017-01-30 4 views
1

Je travaille sur un site Web basé sur WooCommerce et essaye de comprendre comment commander mes produits par leur valeur d'attribut. J'ai regardé sur internet et n'arrive pas à trouver de solutions. Mes attributs ont des valeurs basées sur les nombres et je veux être capable de trier ces bas à haut. J'espère que cela a un sens.Trier par valeur d'attribut

Merci beaucoup pour la lecture de ce et ont une belle journée,

Sjoerd

Répondre

0
//Save product attributes to post metadata when a product is saved. 
add_action('save_post', 'wh_save_product_custom_meta', 10, 3); 
function wh_save_product_custom_meta($post_id, $post, $update) 
{ 
    $post_type = get_post_type($post_id); 
    // If this isn't a 'product' post, don't update it. 
    if ($post_type != 'product') 
     return; 

    if (!empty($_POST['attribute_names']) && !empty($_POST['attribute_values'])) 
    { 
     $attribute_names = $_POST['attribute_names']; 
     $attribute_values = $_POST['attribute_values']; 
     foreach ($attribute_names as $key => $attribute_name) 
     { 
      switch ($attribute_name) 
      { 
       //for length (int) 
       case 'pa_length': 
        if (!empty($attribute_values[$key][0])) 
        { 
         update_post_meta($post_id, 'pa_length', $attribute_values[$key][0]); 
        } 
        break; 
      } 
     } 
    } 
} 

//Main ordering logic for orderby attribute 
add_filter('woocommerce_get_catalog_ordering_args', 'wh_catalog_ordering_args'); 

function wh_catalog_ordering_args($args) 
{ 
    global $wp_query; 
    if (isset($_GET['orderby'])) 
    { 
     switch ($_GET['orderby']) 
     { 
      //for attribute/taxonomy=pa_length 
      case 'pa-length-asc' : 
       $args['order'] = 'ASC'; 
       $args['meta_key'] = 'pa_length'; 
       $args['orderby'] = 'meta_value_num'; //because length is an int 
       break; 
      case 'pa-length-desc' : 
       $args['order'] = 'DESC'; 
       $args['meta_key'] = 'pa_length'; 
       $args['orderby'] = 'meta_value_num'; //because length is an int 
       break; 
     } 
    } 
    return $args; 
} 

//Lets add the created sorting order to the dropdown list. 
add_filter('woocommerce_default_catalog_orderby_options', 'wh_catalog_orderby'); 
add_filter('woocommerce_catalog_orderby', 'wh_catalog_orderby'); 

function wh_catalog_orderby($sortby) 
{ 
    $sortby['pa-length-asc'] = 'Sort by Length: Small - Large'; 
    $sortby['pa-length-desc'] = 'Sort by Length: Large - Small'; 
    return $sortby; 
} 

Code va dans le fichier function.php de votre thème enfant actif (ou le thème). Ou encore dans tous les fichiers php plugin.
Le code a été testé et fonctionne.

Veuillez noter: Comme vous n'avez mentionné aucun nom de champ, j'ai donc écrit une réponse plus générale, si vous voulez une réponse spécifique, veuillez mettre à jour votre question avec votre nom d'attribut/slug. .

Référence: Custom Order By Attributes

+0

Je suis en train de tester cela avec une petite gamme de produits en ajoutant maintenant et en vérifiant si cela fonctionne vous reviendra bientôt. Merci d'avoir pris le temps en premier lieu! – Sjoerd89

+0

Comme posté pas sûr pourquoi cela ne fonctionne pas pour moi, j'ai re - ajouté des produits et la commande par est là. Mais quand je le commande, il change les produits mais pas par cet attribut. – Sjoerd89

+0

Avez-vous vérifié dans db ce qui est inséré dans la table 'wp_postmeta'? et pouvez-vous me donner une valeur d'attribut d'échantillon. –

0

//Save product attributes to post metadata when a product is saved. 
 
add_action('save_post', 'wh_save_product_custom_meta', 10, 3); 
 
function wh_save_product_custom_meta($post_id, $post, $update) 
 
{ 
 
    $post_type = get_post_type($post_id); 
 
    // If this isn't a 'product' post, don't update it. 
 
    if ($post_type != 'product') 
 
     return; 
 

 
    if (!empty($_POST['attribute_names']) && !empty($_POST['attribute_values'])) 
 
    { 
 
     $attribute_names = $_POST['attribute_names']; 
 
     $attribute_values = $_POST['attribute_values']; 
 
     foreach ($attribute_names as $key => $attribute_name) 
 
     { 
 
      switch ($attribute_name) 
 
      { 
 
       //for koppel (int) 
 
       case 'pa_nominaal-koppel-nm': 
 
        if (!empty($attribute_values[$key][0])) 
 
        { 
 
         update_post_meta($post_id, 'pa_nominaal-koppel-nm', $attribute_values[$key][0]); 
 
        } 
 
        break; 
 
      } 
 
     } 
 
    } 
 
} 
 

 
//Main ordering logic for orderby attribute 
 
add_filter('woocommerce_get_catalog_ordering_args', 'wh_catalog_ordering_args'); 
 

 
function wh_catalog_ordering_args($args) 
 
{ 
 
    global $wp_query; 
 
    if (isset($_GET['orderby'])) 
 
    { 
 
     switch ($_GET['orderby']) 
 
     { 
 
      //for attribute/taxonomy=pa_nominaal-koppel-nm 
 
      case 'pa-nominaal-koppel-nm-asc' : 
 
       $args['order'] = 'ASC'; 
 
       $args['meta_key'] = 'pa_nominaal-koppel-nm'; 
 
       $args['orderby'] = 'meta_value_num'; //because length is an int 
 
       break; 
 
      case 'pa-nominaal-koppel-nm-desc' : 
 
       $args['order'] = 'DESC'; 
 
       $args['meta_key'] = 'pa_nominaal-koppel-nm'; 
 
       $args['orderby'] = 'meta_value_num'; //because length is an int 
 
       break; 
 
     } 
 
    } 
 
    return $args; 
 
} 
 

 
//Lets add the created sorting order to the dropdown list. 
 
add_filter('woocommerce_default_catalog_orderby_options', 'wh_catalog_orderby'); 
 
add_filter('woocommerce_catalog_orderby', 'wh_catalog_orderby'); 
 

 
function wh_catalog_orderby($sortby) 
 
{ 
 
    $sortby['pa-nominaal-koppel-nm-asc'] = 'Sorteer op koppel: Small - Large'; 
 
    $sortby['pa-nominaal-koppel-nm-desc'] = 'Sorteer op koppel: Large - Small'; 
 
    return $sortby; 
 
}

donc je l'ai fait, avec "nominaal-Koppel nm" étant la taxonomie qui doit être triée. J'ai ré-ajouté un tas de produits à tester, mais il fait un peu de tri mais je ne sais pas ce qu'il trie. Parce que cet attribut n'est pas trié, du moins pas sur la valeur. Peut-être que je fais quelque chose de vraiment mal, mais je n'arrive pas à comprendre cela.