在我的商店中,我有一个名为“件”的属性,phpmyadmin在wp_postmeta中将其列为“ pa_pieces”。 我的商店列出了玩具,因此我希望能够按件数/属性对其进行排序。因此,我的意思是不是要按价格从低到高的顺序排序,我要按件数添加排序。它应该在每个商店页面上都可用。
我在网上找到了下面的代码(实际上是最近的代码),并将其添加到functions.php中,并以我的分类名称进行了修改。将显示我的排序选项的名称,但是当我尝试对其进行排序时,它仅显示“找不到与您的选择匹配的产品”。 我更新了产品,每个项目至少包含1件。
我知道woocommerce / wordpress有一个过滤器,在这里我可以过滤以仅显示选定数量的片段。但是,使用大约500个不同的值实际上不是一个选择。
感谢您的帮助。
/**
* Save product attributes to post metadata when a product is saved.
*
* @param int $post_id The post ID.
* @param post $post The post object.
* @param bool $update Whether this is an existing post being updated or not.
*
* Refrence: https://codex.wordpress.org/Plugin_API/Action_Reference/save_post
*/
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 lenght (int)
case 'pa_length':
if (!empty($attribute_values[$key][0])) {
update_post_meta($post_id, 'pa_length', $attribute_values[$key][0]);
}
break;
default:
break;
}
}
}
}
add_action( 'save_post', 'wh_save_product_custom_meta', 10, 3);
/**
* Main ordering logic for orderby attribute
* Refrence: https://docs.woocommerce.com/document/custom-sorting-options-ascdesc/
*/
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';
break;
case 'pa_length_desc' :
$args['order'] = 'DESC';
$args['meta_key'] = 'pa_length';
$args['orderby'] = 'meta_value_num';
break;
}
}
return $args;
}
/**
* Lets add the created sorting order to the dropdown list.
* Refrence: http://hookr.io/filters/woocommerce_catalog_orderby/
*/
//To under Default Product Sorting in Dashboard > WooCommerce > Settings > Products > Display.
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 pieces: Low - High';
$sortby['pa_length_desc'] = 'Sort by pieces: High - Low';
return $sortby;
}