Incrementar de forma masiva precios en SQL prestashop

Por si os surge tener que subir o bajar los precios de forma masiva en la base de datos de prestashop, aqui os dejo un script para subir los precios de un determinado fabricante un 2%:

UPDATE ps_product, ps_product_shop SET ps_product.price = ps_product.price*1.02, ps_product_shop.price = ps_product_shop.price*1.02 WHERE ps_product.id_manufacturer = 1 AND ps_product.id_product = ps_product_shop.id_product

Se usan las tablas ps_product y ps_product_shop y modificamos el campo price en las dos tablas ps_product.price y ps_product_shop.price, sólo para el fabricante id_manufacturer=1 cuando el id_product coincide en las dos tablas.

Espero que os sea útil.

¡Comparte esto!
Ecommerce, Varios

Como trackear eventos de Google Universal Analytics con Javascript

Supongamos que tenemos una landing page y queremos trackear cuando los usuarios hacen click en un determinado botón de descarga de un pdf o de un enlace tanto interno como externo. Nuestro código de Google Analytics ha de tener implementado la función send y debería verse algo así:

<script type="text/javascript">//
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-XXXXXXX-1', 'auto');
  ga('send', 'pageview');
// ]]></script>

En segundo lugar hemos de etiquetar nuestro enlace, botón o imagen que contiene el enlace en el html dándole un id, por ejemplo id=”button”

<a id="button" class="clase" href="/cuenta-tu-experiencia/">¡Consigue tu Hairchalk!</a>

Según las instrucciones del centro de ayuda de Google Analytics, implementaremos el siguiente código, lo suyo es que lo hagamos en el footer, a mi en el header no me funcionó, para que se cargue una vez que el usuario ha hecho click en el enlace, además hemos implentado la función ‘hitCallback’, notificando la url a la que lleva el enlace,de este modo, puedes enviar al usuario a su destino solo después de que su click se haya comunicado a Google Analytics.

<script type="text/javascript">//
    var downloadLink = document.getElementById('button');
    addListener(downloadLink, 'click', function() {
        ga('send', 'event', 'boton_home', 'click', 'consigue_hairchalk', {
            'hitCallback': function(){
                document.location = 'http://miexperiencialuisytachi.es/cuenta-tu-experiencia/';
            }
        });
    });

function addListener(element, type, callback) {
 if (element.addEventListener) element.addEventListener(type, callback);
 else if (element.attachEvent) element.attachEvent('on' + type, callback);
}
// ]]></script>

En nuestro caso esta es la landing y el botón que queremos trackear:

Y este es el resultado contrastado en tiempo real en el panel de Analytics:

Me he puesto supercontento cuando he visto que funcionaba correctamente!

¡Comparte esto!
Analítica web

Optimizar tablas base de datos prestashop

Algunas tablas que podemos optimizar en la base de datos de prestashop:

1.- Referidas a estadísticas

truncate table ps_guest
truncate table ps_connections
truncate table ps_connections_page
truncate table ps_connections_source
truncate table ps_page_viewed

1.- Referidas a carros de la compra

truncate table ps_cart;
truncate table ps_cart_product;
truncate table ps_cart_discount;

Espero que os sea útil.

¡Comparte esto!
Diseño web, Ecommerce

Centrar una imagen de 1024×768 en horizontal sobre el fondo

/*Primero fijaremos el fondo para que quede fijo en el body*/

body{
background-image:url(images/background.gif);
background-color:#000000;
background-position: center;
background-attachment: fixed;
background-repeat:repeat-x;
overflow:auto;
}
/*aplicamos esta clase

por encima del html de la imagen/
#contenido {
position: absolute;
left: 50%;
margin-left: -512px; /*Restamos la mitad de ancho de la imagen*/
}

#contenido img {
width: 100%;
height: 100%;
}

¡Comparte esto!
Diseño web

Trackear subdominios con Google Analytics

Hay ocasiones, en que nuestra página web presenta uno o varios subdominios. Imagina que tenemos nuestro dominio dominio.com y subdominio.dominio.com. Con la configuración estándard de Google Analytics, todos nuestros informes independientemente del subdominio se agrupan de forma que sólo podemos distinguir el tráfico a las páginas en función del subdominio si las url,s son diferentes, por ejemplo podremos distinguir:

