Categorías
Prestashop

¿Como quitar el cuadro de seleccionar moneda en prestashop?

Tienes que ir a la sección de módulos y buscar «moneda» y pulsar en desactivar el modulo, ya no te aparecerá el selector.

Categorías
woocommerce

Ocultar el resto de gastos de envió, cuando el envió sea gratuito en woocommerce

Parece ser que existe un problema muy común, que surge cuando habilitas varios tipos de gastos de envío y habilitas la opción de gasto de envío gratuito cuando cumpla X condiciones.

Pues resulta que cuando se cumple los criterios para que el envío sea gratuito, woocommerce te da muestra una lista con todos los tipos de envíos disponibles, ¡incluido el envío gratuito!

Lo cual parece curioso, si ya es gratis el envio, para que mostrar la lista de los de pago, obviamente ningún cliente quiere pagar gastos de envío.

Y para mas inri, resulta que woocommerce, ofrece una solución un poco rara, ya que viene ocurriendo desde los inicios de woocommerce y es incluir una función dentro del tema hijo en funtions.php

O en su defecto utilizar un plugin de terceros WC Hide Shipping Methods

Versión WC 3.0+

/**
 * Hide shipping rates when free shipping is available.
 * Updated to support WooCommerce 2.6 Shipping Zones.
 *
 * @param array $rates Array of rates found for the package.
 * @return array
 */
 function my_hide_shipping_when_free_is_available( $rates ) {
 $free = array();
 foreach ( $rates as $rate_id => $rate ) {
 if ( 'free_shipping' === $rate->method_id ) {
 $free[ $rate_id ] = $rate;
 break;
 }
 }
 return ! empty( $free ) ? $free : $rates;
 }
 add_filter( 'woocommerce_package_rates', 'my_hide_shipping_when_free_is_available', 100 );

Versión WC 2.5

/**
 * woocommerce_package_rates is a 2.1+ hook
 */
 add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2 );
 /**
 * Hide shipping rates when free shipping is available
 *
 * @param array $rates Array of rates found for the package
 * @param array $package The package array/object being shipped
 * @return array of modified rates
 */
 function hide_shipping_when_free_is_available( $rates, $package ) {
 // Only modify rates if free_shipping is present
 if ( isset( $rates['free_shipping'] ) ) {
 // To unset a single rate/method, do the following. This example unsets flat_rate shipping
 unset( $rates['flat_rate'] );
 // To unset all methods except for free_shipping, do the following
 $free_shipping = $rates['free_shipping'];
 $rates = array();
 $rates['free_shipping'] = $free_shipping;
 }
 return $rates;
 }
 

Versión < WC 2.5

/**
 * Hide ALL shipping options when free shipping is available and customer is NOT in certain states
 * Hide Free Shipping if customer IS in those states
 *
 * UPDATED FOR WOOCOMMERCE 2.1
 *
 * Change $excluded_states = array( 'AK','HI','GU','PR' ); to include all the states that DO NOT have free shipping
 */
 add_filter( 'woocommerce_package_rates', 'hide_all_shipping_when_free_is_available' , 10, 2 );
 /**
 * Hide ALL Shipping option when free shipping is available
 *
 * @param array $available_methods
 */
 function hide_all_shipping_when_free_is_available( $rates, $package ) {
 $excluded_states = array( 'AK','HI','GU','PR' );
 if( isset( $rates['free_shipping'] ) AND !in_array( WC()->customer->shipping_state, $excluded_states ) ) :
 // Get Free Shipping array into a new array
 $freeshipping = array();
 $freeshipping = $rates['free_shipping'];
 // Empty the $available_methods array
 unset( $rates );
 // Add Free Shipping back into $avaialble_methods
 $rates = array();
 $rates[] = $freeshipping;
 endif;
 if( isset( $rates['free_shipping'] ) AND in_array( WC()->customer->shipping_state, $excluded_states ) ) {
 // remove free shipping option
 unset( $rates['free_shipping'] );
 }
 return $rates;
 }
