Posted on Leave a comment

How to add menu in Prestashop

Vamos a añadir elementos en el menú principal de Prestashop.

Enlaces personalizados

El primer paso es ver y crear enlaces personalizados que podamos usar en el menú.

Desde la sección de Shop Parameters -> Traffic and SEO podemos ver un listado de direcciones preconfiguradas (contacto, marca, etc …), así como crear direcciones personalizadas.

 

 

Como ejemplo vamos a enlazar el área de afiliados del módulo Affiliates Pro, para posteriormente añadirlo al menú.

Seleccionamos la página del módulo, el título, la descripción, keywords y URL.

Una vez añadida, ya la tenemos disponible para añadirla al menú con un pretty link.

Añadir items al menú

Desde la sección de módulos, buscamos el módulo «Main menu».

 

En la configuración podemos añadir elementos entre los disponibles, así como eliminar alguno existente o cambiar el orden.

En los elementos disponibles, tenemos enlaces a lás páginas del CMS, categorías de productos, podemos buscar por productos, etc. Pero si necesitamos alguna más adicional, podemos usar la función de «Add a new link», para crear las nuestras propias.

Por ejemplo, para añadir un enlace al área de afiliados creada anteriormente, indicamos una etiqueta, y una url, donde la dirección será la usada cuando creamos los enlaces personalizados.

 

Una vez añadido, ya lo tenemos disponible en el listado superior para añadirlo al menú.

Tras guardar, ya podemos verlo en el menú.

 

The affiliates module used in this article is Affiliates Pro, available in the Addons Prestashop Store.

Posted on Leave a comment

Montar un sistema incremental de comisiones para afiliados

Sistema de afiliados

En este caso de uso vamos a ver cómo montar un sistema incremental de comisiones para afiliados en WordPress / Woocommerce.

Quien dice incremental, dice decremental, ya que podremos cambiar los porcentajes de comisiones según querramos.

¿Qué vamos a necesitar?

Para ello necesitaremos:

Vamos a ello

Primero

Primero montamos los grupos necesarios con Groups. En esta página de la documentación oficial podéis ver cómo hacerlo.

Segundo

A continuación, desde Affiliates, creamos los distintos ‘rates’ para los grupos. Esto lo haremos desde la sección Rates.

Tercero

Como último paso, vamos a configurar la integración Affiliates Groups by referrals. Para ello, desde Affiliates->Groups by referrals, elegimos el número de niveles, y para cada nivel, el grupo al que el usuario será añadido, y los límites monetarios que marcan cada nivel.

 

Affiliates Groups by referrals

 

Usando la imagen como referencia, podemos ver que se han definido 3 niveles:

Nivel 0: Cuando las ganancias son de 0€ a 1000€, el afiliado será añadido al grupo ‘Registered’.

Nivel 1: Para ganancias entre 1000€ y 2000€, el afiliado será automaticamente añadido a ‘Premium’

Nivel 2: Para ganacias mayores a 2000€, el afiliado será añadido a ‘VIP’

 

Con todo ellos, el afiliados irá pasando por los distintos grupos conforme vaya ganando comisiones, y según nuestra tabla de Rates en Affiliates, sus comisiones variarán. Ya tenemos montado nuestro sistema incremental de comisiones para afiliados, motivándolos a que generen más comisiones.

 

Posted on Leave a comment

Acciones Bulk para las categorías de productos de woocommerce

Groups Woocommerce Categories Bulk

Hoy he necesitado crear para una duda de un cliente, poder asignar grupos a categorías de productos en Woocommerce, que en principio, es sencillo, se van editando las categorías una por una, y se van asignando los grupos. El problema llega cuando el cliente me dice que tiene más de 200 categorías, e ir una a una es una pesadilla.
Por cierto, en este caso estoy hablando del plugin Groups de @itthinx.