www.subdominio.dominio.com/page-1/

www.dominio.com/page-2/

por que veremos en los informes las cadenas a partir del dominio principal:

/page-1/

/page-2/

y sabemos que /page-1/ pertenece al subdominio, pero por ejemplo no seremos capaces de discernir los datos para el raiz “/”, y así en los informes veremos agrupadas las sesiones tanto para /subdominio.dominio.com/ y /dominio.com/ como “/”, sin poder saber si la visita fue al dominio principal o al subdominio.

Recomiendo activar las sigueintes cuestiones para poder ver el tráfico por separado:

1.- Introduciendo la instrucción _gaq.push(['_setDomainName', 'dominio.com']); en el javascript de Analytics. Activando el seguimiento de subdominios en la configuración inicial de la herramieta nos ahorraremos esto.

2.- En segundo lugar establecer un filtro personalizado, de forma que en nuestros informes se muestren las rutas completas incluido el subdominio. Para ello nos iremos a la configuración de la vista del administrador y crearemos el siguiente fitro avanzado:

A partir de aquí, podremos visualizar nuestros informes distinguiendo entre www.dominio.com y www.subdominio.dominio.com.

Recomiendo la lectura de estos artículos en Google Developers.

 

 

 

 

¡Comparte esto!
Analítica web

Detectar Iphone o Ipad y redirigir a una URL distinta con Javascript

En este caso nos encontramos con la situación de tener que usar una url diferente para Ipad o Iphone por cualquier motivo.

<script type="text/javascript">// <![CDATA[
 	if ((navigator.userAgent.indexOf('iPhone') != -1) || (navigator.userAgent.indexOf('iPod') != -1) || (navigator.userAgent.indexOf('iPad') != -1)) {
document.location = "http://www.nuevaurlparaipad.com";
 else
        window.location = "http://www.urlnormal.com";
	}
// ]]></script>

Tiene muchas aplicaciones, por ejemplo en nuestro caso lo hemos utilizado para mediante un evento onclick sobre un botón que nos lleva a una url con un video insertado, usar una url distinta para navegadores normales y otra url para ipad o iphone.

¡Comparte esto!
Diseño web, Varios

Como hacer que mi servidor apache interprete HTML5 para todos los Audio y Video MIME Types

Pues me estaba volviendo loco, pero si tienes el problema de que tu video se ve en unos navegadores y en otros no, no te quedará más remedio que añadir diferentes fuentes para el video, .mp4, .ogv, .webm etc.., luego si en algun navegador no se visualiza puede ser tan facil como añadir estas instrucciones AddType al archivo .htaccess.

HTML5 Audio & Video MIME Types

Audio
AddType audio/aac .aac
AddType audio/mp4 .mp4 .m4a
AddType audio/mpeg .mp1 .mp2 .mp3 .mpg .mpeg
AddType audio/ogg .oga .ogg
AddType audio/wav .wav
AddType audio/webm .webm
Video
AddType video/mp4 .mp4 .m4v
AddType video/ogg .ogv
AddType video/webm .webm

Si estás trabajando con WordPress y tienes problema para subir ficheros .webm o .mp4 por ejemplo debes ir a tu archivo functions.php y añadir lo siguiente:

add_filter('upload_mimes', 'mqw_mas_extensiones');

function mqw_mas_extensiones ( $existing_mimes=array() ) {

// Añadimos las nuevas extensiones al array junto con su mime type de la siguiente forma:

$existing_mimes['zip'] = 'application/zip';
$existing_mimes['mp4'] = 'video/mp4';
$existing_mimes['mpg'] = 'video/mpeg';
$existing_mimes['webm'] = 'video/webm';
//Añadimos todas las que queramos y devolvemos el array
return $existing_mimes;
}
¡Comparte esto!
Diseño web, Varios

Asignación masiva de clientes a un nuevo grupo y categorías en prestashop