Categorías
Base de datos

Cómo elegir la base de datos entre MyISAM o InnoDB

El motor de almacenamiento se encarga de almacenar, manejar y recuperar información de una tabla. Los motores más conocidos son MyISAM e InnoDB. La elección de uno u otro dependerá mucho del escenario donde se aplique.

En la elección se pretende conseguir la mejor relación de calidad acorde con nuestra aplicación. Si necesitamos transacciones, claves foráneas y bloqueos, tendremos que escoger InnoDB.

Por el contrario, escogeremos MyISAM en aquellos casos en los que predominen las consultas SELECT a la base de datos.

InnoDB dota a MySQL de un motor de almacenamiento transaccional (conforme a ACID) con capacidades de commit (confirmación), rollback (cancelación) y recuperación de fallos.

InnoDB realiza bloqueos a nivel de fila y también proporciona funciones de lectura consistente sin bloqueo al estilo Oracle en sentencias SELECT.

Estas características incrementan el rendimiento y la capacidad de gestionar múltiples usuarios simultáneos.

No se necesita un bloqueo escalado en InnoDB porque los bloqueos a nivel de fila ocupan muy poco espacio.

InnoDB también soporta restricciones FOREIGN KEY. En consultas SQL, aún dentro de la misma consulta, pueden incluirse libremente tablas del tipo InnoDB con tablas de otros tipos

InnoDB

InnoDB es una tecnología de almacenamiento de datos de fuente abierta para MySQL, incluido como formato de tabla estándar en todas las distribuciones de MySQL AB a partir de las versiones 4.0.

Su característica principal es que soporta transacciones de tipo ACID y bloqueo de registros e integridad referencial. InnoDB ofrece una fiabilidad y consistencia muy superior a MyISAM, la anterior tecnología de tablas de MySQL, si bien el mejor rendimiento de uno u otro formato dependerá de la aplicación específica.

  • Soporte de transacciones
  • Bloqueo de registros
  • Nos permite tener las características ACID (Atomicity, Consistency, Isolation and Durability: Atomicidad, Consistencia, Aislamiento y Durabilidad en español), garantizando la integridad de nuestras tablas.
  • Es probable que si nuestra aplicación hace un uso elevado de INSERT y UPDATE notemos un aumento de rendimiento con respecto a MyISAM.

MyISAM

MyISAM es la tecnología de almacenamiento de datos usada por defecto por el sistema administrador de bases de datos relacionales MySQL.

Este tipo de tablas están basadas en el formato ISAM pero con nuevas extensiones. En las últimas versiones de Mysql, el motor InnoDB está empezando a reemplazar a este tipo de tablas por su capacidad de ejecutar transacciones de tipo ACID y bloqueo de registros e integridad referencial.

  • Mayor velocidad en general a la hora de recuperar datos.
  • Recomendable para aplicaciones en las que dominan las sentencias SELECT ante los INSERT / UPDATE.
  • Ausencia de características de atomicidad ya que no tiene que hacer comprobaciones de la integridad referencial, ni bloquear las tablas para realizar las operaciones, esto nos lleva como los anteriores puntos a una mayor velocidad
Categorías
asp.net

Acceso a Bases de Datos – ADO.NET – Modo Desconectado, con ASP .Net y MVC4

Hasta el momento se ha empleado una conexión abierta hacia la base de datos para realizar las peticiones de consulta o actualización de información persistente, sin embargo un compañero comentó que sería bueno hacer hincapié en que, según la necesidad del cliente, se podría hacer uno de un “modo desconectado” de acceso a base de datos. Lo cual recuerda que sería bueno definir los conceptos de modo conectado y desconectado.

Pero… ¿A qué se refieren los desarrolladores con los términos conectado o desconectado?