Mirando documentación oficial y no oficial de WordPress, veo que hay filtros que podemos usar para añadir Bulk Actions a artículos y post types, pero no para las categorías (taxonomías).
La solución que opto, es crear un submenú en la administración de WordPress, mostrar ahí las categorías, los grupos, y que el usuario pueda seleccionarlos, para luego indicar si añadirlos o eliminarlos.

El plugin creado es: Groups Woo Categories Bulk, disponible en github.

Posted on Leave a comment

Descuentos en woocommerce según el tipo de cliente

Woocommerce Roles Pricing

Caso de uso: Descuentos en Woocommerce según el tipo de cliente.

Todos sabemos que no todos nuestros clientes son iguales. Tenemos el cliente que compra por primera vez, el que es reincidente, nuestra red de tiendas, si somos distribuidores, los comerciales, y un largo etcétera, en el que podemos meter familia y amigos.
Si queremos aplicar descuentos, o distintos precios a nuestros productos, según el tipo de cliente que nos compre, podemos agruparlos, según roles o grupos, y mediante el plugin Woocommerce Role Pricing Pro (para roles) o Woocommerce Groups Pricing Pro (para grupos), aplicar descuentos a los distintos productos.

En el siguiente video podemos ver la solución de este caso de uso usando el plugin Woocommerce Groups Pricing Pro. En el que disponemos de 2 grupos, Premium y VIP. Aplicamos un 10% de descuento al grupo Premium y un 15% al grupo VIP.

En este video podemos ver una configuración sencilla de Woocommerce Role Pricing:

Tanto el plugin basado en roles, como el basado en grupos, disponen de opciones de configuración muy similares, por lo que se pueden usar indistintamente según nuestro entorno.
En sus páginas de documentación ( roles y grupos ) se pueden consultar las distintas opciones de configuración.

¿Cómo crear roles personalizados?

WordPress viene con un conjunto reducido de roles predefinidos, por lo que si estamos usando la alternativa de Woocommerce Role Pricing Pro, basada en roles, necesitaremos crear algunos roles adicionales. Aunque hay muchas soluciones para crearlo, normalmente sugiero usar User Role Editor, plugin potente a la vez que sencillo de usar.

¿Cómo crear grupos?

En el caso de estar usando Woocommerce Groups Pricing Pro, los usuarios no serán agrupados según sus roles, sino por grupos, pudiendo crear tantos grupos como necesitemos. Necesitaremos del plugin Groups de itthinx. Aunque se trata de un plugin muy sencillo de utilizar, recomendamos echar un vistazo a la página de documentación de Groups.

Si necesitas ayudas con la instalación o configuración, no dudes en usar el sistema de comentarios e intentaré ayudarte en lo que pueda.

Posted on Leave a comment

Usando groups_can y groups_can_not con Visual Composer

Vamos a extender el elemento ‘vc_row’ para poder aplicar los shortcodes ‘groups_can’ y ‘groups_can_not’ del plugin Groups.

Ajustando la plantilla

Añadiremos las siguientes líneas al fichero functions.php de nuestro tema hijo de WordPress.

[php]
vc_add_param("vc_row", array(
"type" => "textfield",
"group" => "Groups",
"class" => "",
"heading" => "groups_can",
"param_name" => "groups_can",
‘description’ => ‘The capability attribute is required and is used to indicate one or more capabilities separated by comma.’
));
vc_add_param("vc_row", array(
"type" => "textfield",
"group" => "Groups",
"class" => "",
"heading" => "groups_can_not",
"param_name" => "groups_can_not",
‘description’ => ‘The capability attribute is required and is used to indicate one or more capabilities separated by comma.’
));
[/php]

Ahora, el elemento Columna tiene dos nuevos parámetros dentro de la pestaña ‘Groups’:

Cada elemento de Visual Composer tiene su plantilla de representación. En este caso vamos a sobrescribir vc_row.php desde nuestra plantilla hija.

1.- Crea una nueva carpeta “vc_templates” en tu tema hijo.

2.- Copia vc_row.php desde /wp-content/plugins/js_composer/includes/templates/shortcodes/ a la nueva carpeta creada en el tema hijo.

