将自定义文本字段添加到WooCommerce管理产品数据“Variations”

时间:2019-05-02 作者:Jimmy

在wooCommerce管理产品页面中,关于可变产品,您可以有产品变体。请参见下面的“变体”设置部分:

enter image description here

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_priceclass-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: 我不需要在前端网站上显示此内容,这纯粹是为了存储后端数据

2 个回复
最合适的回答,由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文件。已测试并正常工作。

enter image description here

<人力资源>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\');
我已经测试了这段代码,它应该可以工作-只需复制和粘贴(或多或少…)。

如果对你有用,请接受正确的答案。谢谢