La forma común y más fácil de implementar en el modo “conectado” o modo de trabajo en el cual el sistema abre una conexión, realiza una acción (o transacción) sobre la base de datos y al final cierra dicha conexión por lo cual los datos quedan persistentes inmediatamente. El modo desconectado sería lo equivalente a hacer una copia local de los objetos de la base de datos sobre las que se desea trabajar (realizando una única apertura inicial de la conexión a base de datos al inicio), para manipularlos con el número de transacciones que se desee y finalmente hacer un volcado del resultado sobre la base de datos, momento en el cual los cambios son recién persistentes.

Esquema del modo desconectado de acceso a BBDD

La pregunta que os surgirá en estos momentos, es ¿Cual es más eficiente? La respuesta es “Depende”.

Si se ha optado por un sistema en el que se va a manipular datos muy delicados y un cambio no registrado puede significar una gestión errónea en una transacción que se ejecute inmediatamente después de la primera, por lo que sería recomendable que dicha aplicación tenga un sistema conectado, ya que de esta manera en todo momento la comunicación con la base de datos y la información estará actualizada. Sin embargo esto va a producir un alto consumo de recursos (entre ellos, las aperturas y cierres de conexiones además de las operaciones de gestión interna del sistema gestor de base de datos) pero va evitar errores que podrían suponer graves consecuencia para el cliente. Por poner un ejemplo sencillo piénsese en un banco o tienda online donde un cambio en la cuenta puede afectar a las siguientes acciones disponibles, generando un error si no se actualizan los cambios inmediatamente.

Por otro lado, si el sistema en cuestión no requiere de una actualización continua de información  sería recomendable utilizar una conexión en modo desconectado, donde la información se carga al iniciar la aplicación y en la que se vaya refrescando cada determinado tiempo según el criterio que se crea conveniente. Este tipo de sistemas agota los recursos de una manera completamente distinta, ya que en un sistema conectado, solo tenemos que recuperar la información que no sea necesaria en ese momento, mientras que en este caso recuperaremos mucha información inicialmente, para poder cerrar la base de datos. Para citar un ejemplo se puede pensar en un volcado masivo entra bases de datos.

Se dice que el objeto DataReader realiza un modo conectado ya que necesita tener un curso abierto a la base de datos para poder operar sin embargo el DataSet se dice que es desconectado ya que este ejecuta carga los valores en memoria, desconecta y cuando se requiera se volverá a conectar para realizar un volcado de los datos contenidos en memoria en el soporte persistente de datos.

Elementos presentes en la base de datos

Por otro lado, si el desarrollador lo desea también podría servirse de ambas tecnologías para la consecución de sus fines, ya que puede usar en DataReader para leer y volcar los valores a objetos de clases personalizadas y luego desconectar, de la misma manera que lo hace DataAdapter, pero manualmente.

Ahora se mostrará cómo se haría un acceso a base de datos y manipulación por medio de un modo Desconectado.

Para empezar se definirá el controlador de la página es el siguiente:

Controlador de la vista ADO_Desconectado

A destacar que se utilizará el mismo código de vista que se ha utilizado en el post anterior, simplemente se cambiará el código del método utilizado en modelo, el cual será llamado getAllDataDesconectado

Codigo presente en el Modelo para la obtención de datos en modo desconectado.

Como se puede ver, el programador ha creado un DataSet en el que ha añadido una tabla llamada “Asistentes”. El DataAdapter llenará de datos al DataSet en su tabla Asistentes. Y posteriormente se leerán los datos del DataTable y se realizará la acción que más convenga, en este caso, guardarlos datos en una lista para devolvérsela al controlador.

Como paso final solo quedaría mostrar el resultado en la vista.

Ahora que ya se sabe hacer una consulta sobre la base de datos utilizando el modo desconectado, no es complicado hacer modificaciones o eliminaciones sobre los elementos del DataSet y así, al volcar los datos a la base de datos al final de la operación, modificar los elementos persistentes en la base de datos.

Categorías
Wordpress

Listado de funciones de wordpress

Categorías

Categorías
Prestashop