Imagina que has creado un nuevo grupo de clientes en prestashop para poder hacerles descuentos especiales por ejemplo en una marca determinada.Hemos creado el nuevo grupo de clientes con id_group=4.

Primero, para asignar el nuevo grupo de clientes a todas las categorias, entramos en nuestra base de datos y primero nos exportamos a excell la tabla ps_category_group:

Tendremos un excell de este estilo, en el cual en registro o fila tendremos cada categoría junto a los tres grupos de clientes (1,2,3) que prestashop tenía por defecto. Pues bien lo único que debemos hacer es irnos al final del excell y generar tantas filas nuevas como categorías tenemos y asignar el valor “4″ del nuevo grupo al campo id_group.

Tendremos entonces un excell con cada categoría en la columna 1 asignada a los 4 grupos de clientes diferentes:

Ahora que tenemos la nueva tabla de datos la guardaremos en csv y la importaremos a nuestra tabla original sustituyendo la tabla antigua por la nueva:

Ahora lo que queremos es modificar algunos clientes para asignarlos al nuevo grupo creado, para ello en la tabla ps_customer, asignamos el grupo por defecto para todos los id de cliente que queremos cambiar de grupo:

UPDATE ps_customer SET id_default_group=4 WHERE id_customer
 IN ('60','95','103','106','110','112','113','118','124','132','139','140','142','148','160','162','167','179','182','183','190', '202','208','214','228','236','238','239','252','254','255','258')

Luego en la tabla ps_customer para todos los id de cliente:

UPDATE `ps_customer_group` SET `id_group` =4 WHERE `id_customer` IN ('60','95','103','106','110','112','113','118','124','132','139','140','142','148','160','162','167','179','182','183','190', '202','208','214','228','236','238','239','252','254','255','258')
¡Comparte esto!
Diseño web, Ecommerce

Modificar el mail de envio de WordPress

Si quieres que WordPress y algunos plugins que usa el sistema, envien el mail en nombre de una cuenta de correo determinada, tan sólo tienes que incluir este código en el archivo functions.php de tu wordpress:

add_filter('wp_mail_from','yoursite_wp_mail_from');
function yoursite_wp_mail_from($content_type) {
return 'tuemail@example.com';
}
add_filter('wp_mail_from_name','yoursite_wp_mail_from_name');
function yoursite_wp_mail_from_name($name) {
return 'Mi email elegido';
}

Espero que este pequeño post os sea útil.

¡Comparte esto!
Diseño web, Varios

Crear nuevo campo pestaña producto prestashop

Hoy me ha surgido el reto de añadir una pestaña nueva en la ficha de producto de un prestashop, con el objeto de mostrar una imagen, en este caso se trata de un pequeño mapa, pero el ejemplo nos puede servir para cualquier contenido de tipo HTML que queramos añadir como una campo nuevo en la ficha de producto.

Lo primero que debemos hacer es decidir el nombre que queremos asignar a nuestro nuevo campo, en este caso será “mapa_ruta”.

Una vez hecho esto, crearemos ese nuevo campo en nuestra base de datos MySQL, en la tabla ps_product_lang, con las mismas características que tendría el campo “description”:

Lo siguiente que debemos hacer es declarar ese nuevo campo en el núcleo de prestashop, para ello debemos editar el archivo classes/product.php, buscando la linea “class ProductCore extends ObjectModel { “ e incluyendo el siguiente código dentro de la llave:

class ProductCore extends ObjectModel
{
/** variable mapa en ficha producto */
public $mapa_ruta;

A continuación hemos de introducir la definición del nuevo campo en este mismo fichero, en el array “public static $definition = array( “, dentro del paréntesis en la sección donde están el resto de variables de la tabla ps_product_lang, usaremos los mismos valores que el campo “description”:

/* Lang fields */
'mapa_ruta' =>                     array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'),
'meta_description' =>             array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
'meta_keywords' =>                 array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
'meta_title' =>                 array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 128),
'link_rewrite' =>                 array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isLinkRewrite', 'required' => true, 'size' => 128),
'name' =>                         array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isCatalogName', 'required' => true, 'size' => 128),
'description' =>                 array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'),
'description_short' =>             array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'),
'available_now' =>                 array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
'available_later' =>             array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'IsGenericName', 'size' => 255),

Ahora hemos de hacer visible este campo en el backoffice, para lo cual hemos de acudir al fichero adminXXXX/themes/default/template/controllers/products/informations.tpl y buscar el sitio adecuado para mostrar nuestro campo, por ejemplo por debajo del campo description en el editor de las fichas de producto de prestashop, para ello duplicaremos el código del campo description que es este:


<tr>
<td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="description" type="tinymce" multilang="true"}
<label>{l s='Description:'}<br /></label>
<p class="product_description">({l s='Appears in the body of the product page'})</p>
</td>
<td style="padding-bottom:5px;">
{include file="controllers/products/textarea_lang.tpl" languages=$languages
input_name='description'
input_value=$product->description
}
<p class="clear"></p>
</td>
</tr>

