Agregar unidad de medida después del precio en WooCommerce. Ejemplo $24 /m2 y $24 /m
Hola chicos,
Estoy intentando configurar el precio por unidad en mi WooCommerce. Algunos de los productos que vendo son baldosas para piso, y como tales se venden por metro cuadrado.
He añadido el siguiente código para mostrar /m2 después de cada precio
.amount:after{
content: "/m2";
text-size: 13px;
}
Esto agrega el /m2 después de cada precio.
Sin embargo, algunos de los artículos que vendo actualmente no son baldosas. Por ejemplo, las molduras decorativas se venden por metro lineal. Y también vendo bloques para columnas, que se venden por pieza. ¿Cómo puedo agregar las unidades de precio correctamente?
¿El CSS de WooCommerce reconoce SKU? Y de ser así, ¿cómo implementarlo?

En primer lugar, hacer esto con CSS en mi opinión definitivamente no es el camino a seguir.
En segundo lugar, pagar 129$ por una extensión solo para tener esta funcionalidad menor sería ridículo - nada en contra del plugin en sí.
En tercer lugar, la solución básica que se describe a continuación se basa en el ejemplo de la página codex de add_meta_box. Hay varias otras soluciones para lograr esto, solo hay que buscar un poco, esto es para que comiences.
Código:
/**
* Añade un cuadro a la columna principal en las pantallas de edición de Entradas y Páginas.
*/
function wpse103469_wc_price_per_unit_mb() {
$screens = array( 'post', 'page', 'product' );
foreach ( $screens as $screen ) {
add_meta_box(
'wc_price_per_unit_mb',
__( 'Precio por Unidad', 'myplugin_textdomain' ),
'wpse103469_wc_price_per_unit_inner_mb',
$screen,
'advanced',
'high'
);
}
}
add_action( 'add_meta_boxes', 'wpse103469_wc_price_per_unit_mb' );
/**
* Imprime el contenido del cuadro.
*
* @param WP_Post $post El objeto para la entrada/página actual.
*/
function wpse103469_wc_price_per_unit_inner_mb( $post ) {
// Añade un campo nonce para que podamos verificarlo más tarde.
wp_nonce_field( 'wpse103469_wc_price_per_unit_inner_mb', 'wpse103469_wc_price_per_unit_inner_mb_nonce' );
/*
* Usa get_post_meta() para recuperar un valor existente
* de la base de datos y usa el valor para el formulario.
*/
$value = get_post_meta( $post->ID, 'wc_price_per_unit_key', true );
echo '<label for="wc_price_per_unit_field">';
_e( "Precio por Unidad", 'myplugin_textdomain' );
echo '</label> ';
echo '<input type="text" id="wc_price_per_unit_field" name="wc_price_per_unit_field" value="' . esc_attr( $value ) . '" size="25" />';
}
/**
* Cuando se guarda la entrada, guarda nuestros datos personalizados.
*
* @param int $post_id El ID de la entrada que se está guardando.
*/
function wpse103469_wc_price_per_unit_save_postdata( $post_id ) {
/*
* Necesitamos verificar que esto proviene de nuestra pantalla y con la autorización adecuada,
* porque save_post puede activarse en otros momentos.
*/
// Verifica si nuestro nonce está establecido.
if ( ! isset( $_POST['wpse103469_wc_price_per_unit_inner_mb_nonce'] ) )
return $post_id;
$nonce = $_POST['wpse103469_wc_price_per_unit_inner_mb_nonce'];
// Verifica que el nonce es válido.
if ( ! wp_verify_nonce( $nonce, 'wpse103469_wc_price_per_unit_inner_mb' ) )
return $post_id;
// Si es un autoguardado, nuestro formulario no se ha enviado, así que no queremos hacer nada.
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return $post_id;
// Verifica los permisos del usuario.
if ( 'page' == $_POST['post_type'] ) {
if ( ! current_user_can( 'edit_page', $post_id ) )
return $post_id;
} else {
if ( ! current_user_can( 'edit_post', $post_id ) )
return $post_id;
}
/* OK, es seguro para nosotros guardar los datos ahora. */
// Sanitiza la entrada del usuario.
$price_per_unit = sanitize_text_field( $_POST['wc_price_per_unit_field'] );
// Actualiza el campo meta en la base de datos.
update_post_meta( $post_id, 'wc_price_per_unit_key', $price_per_unit );
}
add_action( 'save_post', 'wpse103469_wc_price_per_unit_save_postdata' );
El campo meta »Precio por Unidad« puede mostrarse así:
echo get_post_meta(get_the_ID(), 'wc_price_per_unit_key', true);
en el archivo de plantilla correspondiente.
Para añadir la información del campo meta »Precio por Unidad« directamente al precio mostrado puedes hacer algo como esto:
add_filter('woocommerce_get_price_html','wpse103469_add_price_per_unit_meta_to_price');
function wpse103469_add_price_per_unit_meta_to_price( $price ) {
$price .= ' ' . get_post_meta(get_the_ID(), 'wc_price_per_unit_key', true);
return $price;
}

Primero responderé a tu pregunta como la estabas abordando y luego te daré mi respuesta sobre cómo creo que debería hacerse.
CSS
Puedes hacer esto con CSS de un par de formas diferentes:
1) Puedes apuntar a cualquier página de producto:
.single-product .amount:after{
content: "/m2";
text-size: 13px;
}
2) Puedes apuntar a un producto específico usando su ID de producto:
.postid-XXXX .amount:after{
content: "/m2";
text-size: 13px;
}
3) Puedes apuntar a una categoría específica usando su ID de categoría:
.term-XXXX .amount:after{
content: "/m2";
text-size: 13px;
}
Measurement Price Calculator
Por supuesto, podrías usar la extensión Measurement Price Calculator para WooCommerce. Esta hace gran parte de lo que necesitas y añade elementos de interfaz geniales. Probablemente esta sería la forma en que yo lo haría.