PrestaShop 1.6.x. Error “An error occurred while updating an object. product ()”

Para solucionar este problema “An error occurred while updating an object. product ()”

Usted debe ejecutar las siguientes SQL en su servidor de base de datos, cambiado ps_ por el prefijo de su base de datos.

ALTER TABLE `ps_product` ADD` pack_stock_type` int (11) DEFAULT UNSIGNED '3';
ALTER TABLE `ps_product_shop` ADD` pack_stock_type` int (11) DEFAULT UNSIGNED '3';
ALTER TABLE `ps_pack` ADD` id_product_attribute_item` int (10) NOT NULL UNSIGNED DESPUÉS `id_product_item`;
ALTER TABLE `ps_pack` DROP PRIMARY KEY
Categorías
Visual Basic

Script de cambio de dns

Este verificará si ya tiene las DNS nuevas, en caso contrario, las cambiará.

On Error Resume Next
strComputer = "." 
strDNSNuevas = "Servidor_DNS_1,Servidor_DNS_2″ 
Set objWMIService = GetObject("winmgmts://" _ & "{impersonationlevel=impersonate}|\" & strComputer & "rootcimv2″) 
Set colNetCards = objWMIService.ExecQuery _ ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IpEnabled = True") 
For Each objNetCard In colNetCards
    strDNSs = Join(objNetCard..DNSServerSearchOrder,",") 
    If strDNSs <> strDNSNuevas Then
        objNetCard.Set.DNSServerSearchOrder(Join(strDNSNuevas,","))
    End If 
Next
Categorías
HTML5

Metatags

metatag Robots, para que sirve

La metaetiqueta «robots» permite utilizar un enfoque granular y a nivel de página para controlar cómo se deben indexar y servir a los usuarios páginas concretas en los resultados de la Búsqueda de Google.

<meta name="robots" content="noindex" />

La metaetiqueta «robots» del ejemplo anterior indica a los buscadores que no muestren esa página en los resultados de búsqueda.

Como el atributo name tiene el valor robots, la directiva se aplica a todos los rastreadores.

Para aplicarla a un rastreador específico, sustituye el valor robots del atributo name por el nombre del rastreador en cuestión.

Los rastreadores específicos también se denominan user-agent (los rastreadores utilizan su user-agent para solicitar acceso a una página).

El nombre de user-agent del rastreador web estándar de Google es Googlebot.

<meta name="googlebot" content="noindex" />

Los buscadores pueden tener distintos rastreadores con propiedades y fines diferentes.

Directivas de la metaetiqueta «robots» y los elementos «data-nosnippet» y «X-Robots-Tag»

all

No hay restricciones de indexación ni de publicación. Esta directiva es el valor predeterminado y no tiene ningún efecto si se utiliza de forma explícita.

noindex

No se muestra la página en los resultados de búsqueda.

nofollow

No se siguen los enlaces de la página.

none

Equivalente a noindex, nofollow.

noarchive

No se muestra ningún enlace en caché en los resultados de búsqueda.

nosnippet

No se muestra ningún fragmento ni la vista previa de ningún vídeo en los resultados de búsqueda de la página. Es posible que se siga mostrando una miniatura de imagen estática (si está disponible) si permite obtener una mejor experiencia de usuario.

Esto se aplica a todas las formas de resultados de búsqueda (en la Búsqueda web de Google, Google Imágenes o Discover).

max-snippet:[number]

Se usan un máximo de [number] caracteres como fragmento de texto para este resultado de búsqueda (ten en cuenta que una URL puede aparecer como varios resultados de búsqueda en una página de resultados de búsqueda).

No afecta a las vistas previas de imágenes o vídeos y, además, se aplica a todas las formas de resultados de búsqueda (como la Búsqueda web de Google, Google Imágenes, Descubrir o el Asistente). Sin embargo, este límite no se aplica en los casos en los que un editor haya concedido permiso por separado para utilizar el contenido.

