Respuestas de foro creadas

Viendo 4 respuestas - de la 1 a la 4 (de un total de 4)
  • Iniciador del debate javier26

    (@javier26)

    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;
    }
    }

    Iniciador del debate javier26

    (@javier26)

    Muchas gracias Fernando me esta siendo de mucha ayuda tu informacion

    los grupos seria para hacer descuentos a ciertos clientes únicamente.

    Otro tema veras un amigo esta montando una tienda y en lugar de vender el disco completo quiere dar la opción de el disco completo o las canciones que el cliente desee solo comprar para descargar el producto hay alguna manera de hacerlo.

    Muchas gracias.

    Iniciador del debate javier26

    (@javier26)

    Uno de los modulos que necesitaría es el de precio por medidas o volúmenes, otro seria crear grupos de clientes para hacerles descuento sobre los productos

    Iniciador del debate javier26

    (@javier26)

    Muchas gracias Fernando

    con los plugins me refería a que plugins de woocommerce son los mas convenientes para instalarlos en la web.

Viendo 4 respuestas - de la 1 a la 4 (de un total de 4)