1

因为我只有一个产品,但有数十种变体,为了便于概览和管理,我将“ product_variation ”帖子类型帖子(产品变体)放在管理员“产品”菜单的单独子页面中:

/** Register custom arguments for the 'product_variation' post type **/
function product_variation_post_type_args( $args, $post_type ) {

    if( 'product_variation' === $post_type ) {
        $args = array(
            'label'               => __( 'Product variations label', 'woocommerce' ),
            'supports'            => array( 'title', 'excerpt', 'author', 'thumbnail', 'revisions', 'custom-fields', ),
            'taxonomies' => array( 'product_cat', 'product_tag' ),
            'hierarchical'        => false,
            'public'              => true,
            'show_ui'             => true,
            'show_in_menu'        => 'edit.php?post_type=product',
            'show_in_nav_menus'   => false,
            'show_in_admin_bar'   => false,
            'can_export'          => true,
            'has_archive'         => true,
            //'exclude_from_search' => true,
            'publicly_queryable'  => false,
            'capability_type'     => 'post',
            'show_in_rest'        => true,
        );
    }

    return $args;
}
add_filter( 'register_post_type_args', 'product_variation_post_type_args', 10, 2 );

此外,我将产品变体标签和库存状态添加到显示的列中:

add_filter( 'manage_product_variation_posts_columns', 'wc_product_variation_table_head' );
function wc_product_variation_table_head( $defaults ) {
    $defaults['variation_label'] = __('Variations', 'woocommerce' );
    $defaults['stock_status'] = __('Stock status', 'woocommerce' );
    return $defaults;
}

add_action( 'manage_product_variation_posts_custom_column', 'bs_product_variation_table_content', 10, 2 );
function bs_product_variation_table_content( $column_name, $post_id ) {
    if( $column_name === 'variation_label' ) {
        $test_title = get_post_meta( $post_id, 'attribute_test', true );
        echo $test_title;
    } else if( $column_name === 'stock_status' ) {
        $stock_status = get_post_meta( $post_id, '_stock_status', true );
        echo $stock_status;
    }
}

add_filter( 'manage_edit-product_variation_sortable_columns', 'wc_product_variation_table_sorting' );
function wc_product_variation_table_sorting( $columns ) {
    $columns['variation_label'] = 'variation_label';
    $columns['stock_status'] = 'stock_status';
    return $columns;
}

然后,我在“ product_variation ”帖子类型中添加了一个自定义字段“ Stock status ”:

function product_variation_metaboxes( ) {
    global $wp_meta_boxes;
    add_meta_box( 'product_variation_div', __('Stock status', 'woocommerce' ), 'product_variation_metaboxes_html', 'product_variation', 'normal', 'high');
}
add_action( 'add_meta_boxes_product_variation', 'product_variation_metaboxes' );

function product_variation_metaboxes_html() {
    global $post;
    $stock_status = get_post_meta( $post->ID, '_stock_status', true );
    ?>
    <select name="stock_status_select">
        <option value="instock" <?php if( $stock_status == 'instock') echo 'selected'; ?>>In stock</option>
        <option value="outofstock" <?php if( $stock_status == 'outofstock') echo 'selected'; ?>>Out of stock</option>
    </select>
    <?php
}

function product_variation_save_post() {
    if( isset( $_POST['stock_status_select'] ) ) {
        global $post;
        update_post_meta( $post->ID, 'stock_status', wc_clean( $_POST['stock_status_select'] ) ); //is updated
        update_post_meta( $post->ID, '_stock_status', wc_clean( $_POST['stock_status_select'] ) ); //is NOT updated (solved)
    }
}   
//add_action( 'save_post_product_variation', 'product_variation_save_post' ); //tried this also
add_action( 'save_post', 'product_variation_save_post' );

我遇到但无法解决的问题是,当我更改特定产品变体的库存状态(“库存”或“缺货”)时,可从“产品”菜单的已创建专用子页面访问,在发布保存时,它不会在默认的“ _stock_status ”发布元中保存/更新,尽管它在自定义的(只是“ stock_status ”)中保存没有问题。我该如何解决这个问题?

更新[2021-07-01]

上面的代码就OK了。观察到的问题是由另一个函数产生的,现在它已经解决了。但是,我将不胜感激代码改进的建议。

4

0 回答 0