Por ejemplo, si el editor proporciona contenido en forma de datos estructurados en la página o tiene un acuerdo de licencia con Google, esta configuración no interrumpe los usos permitidos más específicos. Esta directiva se ignora si no se especifica ningún elemento [number] que se pueda analizar.

Valores especiales:

0: no se mostrará ningún fragmento. Equivalente a nosnippet.
-1: no hay límite de longitud de fragmentos.

Ejemplo: max-image-preview:[setting]

Se establece el tamaño máximo de una vista previa de imagen para la página en los resultados de búsqueda.

Valores setting aceptados:

  • none
    No se mostrará ninguna vista previa de la imagen.
  • standard
    Es posible que se muestre una vista previa de la imagen predeterminada.
  • large
    Es posible que se muestre una vista previa más grande de una imagen, hasta el ancho del viewport.

Se aplica a todo tipo de resultados de búsqueda (como la Búsqueda web de Google, Google Imágenes, Discover o el Asistente). Sin embargo, este límite no se aplica en los casos en los que un editor haya concedido permiso por separado para utilizar el contenido.

Por ejemplo, si el editor proporciona contenido en forma de datos estructurados en la página, como AMP y versiones canónicas de un artículo, o tiene un acuerdo de licencia con Google, esta configuración no interrumpirá los usos permitidos más específicos.

Los editores que no quieran que Google muestre imágenes en miniatura de mayor tamaño cuando sus páginas AMP y la versión canónica de un artículo aparezcan en la búsqueda o en Discover deben especificar un valor max-image-preview de standard o none.

Ejemplo: max-video-preview:[number]

Utiliza fragmentos de vídeo de [number] segundos como máximo para los vídeos de esta página en los resultados de búsqueda.

Otros valores admitidos:

0: como máximo, se puede utilizar una imagen estática, de acuerdo con la configuración de «max-image-preview».
-1: no hay límite.

Se aplica a todo tipo de resultados de búsqueda (en la Búsqueda web de Google, Google Imágenes, Google Vídeos, Discover o el Asistente).

Esta directiva se ignora si no se especifica ningún elemento [number] que se pueda analizar.

Ejemplo:

  • notranslate
    No se ofrece una traducción de esta página en los resultados de búsqueda.
  • noimageindex
    No se indexan las imágenes de esta página.
  • unavailable_after: [date/time]
    No se muestra esta página en los resultados de búsqueda después de la fecha y hora especificadas. La fecha y la hora deben especificarse en formatos ampliamente aceptados, como RFC 822, RFC 850 o ISO 8601. Esta directiva se ignora si no se especifica ningún valor [date/time] válido. De forma predeterminada, el contenido no tiene fecha de caducidad.

https://developers.google.com/search/reference/robots_meta_tag

Consulta la lista completa de los rastreadores de Google.

RastreadorToken de user-agent (token de producto)Cadena de user-agent completa
APIs-GoogleAPIs-GoogleAPIs-Google (+https://developers.google.com/webmasters/APIs-Google.html)
AdSenseMediapartners-GoogleMediapartners-Google
AdsBot Mobile Web Android Comprueba la calidad de los anuncios ubicados en las páginas web que se muestran en un dispositivo Android.AdsBot-Google-MobileMozilla/5.0 (Linux; Android 5.0; SM-G920A) AppleWebKit (KHTML, like Gecko) Chrome Mobile Safari (compatible; AdsBot-Google-Mobile; +http:/www.google.com/mobile/adsbot.html)
AdsBot Mobile Web Comprueba la calidad de los anuncios ubicados en las páginas web que se muestran en un iPhone.AdsBot-Google-MobileMozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 (compatible; AdsBot-Google-Mobile; +http:/www.google.com/mobile/adsbot.html)
AdsBot Comprueba la calidad de los anuncios ubicados en las páginas web que se muestran en un ordenador.AdsBot-GoogleAdsBot-Google (+http:/www.google.com/adsbot.html)
Googlebot ImageGooglebot-Image GooglebotGooglebot-Image/1.0
Googlebot NewsGooglebot-News GooglebotGooglebot-News
Googlebot VideoGooglebot-Video GooglebotGooglebot-Video/1.0
Googlebot (ordenadores)GooglebotMozilla/5.0 (compatible; Googlebot/2.1; +http:/www.google.com/bot.html) Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http:/www.google.com/bot.html) Chrome/W.X.Y.Z Safari/537.36

