Campos personalizados
Una de las funcionalidades clave de este plugin es la posibilidad de extender los productos de WooCommerce mediante campos personalizados (también llamados "metacampos"). Estos campos permiten añadir datos adicionales que no vienen por defecto en los productos.
En esta nota explicamos:
- Cómo registrar campos personalizados en el panel de edición de productos.
- Cómo guardarlos correctamente.
- Cómo organizar distintos tipos de campos (texto, textarea, checkbox, selección).
- Buenas prácticas y consideraciones de seguridad.
Registro de campos
Los campos se añaden mediante el hook:
add_action('woocommerce_product_options_general_product_data', 'nombre_funcion');
Dentro de esa función se utilizan funciones específicas de WooCommerce:
📌 Campo de texto
woocommerce_wp_text_input([
'id' => 'codigo_producto',
'label' => __('Código del producto', 'mi-plugin'),
'description' => __('Introduce el código único del producto.', 'mi-plugin'),
'type' => 'text'
]);
Este campo aparecerá en la pestaña "General" del producto y recogerá el valor como un string.
📌 Área de texto (textarea)
woocommerce_wp_textarea_input([
'id' => 'ingredientes_producto',
'label' => __('Ingredientes', 'mi-plugin'),
'description' => __('Lista de ingredientes del producto.', 'mi-plugin'),
'value' => get_post_meta($post->ID, 'ingredientes_producto', true),
'rows' => 4
]);
Se utiliza para textos más largos, como ingredientes, instrucciones o notas.
📌 Campo checkbox (sí/no)
woocommerce_wp_checkbox([
'id' => 'para_freidora',
'label' => __('Apto para freidora', 'mi-plugin'),
'description' => __('Marca esta opción si el producto se prepara en freidora.', 'mi-plugin'),
'value' => get_post_meta($post->ID, 'para_freidora', true)
]);
Los checkbox se guardan como 'yes' o 'no'.
📌 Campo de selección (select)
woocommerce_wp_select([
'id' => 'marca_producto',
'label' => __('Marca', 'mi-plugin'),
'description' => __('Selecciona la marca del producto.', 'mi-plugin'),
'options' => [
'' => __('Selecciona una marca', 'mi-plugin'),
'Marca1' => 'Marca1',
'Marca2' => 'Marca2'
],
'value' => get_post_meta($post->ID, 'marca_producto', true)
]);
Ideal para categorizar productos según marcas, tipos, etc.
Guardar los datos
Los datos se guardan en el hook:
add_action('woocommerce_process_product_meta', 'nombre_funcion_guardado');
✅ Guardado seguro con verificación de nonce:
if (!isset($_POST['mi_nonce']) || !wp_verify_nonce($_POST['mi_nonce'], 'mi_accion_nonce')) {
return;
}
✅ Guardado de texto:
if (!empty($_POST['codigo_producto'])) {
update_post_meta($post_id, 'codigo_producto', sanitize_text_field($_POST['codigo_producto']));
} else {
delete_post_meta($post_id, 'codigo_producto');
}
✅ Guardado de checkbox:
$para_freidora = isset($_POST['para_freidora']) ? 'yes' : 'no';
update_post_meta($post_id, 'para_freidora', $para_freidora);
Buenas prácticas
- Usa funciones
sanitize_*yesc_*para evitar datos maliciosos. - Elimina campos vacíos si no se necesitan (
delete_post_meta). - Usa nombres de campo únicos y prefijados (como
scp_) para evitar conflictos. - Agrupa campos relacionados usando
echo '<div class="options_group">'y cerrándolo con</div>.