Hace algún tiempo necesitaba crear una tienda en línea en WordPress. Hay muchas buenas soluciones en el repositorio oficial. Entre ellos, el líder: Woocommerce se ha destacado durante mucho tiempo. Creo que no necesita presentación. Un ejército multimillonario de usuarios, cientos de extensiones pagas y gratuitas y una flexibilidad increíble. Es por eso que Woocommerce tiene más de 5 millones de instalaciones activas y cubre una gran parte de las tiendas en línea en todo el mundo.
Aún así, decidí inventar mi bicicleta. En parte para impulsar habilidades, en parte para tratar de hacer un complemento de comercio electrónico que no requiera muchos recursos y sea lo suficientemente rápido. Recientemente lo publiqué
en el repositorio oficial , por lo tanto, invito a todos a probarlo. En este artículo no haré una descripción general de las posibilidades, pero solo hablaré sobre algunas soluciones técnicas interesantes.

Problema de enlaces permanentes
En general, los enlaces permanentes en WordPress son uno de los sitios más difíciles, ya que requieren resolver una serie de problemas de conexiones y dependencias. WpStore tiene la capacidad de administrar enlaces permanentes. Por ejemplo, puede eliminar la ficha de
product
URL del
product
, cambiar la suya propia o agregar la ficha de categoría o incluso anidar categoría. Los enlaces a productos pueden tener este aspecto:
./-/---/---/-/
. No esta mal.
Tuve que sudar mucho para obtener categorías de anidación. Usando la función
wp_get_object_terms,
obtenemos las categorías del producto especificado, y luego en el ciclo recopilamos las debilidades y formamos la url de acuerdo con la jerarquía de padres a hijos. Para mostrar los enlaces necesarios, usamos el filtro post_link. Aquí hay solo una parte del código (puede ver el código completo en la fuente):
add_filter( 'post_link', 'wpsl_post_type_permalink', 20, 3 ); add_filter( 'post_type_link', 'wpsl_post_type_permalink', 20, 3 ); function wpsl_post_type_permalink( $permalink, $post_id, $leavename ) { .... if ( is_admin() ) {
Pero en este punto, surgió un problema de rendimiento. El sitio comenzó a funcionar más lentamente, especialmente en la página de salida de varios productos. Por ejemplo, en la página de categoría con la salida de solo 16 productos, se realizaron casi 90 consultas a la base de datos y el tiempo de respuesta del servidor aumentó dramáticamente en aproximadamente un 25-30%.
Resultó que cuando se llama a la
función_permalink, WordPress realiza muchas operaciones: obtiene el tipo de CNC y recopila los datos de
publicación dependiendo de este tipo. Para mostrar 1 enlace, WordPress produce varias solicitudes no almacenadas en caché a la base de datos. Además, el proceso de obtención de taxonomías y jerarquías de bienes no es el más rápido.
Dado que la generación constante del enlace no nos conviene, es lógico almacenarlo en algún lugar y luego simplemente extraerlo de allí. Se decidió utilizar el campo
guid
especial de la tabla
guid
. Aunque los desarrolladores de WP no recomiendan cambiarlo, aún podemos ignorar esta advertencia por varias razones:
- guid se usa para generar RSS, y pocas personas lo usan.
- solo las entradas se muestran en RSS, y nuestro tipo de publicación es producto.
Para mantener los enlaces en la base de datos correctamente,
save_post
en el evento
save_post
una función que actualiza el campo guid:
add_action( 'save_post', 'wpsl_guid_rewrite', 100 ); function wpsl_guid_rewrite( $id ) { if( !is_admin() ) return; if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return false; if ( strpos( get_option( 'product_permalink' ), '%category%' ) !== false || strpos( get_option( 'product_permalink' ), '%categories%' ) !== false ) { if( $id && get_post_type( (int)$id ) == 'product' ){ global $wpdb; $wpdb->update( $wpdb->posts, [ 'guid' => ( get_permalink( $id ) ) ], [ 'ID' => intval( $id ) ] ); } clean_post_cache( $id ); } }
Nos queda por interceptar la salida del enlace en el enlace
post_type_link
y generar el enlace generado:
add_filter( 'post_type_link', 'wpsl_get_permalink_change', 10, 4 ); function wpsl_get_permalink_change( $post_link, $post, $leavename, $sample ){ if ( isset( $post->guid ) && $post->guid && $post->post_type == 'product' && ( strpos( get_option( 'product_permalink' ), '%category%' ) !== false || strpos( get_option( 'product_permalink' ), '%categories%' ) !== false ) ) { return $post->guid; } return $post_link; }
Aquí verificamos la integridad del campo guid, el tipo de publicación y el tipo de CNC. Si los valores de los tres parámetros nos convienen, muestre el enlace guardado anteriormente.
Ahora, la mejor parte es: mira los resultados. El número de consultas a la base de datos disminuyó casi 2 veces, ¡de casi 90 a 44! Y el tiempo de respuesta del servidor en el alojamiento de prueba se redujo a 0.24 segundos aceptables.
La actualización del campo guid se produce no solo durante la creación y edición de bienes. El complemento tiene un sistema incorporado para importar productos a través de csv, por lo que la actualización también se produce cuando se completa la importación.
Actualización:
documentación del complemento