o (se utiliza con poca frecuencia):
  Googlebot/2.1 (+http:/www.google.com/bot.html)
Googlebot (smartphones)Googlebot  Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/W.X.Y.Z Mobile Safari/537.36 (compatible; Googlebot/2.1; +http:/www.google.com/bot.html)
Mobile AdSenseMediapartners-Google(En varios tipos de dispositivos móviles) (compatible; Mediapartners-Google/2.1; +http:/www.google.com/bot.html)
Mobile Apps Android Comprueba la calidad de los anuncios ubicados en las páginas web que se muestran en aplicaciones para Android. Sigue las reglas de robots de AdsBot-Google.AdsBot-Google-Mobile-AppsAdsBot-Google-Mobile-Apps
FeedfetcherFeedFetcher-Google No sigue las reglas del archivo robots.txt. Averigua por qué.FeedFetcher-Google; (+http:/www.google.com/feedfetcher.html)
Google Read AloudGoogle-Read-Aloud No sigue las reglas del archivo robots.txt. Averigua por qué.User-agent activo:
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36 (compatible; Google-Read-Aloud; +https://support.google.com/webmasters/answer/1061943) User-agent antiguo (obsoleto):
google-speakr
Duplex on the WebDuplexWeb-Google Puede que ignore el comodín * en el campo de user-agent. Averigua por qué.Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012; DuplexWeb-Google/1.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Mobile Safari/537.36
Google Favicon Consigue iconos de página de distintos servicios.Google Favicon Ignora las reglas de robots.txt en las solicitudes iniciadas por usuarios.  Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)  Chrome/49.0.2623.75 Safari/537.36 Google Favicon

Por ejemplo, para mostrar una página en los resultados de búsqueda web de Google, pero no en Google Noticias, utiliza la siguiente metaetiqueta:

<meta name="googlebot-news" content="noindex" />

Para especificar varios rastreadores de forma individual, puedes utilizar varias metaetiquetas «robots»:

<meta name="googlebot" content="noindex">
<meta name="googlebot-news" content="nosnippet">

metatag NOODP, para que sirve

Si tu sitio web está listado en el Open Directory Project (DMOZ), los buscadores puede elegir por utilizar el titulo y la descripción de DMOZ en sus resultados de sus búsquedas y no lo que consta en tu pagina web, unas veces ocurre también por que en tu pagina esta faltando el titulo y/o meta descripción.

Para evitar este comportamiento se debe hacer uso de la meta tag NOODP, si por el contrario si que queremos forzar a que los datos los extraiga de DMOZ debemos poner ODP.

Común para todos los buscadores

<meta name="" content="noodp"> Datos propios
<meta name="" content="odp">  Datos de DMOZ

Buscadores específicos

En el name poner el nombre del robot de búsqueda

Robot de Google

<meta name="googlebot" content="noodp"> No DMOZ
<meta name="googlebot" content="odp"> Si DMOZ

Robot de Yahoo

<meta name="slurp" content="noodp"> No DMOZ
<meta name="slurp" content="odp"> Si DMOZ

Robot de Bing

<meta name="msnbot" content="noodp"> No DMOZ
<meta name="msnbot" content="odp"> Si DMOZ

NOTA: El 17 de marzo de 2017 se dio de baja este servicio, con lo que esta meta no tiene ninguna utilidad a fecha de hoy.

Puedes navegar por lo que era dmoz.org, aqui.

Pantalla de la web dmoz.org después del cierre