Soporte » Plugins y Hacks » WooCommerce » obtener precio variable php

  • Buenas a todos

    Me pongo en contacto con ustedes porque estoy un poco perdido estoy con la creacion de un plugin de WooCommerce de m2 y me funciona lo unico que lo hice para un solo producto, y ahora lo voy hacer con variables y me gustaria saber como cojo el precio de un producto variable para que me lo calcule porque con lo que hice yo solo me coje el precio de la primera variable no de las demas.

    En principio me gustaria saber como obtengo el precio variable de un prodructo en php o js solo lo he conseguido con el precio fijo de un producto.

    Os agradezco mucho vuestra ayuda

Viendo 3 respuestas - 1 de 3 (de 3 total)
  • Hola.

    Que función de WooCommerce has utilizado. Si no me equivoco la adecuada es get_price()

    Revisa en la documentación de WooCoomerce el WC_Product

    Buenas curaxo

    Este es mi codigo inicial para un producto simple y me funciona lo unico que para hacerlo con un producto varible no me funciona podrias hecharme una mano

    Muchas Gracias

    <?php
    /**
    * The plugin bootstrap file
    *
    * This file is read by WordPress to generate the plugin information in the
    * plugin admin area. This file also includes all of the dependencies used by
    * the plugin, and defines a function that starts the plugin.
    * @wordpress-plugin
    * Plugin Name: Precio segun tamaño
    * Description: Añade campos en la pagina de un producto que varia su precio segun su tamaño
    * Version: 0.1.6
    * Author: Alfonso Saavedra
    */

    defined( ‘WPINC’ ) || die;
    add_action( ‘plugins_loaded’, ‘tutsplus_wc_input_start’ );
    /**
    * Iniciamos el plugin
    */
    function tutsplus_wc_input_start() {

    if ( is_admin() ) {

    $admin = new add_size_price_admin();
    $admin->init();
    } else {

    $plugin = new add_size_price_product_page();
    $plugin->init();
    }
    }

    // Lo siguiente añade el script Javascript necesario para realizar el calculo
    function calc_m2_scripts() {
    wp_enqueue_script( ‘calc_precio_m2_js’, plugins_url( ‘calc_precio_m2.js’, __FILE__ ), array(), ”, true);
    }
    add_action(‘wp_enqueue_scripts’, ‘calc_m2_scripts’);

    class add_size_price_admin {
    // Esta clase contiene las funciones que se encargan de añadir, actualizar, etc, a la hora de editar los productos
    public function init() {
    add_filter( ‘woocommerce_product_data_tabs’, array($this, ‘add_product_custom_size_tab’));
    add_action( ‘admin_head’, array($this, ‘wcpp_custom_style’));
    add_action(
    ‘woocommerce_product_data_panels’,
    array( $this, ‘product_options_grouping’ )
    );
    add_action( ‘woocommerce_process_product_meta’, array($this, ‘save_product_custom_size’));
    }
    /** CSS To Add Custom tab Icon */
    public function wcpp_custom_style() {?>
    <style>#woocommerce-product-data ul.wc-tabs li.custom-size-tab_options a:before { font-family: WooCommerce; content: ‘\e601’
    </style>
    <?php
    }

    // Esta funcion añade la nueva tabla de configuración en los productos
    public function add_product_custom_size_tab( $product_data_tabs ){
    $product_data_tabs[‘custom-size-tab’] = array(
    ‘label’ => ‘Tamaños del producto’,
    ‘target’ => ‘product_custom_size_data’,
    );
    return $product_data_tabs;
    }

    public function product_options_grouping() {
    // Añadimos los nuevos campos para los productos
    ?>
    <div id=”product_custom_size_data” class=”panel woocommerce_options_panel”>
    <div class=”options_group”>
    <?php

    // Añadimos el checkbox para indicar que el precio de este producto varia segun el tamaña
    woocommerce_wp_checkbox(
    array( ‘id’ => ‘add_m2_price’,
    ‘label’ => ‘El precio de este producto varia segun tamaño’,
    ‘description’ => ‘Si el precio de este producto varia segun su tamaño, marque esta opción.’,
    )
    );

    // Este es el campo del ancho minimo
    woocommerce_wp_text_input(
    array(‘id’ => ‘ancho_min’,
    ‘type’=>’number’,
    ‘label’=>’Ancho minimo (cm)’,
    ‘placeholder’=>’100’,
    )
    );

    // Este es el campo del ancho máximo
    woocommerce_wp_text_input(
    array(‘id’ => ‘ancho_max’,
    ‘type’=>’number’,
    ‘label’=>’Ancho maximo (cm)’,
    ‘placeholder’=>’100’,
    )
    );

    // Este es el campo del alto minimo
    woocommerce_wp_text_input(
    array(‘id’ => ‘alto_min’,
    ‘type’=>’number’,
    ‘label’=>’Alto minimo (cm)’,
    ‘placeholder’=>’100’,
    )
    );

    // Y este es el campo del alto máximo
    woocommerce_wp_text_input(
    array(‘id’ => ‘alto_max’,
    ‘type’=>’number’,
    ‘label’=>’Alto max (cm)’,
    ‘placeholder’=>’100’,
    )
    );
    ?>
    </div>
    </div>
    <?php
    }

    public function save_product_custom_size($post_id) {

    // Guardamos el ancho minimo
    $ancho_min = $_POST[‘ancho_min’];
    if (!empty($ancho_min)) {
    update_post_meta($post_id, ‘ancho_min’, esc_attr($ancho_min));
    }

    // Guardamos el ancho máximo
    $ancho_max = $_POST[‘ancho_max’];
    if (!empty($ancho_max)) {
    update_post_meta($post_id, ‘ancho_max’, esc_attr($ancho_max));
    }
    // Guardamos el alto minimo
    $alto_min = $_POST[‘alto_min’];
    if (!empty($alto_min)) {
    update_post_meta($post_id, ‘alto_min’, esc_html($alto_min));
    }

    // Guardamos el alto máximo
    $alto_max = $_POST[‘alto_max’];
    if (!empty($alto_max)) {
    update_post_meta($post_id, ‘alto_max’, esc_attr($alto_max));
    }

    // Guardamos el checkbox que indica que este producto varia su precio segun tamaño
    $checkbox = isset($_POST[‘add_m2_price’]) ? ‘yes’ : ‘no’;
    update_post_meta($post_id, ‘add_m2_price’, $checkbox);

    }
    }

    class add_size_price_product_page {
    // esta clase es la que muestra los datos al usuario

    private $if_precio_tamano;

    public function __construct() {
    $this->if_precio_tamano = get_post_meta( get_the_ID(), ‘add_m2_price’, true );
    }

    public function init() {
    add_action(
    ‘woocommerce_before_add_to_cart_button’,
    array( $this, ‘product_custom_size’ )
    );

    // Si esta marcada la opción de precio segun tamaña no mostramos el precio ni el botón de añadir al carrito entre otros
    if(isset($this->if_precio_tamano)){
    remove_action( ‘woocommerce_after_shop_loop_item’, ‘woocommerce_template_loop_add_to_cart’, 10 );
    add_action( ‘woocommerce_after_shop_loop_item’, array($this, ‘ocultar_anadir_carrito’), 10);
    add_filter( ‘woocommerce_add_cart_item_data’, array($this, ‘add_cart_item_data’), 10, 3 );
    add_action( ‘woocommerce_before_calculate_totals’, array($this, ‘update_custom_price’), 10, 1 );
    add_action( ‘woocommerce_after_add_to_cart_button’, array($this, ‘add_calc_size_div’), 11 );
    }
    add_filter( ‘woocommerce_get_item_data’, array($this, ‘mostrar_tamano_indicado’), 10, 2 );
    add_action( ‘woocommerce_checkout_create_order_line_item’, array($this, ‘anadir_tamano_producto_orden’), 10, 4 );
    }

    // Esta función oculta el precio del producto
    public function ocultar_precio( $price, $product ) {
    if (get_post_meta( $product->id, ‘add_m2_price’, true ) == ‘yes’){
    $price = ”;
    return $price;
    }
    return $price;
    }

    // Esta función cambia el Añadir al carrito a Ver producto
    public function ocultar_anadir_carrito() {
    global $product;
    $link = $product->get_permalink();
    echo ‘Seleccionar opciones‘;
    }

    public function add_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
    // Si se marco la opción de precio por tamaño añadimos los campos pertinentes cuando se añade al carrito
    if( isset($this->if_precio_tamano) && !empty($_POST[‘precio_final’])) {
    $precio_final = $_POST[‘precio_final’];
    $ancho = $_POST[‘ancho_cartel’];
    $alto = $_POST[‘alto_cartel’];

    $cart_item_data[‘precio_final’] = $precio_final;
    $cart_item_data[‘tamano’][‘ancho’] = $ancho;
    $cart_item_data[‘tamano’][‘alto’] = $alto;
    }
    return $cart_item_data;
    }

    public function update_custom_price( $cart_object ) {
    // Esta función cambia el precio del producto por el que se calculo en el formulario
    foreach ( $cart_object->cart_contents as $cart_item_key => $value ) {
    if (get_post_meta( $value[‘product_id’], ‘add_m2_price’, true ) == ‘yes’){
    $value[‘data’]->set_price($value[‘precio_final’]);
    }
    }
    }

    public function mostrar_tamano_indicado( $item_data, $cart_item ) {
    // Esta función muestra en el carrito el tamaño del producto que el cliente introdujo
    if ( empty( $cart_item[‘tamano’] ) ) {
    return $item_data;
    }

    $item_data[] = array(
    ‘key’ => ‘Tamaño (cm)’,
    ‘value’ => wc_clean($cart_item[‘tamano’][‘ancho’]).’x’.wc_clean( $cart_item[‘tamano’][‘alto’] ),
    ‘display’ => ”,
    );

    return $item_data;
    }

    public function anadir_tamano_producto_orden( $item, $cart_item_key, $values, $order ) {
    // Esta función es como la anterior, solo que para cuando se ha procedido al pago
    if ( empty( $values[‘tamano’] ) ) {
    return;
    }

    $item->add_meta_data(‘Tamaño del producto (cm)’, $values[‘tamano’][‘ancho’].’x’.$values[‘tamano’][‘alto’] );
    }

    public function product_custom_size() {
    // Esta función muestra en la página del producto los campos del tamaño
    $teaser = get_post_meta( get_the_ID(), ‘add_m2_price’, true );
    $ancho_min = get_post_meta( get_the_ID(), ‘ancho_min’, true );
    $ancho_max = get_post_meta( get_the_ID(), ‘ancho_max’, true );

    $alto_min = get_post_meta( get_the_ID(), ‘alto_min’, true );
    $alto_max = get_post_meta( get_the_ID(), ‘alto_max’, true );

    $precio_base = get_post_meta( get_the_ID(), ‘precio_base’, true );
    if ( empty( $teaser ) || $teaser == ‘no’) {
    return;
    }

    $_product = wc_get_product(get_the_ID());
    ?>
    <div id=”calc_precio_m2″>
    <input type=”hidden” id=”precio_base” value=”<?=$_product->get_price()?>” />
    <input type=”hidden” id=”precio_final” name=”precio_final” value=”<?=$_product->get_price()?>” />
    <p>Introduzca el tamaño que desee en los siguientes campos</p>
    <div class=”row” style=”margin-bottom: 20px;margin-top: 20px;”>
    <div class=”col-md-4 col-xs-6″>
    <p class=”form-row ” id=”ancho_cartel_field” data-priority=””>
    <label for=”ancho_cartel” class=””>Ancho (cm)</label>
    <div class=”quantity”>
    <input class=”input-text ” name=”ancho_cartel” id=”ancho_cartel” value=”<?=$ancho_min?>” min=”<?=$ancho_min?>” max=”<?=$ancho_max?>” type=”number”>
    </div>
    </p>
    </div>
    <div class=”col-md-8 col-xs-6″>
    <p class=”form-row ” id=”alto_cartel_field” data-priority=””>
    <label for=”alto_cartel” class=””>Alto (cm)</label>
    <div class=”quantity”>
    <input class=”input-text ” name=”alto_cartel” id=”alto_cartel” value=”<?=$alto_min?>” min=”<?=$alto_min?>” max=”<?=$alto_max?>” type=”number”>
    </div>
    </p>
    </div>
    </div>
    </div>
    <?php
    }

    public function add_calc_size_div(){
    // Y esta función muestra la capa que contiene el precio calculado
    if(get_post_meta( get_the_ID(), ‘add_m2_price’, true ) == ‘yes’):
    ?>
    <div class=”woocommerce-variation-price” id=”wc_calc_size”>
    <span class=”price”>
    <span id=”precio_final_txt” class=”woocommerce-Price-amount amount”>0.00<span class=”woocommerce-Price-currencySymbol”>€</span>
    </span>
    </span>
    </div>
    <?php
    endif;
    }
    }

    Vale, he estado revisando y mira el objecto que tiene sque utilziar WC_Product_Variation.

    En la comunidad StackOverflow muestran un ejemplo

    • Esta respuesta fue modificada hace 4 meses, 1 semana por  Ivan Barreda.
Viendo 3 respuestas - 1 de 3 (de 3 total)
  • Debes estar registrado para responder a este tema.