在wooCommerce管理产品页面中,关于可变产品,您可以有产品变体。请参见下面的“变体”设置部分:
What Im trying to achieve: 我已经能够在admin“product data”metabox的“General”部分下为简单产品的常规价格和销售价格添加一个文本字段。现在,我需要在“变体”部分下为可变产品添加一个新的文本字段“成本价格”,但我不知道如何添加它。
因此,我开始搜索脚本/阅读WooCommerce文档,并通过编辑添加了新的文本字段includes/admin/metabox/html-variation-admin.php
, 向其中添加以下代码:
woocommerce_wp_text_input(
array(
\'id\' => "variable_cost_price{$loop}",
\'name\' => "variable_cost_price[{$loop}]",
\'value\' => wc_format_localized_price( $variation_object->get_cost_price( \'edit\' ) ),
\'data_type\' => \'price\',
\'label\' => $label ,
\'wrapper_class\' => \'form-row form-row-last\',
)
);
当我从“常规价格”表单字段中克隆这个时,我知道这会起作用。
My problem: 当然,如果文本字段没有保存到数据库并带回数据以在页面加载时显示,那么文本字段就没有意义了。再一次,我不是百分之百确定,但我想我必须做更多的补充。
What I have tried: 我已经添加了该方法get_cost_price
到class-wc-ajax.php
脚本,因为我看到了一个已经为get\\u regular\\u价格。我还看到了class-wc-meta-box-product-data.php
其中提到regular_price
所以我为我的新cost_price
, 请参见下面我添加的内容(我添加了cost\\u价格行):
$errors = $variation->set_props(
array(
\'status\' => isset( $_POST[\'variable_enabled\'][ $i ] ) ? \'publish\' : \'private\',
\'menu_order\' => wc_clean( $_POST[\'variation_menu_order\'][ $i ] ),
\'regular_price\' => wc_clean( $_POST[\'variable_regular_price\'][ $i ] ),
\'sale_price\' => wc_clean( $_POST[\'variable_sale_price\'][ $i ] ),
\'cost_price\' => wc_clean( $_POST[\'variable_code_price\'][ $i ] ),
// .. more code here..
我错过了什么,我是否需要在另一个脚本中进行更改?
同样,文本字段正在显示,但输入数据并单击保存更改实际上似乎并没有向postmeta
桌子
EDIT: 我不需要在前端网站上显示此内容,这纯粹是为了存储后端数据
最合适的回答,由SO网友:LoicTheAztec 整理而成
由于许多原因,重写核心文件确实是绝对要避免的事情。
要将自定义字段添加到product variations options prices并在保存时保存值,请使用以下命令:
// Admin: Add custom field in product variations options pricing
add_action( \'woocommerce_variation_options_pricing\', \'add_variation_custom_option_pricing\', 10, 3 );
function add_variation_custom_option_pricing( $loop, $variation_data, $variation ){
woocommerce_wp_text_input( array(
\'id\' => \'_cost_price[\'.$loop.\']\',
\'label\' => __("Cost Price", "woocommerce") . \' (\' . get_woocommerce_currency_symbol() . \')\',
\'class\' => \'short wc_input_price\',
\'data_type\' => \'price\',
\'wrapper_class\' => \'form-row form-row-first\',
\'value\' => wc_format_localized_price( get_post_meta( $variation->ID, \'_cost_price\', true ) )
) );
}
// Admin: Save custom field value from product variations options pricing
add_action( \'woocommerce_save_product_variation\', \'save_variation_custom_option_pricing\', 10, 2 );
function save_variation_custom_option_pricing( $variation_id, $i ){
if( isset($_POST[\'_cost_price\'][$i]) ){
update_post_meta( $variation_id, \'_cost_price\', wc_clean( wp_unslash( str_replace( \',\', \'.\', $_POST[\'_cost_price\'][$i]) ) ) );
}
}
代码进入功能。活动子主题(或活动主题)的php文件。已测试并正常工作。
<人力资源>
USAGE - 如果需要使用它来获取值:
1) From the variation ID
$cost_price = update_post_meta( $variation_id, \'_cost_price\', true );
2) From the product variation object
$cost_price = $variation->get_meta(\'_cost_price\');
SO网友:user3135691
您需要使用系统提供的WordPress挂钩和过滤器。
将此代码放入函数中。当前主题的php。确保您的主题通过“add\\u theme\\u support(\'woocommerce\');”启用了woocommerce\\u支持
<?php
// Add the textfield to the backend
if(!function_exists(\'se_add_extra_price_field\')){
function se_add_extra_price_field() {
woocommerce_wp_text_input(array(
\'id\' => \'cost-price\',
\'class\' => \'short wc_input_price cost-price\',
\'label\' => __(\'Cost-Price (€)\', \'yourtextdomain\'),
\'description\' => \'Cost-price description...\',
\'placeholder\' => \'50 Cent\'
));
}
}
add_action(\'woocommerce_product_options_pricing\',\'se_add_extra_price_field\');
// Enable to save the extra field
function se_save_extra_price_field($post_id) {
$product = wc_get_product($post_id);
$title = isset( $_POST[\'cost-price\'] ) ? $_POST[\'cost-price\'] : \'\';
$product->update_meta_data( \'cost-price\', sanitize_text_field( $title ) );
$product->save();
if(isset($_POST[\'cost-price\'])) {
if(is_numeric($_POST[\'cost-price\'])){
update_post_meta($product_id, \'cost-price\', $_POST[\'cost-price\']);
}
}
}
add_action(\'save_post\', \'se_save_extra_price_field\');
我已经测试了这段代码,它应该可以工作-只需复制和粘贴(或多或少…)。
如果对你有用,请接受正确的答案。谢谢