3.- Ahora vamos a cambiar el archivo vc_row.php, con este código:

[php]
<?php
if ( ! defined( ‘ABSPATH’ ) ) {
die( ‘-1’ );
}

/**
* Shortcode attributes
* @var $atts
* @var $el_class
* @var $full_width
* @var $full_height
* @var $equal_height
* @var $columns_placement
* @var $content_placement
* @var $parallax
* @var $parallax_image
* @var $css
* @var $el_id
* @var $video_bg
* @var $video_bg_url
* @var $video_bg_parallax
* @var $parallax_speed_bg
* @var $parallax_speed_video
* @var $content – shortcode content
* @var $css_animation
* Shortcode class
* @var $this WPBakeryShortCode_VC_Row
*/
$el_class = $full_height = $parallax_speed_bg = $parallax_speed_video = $full_width = $equal_height = $flex_row = $columns_placement = $content_placement = $parallax = $parallax_image = $css = $el_id = $video_bg = $video_bg_url = $video_bg_parallax = $css_animation = »;
$disable_element = »;
$output = $after_output = »;
$atts = vc_map_get_attributes( $this->getShortcode(), $atts );
extract( $atts );

wp_enqueue_script( ‘wpb_composer_front_js’ );

$el_class = $this->getExtraClass( $el_class ) . $this->getCSSAnimation( $css_animation );

$css_classes = array(
‘vc_row’,
‘wpb_row’,
//deprecated
‘vc_row-fluid’,
$el_class,
vc_shortcode_custom_css_class( $css ),
);

if ( ‘yes’ === $disable_element ) {
if ( vc_is_page_editable() ) {
$css_classes[] = ‘vc_hidden-lg vc_hidden-xs vc_hidden-sm vc_hidden-md’;
} else {
return »;
}
}

if ( vc_shortcode_custom_css_has_property( $css, array(
‘border’,
‘background’,
) ) || $video_bg || $parallax
) {
$css_classes[] = ‘vc_row-has-fill’;
}

if ( ! empty( $atts[‘gap’] ) ) {
$css_classes[] = ‘vc_column-gap-‘ . $atts[‘gap’];
}

$wrapper_attributes = array();
// build attributes for wrapper
if ( ! empty( $el_id ) ) {
$wrapper_attributes[] = ‘id="’ . esc_attr( $el_id ) . ‘"’;
}
if ( ! empty( $full_width ) ) {
$wrapper_attributes[] = ‘data-vc-full-width="true"’;
$wrapper_attributes[] = ‘data-vc-full-width-init="false"’;
if ( ‘stretch_row_content’ === $full_width ) {
$wrapper_attributes[] = ‘data-vc-stretch-content="true"’;
} elseif ( ‘stretch_row_content_no_spaces’ === $full_width ) {
$wrapper_attributes[] = ‘data-vc-stretch-content="true"’;
$css_classes[] = ‘vc_row-no-padding’;
}
$after_output .= ‘<div class="vc_row-full-width vc_clearfix"></div>’;
}

if ( ! empty( $full_height ) ) {
$css_classes[] = ‘vc_row-o-full-height’;
if ( ! empty( $columns_placement ) ) {
$flex_row = true;
$css_classes[] = ‘vc_row-o-columns-‘ . $columns_placement;
if ( ‘stretch’ === $columns_placement ) {
$css_classes[] = ‘vc_row-o-equal-height’;
}
}
}

if ( ! empty( $equal_height ) ) {
$flex_row = true;
$css_classes[] = ‘vc_row-o-equal-height’;
}

if ( ! empty( $content_placement ) ) {
$flex_row = true;
$css_classes[] = ‘vc_row-o-content-‘ . $content_placement;
}

if ( ! empty( $flex_row ) ) {
$css_classes[] = ‘vc_row-flex’;
}

$has_video_bg = ( ! empty( $video_bg ) && ! empty( $video_bg_url ) && vc_extract_youtube_id( $video_bg_url ) );

