因为我只有一个产品,但有数十种变体,为了便于概览和管理,我将“ 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了。观察到的问题是由另一个函数产生的,现在它已经解决了。但是,我将不胜感激代码改进的建议。