Sustituyendo el campo “description” por nuestro campo “mapa_ruta” y duplicándolo:


<tr>
<td class="col-left">
{include file="controllers/products/multishop/checkbox.tpl" field="description" type="tinymce" multilang="true"}
<label>{l s='Mapa Ruta:'}<br /></label>
<p class="product_description">({l s='Appears in the body of the product page'})</p>
</td>
<td style="padding-bottom:5px;">
{include file="controllers/products/textarea_lang.tpl" languages=$languages
input_name='mapa_ruta'
input_value=$product->mapa_ruta
}
<p class="clear"></p>
</td>
</tr>

De esta forma, si váis a hora a vuestro backoffice de prestashop, veréis que el campo se ha creado en el formulario de edición, en la pestaña de información.

Finalmente hemos de irnos a la plantilla product.tpl del tema que estemos usando para mostrar la información del nuevo campo en las pestañas de información adicional, añadiendo las líneas :

{if $product->mapa_ruta}<li><a id="more_info_tab_more_info" href="#idTab11">{l s='Mapa Ruta'}</a></li>{/if}

y la línea :

<!-- Contenido de mapa de ruta -->
<div id="idTab11" class="rte">{$product->mapa_ruta}</div>

En la siguiente parte del código de product.tpl:

<!-- description and features -->
{if (isset($product) && $product->description) || (isset($features) && $features) || (isset($accessories) && $accessories) || (isset($HOOK_PRODUCT_TAB) && $HOOK_PRODUCT_TAB) || (isset($attachments) && $attachments) || isset($product) && $product->customizable}
<div id="more_info_block" class="block clear">
	<ul id="more_info_tabs" class="idTabs idTabsShort clearfix">
		{if $product->description}<li><a id="more_info_tab_more_info" href="#idTab1">{l s='More info'}</a></li>{/if}
		{if $product->mapa_ruta}<li><a id="more_info_tab_more_info" href="#idTab11">{l s='Mapa Ruta'}</a></li>{/if}
		{if $features}<li><a id="more_info_tab_data_sheet" href="#idTab2">{l s='Data sheet'}</a></li>{/if}
		{if $attachments}<li><a id="more_info_tab_attachments" href="#idTab9">{l s='Download'}</a></li>{/if}
		{if isset($accessories) AND $accessories}<li><a href="#idTab4">{l s='Accessories'}</a></li>{/if}
		{if isset($product) && $product->customizable}<li><a href="#idTab10">{l s='Product customization'}</a></li>{/if}
		{$HOOK_PRODUCT_TAB}
	</ul>
	<div id="more_info_sheets" class="sheets align_justify">
	{if isset($product) && $product->description}
		<!-- full description -->
		<div id="idTab1" class="rte">{$product->description}</div>
		<!-- Contenido de mapa de ruta -->
		<div id="idTab11" class="rte">{$product->mapa_ruta}</div>
	{/if}

Tened en cuenta que el contenido HTML del nuevo campo sólo se mostrará si existe contenido.

Espero que os haya gustado, os recomiendo que las pruebas con todo esto lo hagáis en local o en un servidor de prueba y que si tenéis la tienda en producción hagáis copia de seguridad de los archivos que estamso manejando al menos y de la base de datos.

¡Comparte esto!
Diseño web