$parallax_speed = $parallax_speed_bg;
if ( $has_video_bg ) {
$parallax = $video_bg_parallax;
$parallax_speed = $parallax_speed_video;
$parallax_image = $video_bg_url;
$css_classes[] = ‘vc_video-bg-container’;
wp_enqueue_script( ‘vc_youtube_iframe_api_js’ );
}

if ( ! empty( $parallax ) ) {
wp_enqueue_script( ‘vc_jquery_skrollr_js’ );
$wrapper_attributes[] = ‘data-vc-parallax="’ . esc_attr( $parallax_speed ) . ‘"’; // parallax speed
$css_classes[] = ‘vc_general vc_parallax vc_parallax-‘ . $parallax;
if ( false !== strpos( $parallax, ‘fade’ ) ) {
$css_classes[] = ‘js-vc_parallax-o-fade’;
$wrapper_attributes[] = ‘data-vc-parallax-o-fade="on"’;
} elseif ( false !== strpos( $parallax, ‘fixed’ ) ) {
$css_classes[] = ‘js-vc_parallax-o-fixed’;
}
}

if ( ! empty( $parallax_image ) ) {
if ( $has_video_bg ) {
$parallax_image_src = $parallax_image;
} else {
$parallax_image_id = preg_replace( ‘/[^d]/’, », $parallax_image );
$parallax_image_src = wp_get_attachment_image_src( $parallax_image_id, ‘full’ );
if ( ! empty( $parallax_image_src[0] ) ) {
$parallax_image_src = $parallax_image_src[0];
}
}
$wrapper_attributes[] = ‘data-vc-parallax-image="’ . esc_attr( $parallax_image_src ) . ‘"’;
}
if ( ! $parallax && $has_video_bg ) {
$wrapper_attributes[] = ‘data-vc-video-bg="’ . esc_attr( $video_bg_url ) . ‘"’;
}
$css_class = preg_replace( ‘/s+/’, ‘ ‘, apply_filters( VC_SHORTCODE_CUSTOM_CSS_FILTER_TAG, implode( ‘ ‘, array_filter( array_unique( $css_classes ) ) ), $this->settings[‘base’], $atts ) );
$wrapper_attributes[] = ‘class="’ . esc_attr( trim( $css_class ) ) . ‘"’;

$output .= ‘<div ‘ . implode( ‘ ‘, $wrapper_attributes ) . ‘>’;

// @eggemplo changes
if ( isset ( $groups_can ) && ( strlen( trim( $groups_can ) ) > 0 ) ) {
$content = do_shortcode( ‘[groups_can capability="’ . $groups_can . ‘"]’ . ( $content ) . ‘[/groups_can]’ );
}
if ( isset ( $groups_can_not ) && ( strlen( trim( $groups_can_not ) ) > 0 ) ) {
$content = do_shortcode( ‘[groups_can_not capability="’ . $groups_can_not . ‘"]’ . ( $content ) . ‘[/groups_can_not]’ );
}
// end – @eggemplo changes

$output .= wpb_js_remove_wpautop ($content);
$output .= ‘</div>’;
$output .= $after_output;

echo $output;
[/php]

Esta es la parte de código que hemos cambiado:
[php]
// @eggemplo changes
if ( isset ( $groups_can ) && ( strlen( trim( $groups_can ) ) > 0 ) ) {
$content = do_shortcode( ‘[groups_can capability="’ . $groups_can . ‘"]’ . ( $content ) . ‘[/groups_can]’ );
}
if ( isset ( $groups_can_not ) && ( strlen( trim( $groups_can_not ) ) > 0 ) ) {
$content = do_shortcode( ‘[groups_can_not capability="’ . $groups_can_not . ‘"]’ . ( $content ) . ‘[/groups_can_not]’ );
}
// end – @eggemplo changes
[/php]

Espero que sirva de ayuda !!!

Posted on Leave a comment

Mostrar precio original y con descuento

