我想显示"属性"在woocommerce产品管理部分的下拉列表中按特定顺序排列

时间:2016-03-01 21:13:37

标签: woocommerce

我想显示"属性"在woocommerce产品管理部分的下拉列表中按特定顺序。,尚未按正确的顺序输入属性。现在要重做它已经太晚了,所以我想在它们应该出现的下拉菜单中列出它们。输入数据的人在此列表中向上和向下滚动太费时间了。如果它们已经按照正确的顺序会更快。我已经看到如何强制它们在前端以特定顺序显示但不在管理部分中显示 - 谢谢

2 个答案:

答案 0 :(得分:3)

只需转到

  

产品 - >属性

,选择要重新排序的属性。然后单击“配置条款”图标。在这里,您将看到所有属性术语。只需拖放您想要的顺序即可。提示:

enter image description here

答案 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;
}