我想显示"属性"在woocommerce产品管理部分的下拉列表中按特定顺序。,尚未按正确的顺序输入属性。现在要重做它已经太晚了,所以我想在它们应该出现的下拉菜单中列出它们。输入数据的人在此列表中向上和向下滚动太费时间了。如果它们已经按照正确的顺序会更快。我已经看到如何强制它们在前端以特定顺序显示但不在管理部分中显示 - 谢谢
答案 0 :(得分:3)
答案 1 :(得分:2)
运行此代码一次,然后将其删除。因此,将其加载到插件中,激活插件,然后停用。我想过自动停用或创建一次瞬态运行,但我会让你处理它。如果代码第一次不正确,那些实际上可能会很麻烦。
如果商店经理将来以错误的顺序添加属性,也许您可以调整第二个功能以便在save_post
上运行或替换attributes_cmp()
。实际上是一个名为update_post_metadata
的过滤器,它允许您在每次更新帖子并保存元时始终如一地应用此过滤器。
警告备份您的数据库!此代码具有破坏性,将永久更改您的数据库并且除了看到新的排序功能在演示阵列上工作之外,未已经过测试。使用风险由您自己承担。
function so_35733629_update_products(){
$args = array(
'posts_per_page' => -1,
'meta_value' => '',
'post_type' => 'product',
'post_status' => 'any',
);
$products_array = get_posts( $args );
foreach( $products_array as $product ){
$attributes = get_post_meta( $product->ID, '_product_attributes', true );
if( ! empty( $atttributes ) ){
$attributes = so_35733629_reorder_attributes( $attributes );
update_post_meta( $product->ID, '_product_attributes', $attributes );
}
}
}
add_action( 'admin_init', 'so_35733629_update_products' );
function so_35733629_reorder_attributes( $attributes ){
// here is the desired order
$order = array(
'pa_maker',
'pa_model-name',
'pa_man-lady',
'pa_model-case-ref',
'pa_case-serial'
);
$new_attributes = array();
// create new array based on order of $order array
foreach( $order as $key ){
if( isset( $attributes[$key] ) ){
// add to new attributes array
$new_attributes[$key] = $attributes[$key];
// remove from the attributes array
unset( $attributes[$key] );
}
}
// merge any leftover $attributes in at the end so we don't accidentally lose anything
$new_attributes = array_merge( $new_attributes, $attributes );
// set the new position keys
$i = 0;
foreach( $new_attributes as $key => $attribute ){
// update the position
$new_attributes[$key]['position'] = $i;
$i++;
}
return $new_attributes;
}