Si estás usando Woocommerce Role Pricing o Woocommerce Groups Pricing, para aplicar descuentos en tu tienda Woocommerce según roles/grupos, y necesitas mostrar tanto el precio original como el descontado, puedes añadir este código a tu fichero functions.php:

Si estás usando Woocommerce 2.5.x


add_filter( 'woocommerce_get_price_html', 'your_own_price_html', 100, 2 );
function your_own_price_html( $price, $product ){
  $result = $price;

  if ( get_option( "wgp-baseprice", "regular" ) == "sale" ) {
    $price_key = '_price';
  } else {
    $price_key = '_regular_price';
  }

  if ( $product->product_type == 'variable' ) {

    $children = $product->get_children(true);

    $original_prices = array();
    $commission = 0;
    foreach ( $children as $child ) {
      $original_prices[] = get_post_meta( $child, $price_key, true );
      if ( $commission == 0 ) {
        $commission = WGP_Variations_Admin::get_commission( $product, $child );
      }
    }

    if ( $commission > 0 ) {
      $min_price = min( $original_prices );
      $max_price = max( $original_prices );
      $original_price = $min_price !== $max_price ? sprintf( _x( '%1$s–%2$s', 'Price range: from-to', 'woocommerce' ), wc_price( $min_price ), wc_price( $max_price ) ) : wc_price( $min_price );
    }
  } else {
    $commission = WooGroupPricing::get_commission( $product );
    if ( $commission ) {
      $original_price = woocommerce_price(get_post_meta( $product->id, $price_key, true ));
    }
  }

  if ( $commission ) {
    $result =  'Was:' . $original_price . " Now:" . $price;
  }
  return $result;
}

Si estás usando Woocommerce < 2.5.0


add_filter( 'woocommerce_get_price_html', 'your_own_price_html', 100, 2 );
function your_own_price_html( $price, $product ){
  $result = $price;
  if ( $product->is_type( 'variation' ) ) {
     $commission = WGP_Variations_Admin::get_commission( $product, $product->variation_id );
  } else {
     $commission = WooGroupPricing::get_commission( $product );
  }
  if ( $commission ) {
     $result =  'Was:' . woocommerce_price(get_post_meta( $product->id, '_price', true )) . " Now:" . $price;
  }
  return $result;
}
Posted on Leave a comment

Obtener nueva firma SHA-256 en TPVs Redsys

Los chicos de Redsys han decidido usar una firma más segura para sus conexiones, pasando a SHA-256. Para los que teníamos ya nuestros sistema usando el antiguo sistema SHA-1, tenemos hacer dos cosas:

– Actualizar nuestro plugin a una versión compatible. Nuestro plugin ya ha sido actualizado en la versión 2.0
– Obtener la nueva clave SHA-256 (de esto va este artículo)

Accedemos al portal del TPV.

redsys-login

Y al apartado de «Adm. TPV virtual»

redsys-panel

Accedemos a «Comercios»->Ver clave-> Mostrar clave

redsys-menu

Y la obtenemos de la ventana emergente que nos sale:

redsys-claves

Ya sólo tenemos que ponerla en la configuración del tpv, y estamos listos para usar nuestro sistema Redsys en Woocommerce.

Posted on Leave a comment

Restricciones por defecto con Groups

Si estás usando el plugin Groups de @itthinx Y necesitas establecer unas restricciones por defecto para todos los artículos/páginas/etc … este código puede ayudarte:

function restricted_save_post($post_id, $post) {
if(!is_object($post) || !isset($post->post_type)) {
return;
}
switch($post->post_type) { // Do different things based on the post type
case "post":
// add your default capabilities
Groups_Post_Access::create( array( 'post_id'=>$post_id, 'capability'=>'Premium' ) );
break;
default:
// Do other stuff
}
}
add_action('save_post', 'restricted_save_post', 1, 2);

Con el código se añade la capacidad ‘Premium’ a todos los nuevos artículos.

Suerte!