Estoy tratando de agregar un campo personalizado en la sección general de un producto e inicializarlo con un formulario de interfaz.

No tuve ningún problema para agregarlo, pero no sé cómo configurarlo.

PARA AÑADIR Y GUARDAR EL CAMPO PERSONALIZADO:

// The code for displaying WooCommerce Product Custom Fields
add_action('woocommerce_product_options_general_product_data', 'woocommerce_product_custom_fields');
// Following code Saves  WooCommerce Product Custom Fields
add_action('woocommerce_process_product_meta', 'woocommerce_product_custom_fields_save');


function woocommerce_product_custom_fields()
{
    global $woocommerce, $post;
    echo '<div class=" product_custom_field ">';

    //Custom Product Text Field
    woocommerce_wp_text_input(
        array(
            'id'          => 'tipologiaAppunto',
            'label'       => __('Tipologia appunto:', 'woocommerce'),
            'placeholder' => '',
            'desc_tip'    => 'true'
        )
    );
    echo '</div>';
}


function woocommerce_product_custom_fields_save($post_id)
{
    // Custom Product Text Field
    $woocommerce_custom_product_text_field = $_POST['tipologiaAppunto'];
    if (!empty($woocommerce_custom_product_text_field))
        update_post_meta($post_id, 'tipologiaAppunto', esc_attr($woocommerce_custom_product_text_field));
}

Para configurarlo, intenté extender el WC_PRODUCT CLASS

EXTENSIÓN DE LA CLASE WC_PRODUCT:

add_action('init', 'register_myclass');
function register_myclass()
{
    class WC_ProductExtended extends WC_Product
    {
        function __construct() {
            parent::__construct();
            if (!array_key_exists("tipologiaAppunto", $this->data)) {
                $this->data["tipologiaAppunto"] = "";
            }
        }

        /**
         * Set product tipologiaAppunto.
         *
         * @since 3.0.0
         * @param string $tipologiaAppunto Product tipologiaAppunto.
         */
        public function set_tipologiaAppunto($tipologiaAppunto)
        {
            $this->set_prop( 'tipologiaAppunto', $tipologiaAppunto );
        }
    }
}

Y ahora, al llamar al configurador, esperaba inicializar el campo personalizado del producto, pero no sucedió nada.

$product->set_regular_price($_POST['price']); 
$productExtendend = new WC_ProductExtended();
$productExtendend->set_tipologiaAppunto("Hey");
$productExtendend->save(); 

No sé si esta es la forma correcta de hacerlo, encontré muchos tutoriales sobre cómo agregar el campo personalizado, pero muy poco sobre cómo inicializarlo desde la interfaz, he intentado imitar el comportamiento de los campos existentes. pero sin suerte.

1
Pickeroll 1 sep. 2020 a las 17:07

1 respuesta

La mejor respuesta

Por qué no usa simplemente WC_Data update_meta_data() y get_meta() métodos de la siguiente manera:

$product->set_regular_price($_POST['price']); 

$product->update_meta_data("tipologiaAppunto", "Hey"); // <== Set (or update) the custom field value from a meta key
$product->save(); 

echo $product->get_meta("tipologiaAppunto"); // <== Get (or read) the custom field value from a meta key

Además, desde Woocommerce 3, puede reemplazar el gancho de acción woocommerce_process_product_meta por woocommerce_admin_process_product_object para que su código sea en su lugar:

// Display admin product custom setting field(s)
add_action('woocommerce_product_options_general_product_data', 'woocommerce_product_custom_fields');
function woocommerce_product_custom_fields() {
    global $product_object;

    echo '<div class=" product_custom_field ">';

    // Custom Product Text Field
    woocommerce_wp_text_input( array( 
        'id'          => 'tipologiaAppunto',
        'label'       => __('Tipologia appunto:', 'woocommerce'),
        'placeholder' => '',
        'desc_tip'    => 'true' // <== Not needed as you don't use a description
    ) );

    echo '</div>';
}

// Save admin product custom setting field(s) values
add_action('woocommerce_admin_process_product_object', 'woocommerce_product_custom_fields_save');
function woocommerce_product_custom_fields_save( $product ) {
    if ( isset($_POST['tipologiaAppunto']) ) {
        $product->update_meta_data( 'tipologiaAppunto', sanitize_text_field( $_POST['tipologiaAppunto'] ) );
    }
}
1
LoicTheAztec 2 sep. 2020 a las 00:16