tag:blogger.com,1999:blog-33881241252560929302024-03-14T03:10:46.567-07:00Bruno Zelaia WeblogBruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.comBlogger55125tag:blogger.com,1999:blog-3388124125256092930.post-88288966509601950992017-11-11T03:03:00.000-08:002017-11-11T03:03:04.082-08:00Apuntes javascript parte ICuando accedemos a clases se guarda como una colección de objetos HTML. Accedemos mediante el método getElementsByClassName. Para verlo bien lo mejor es un ejemplo.<br />
<br />
var descripcioncategoria = document.getElementsByClassName("term-description");<br />
<br />
En la variable descripcion corta hemos guardado los elementos que se encuentran en el HTML de la página web que hemos accedido que son de la clase term-descripcion (en concreto era un <div class="term-descripcion">).<br />
<br />
En este caso solo había un div con esta clase con lo cual para acceder al HTML que hay dentro lo haremos de la siguiente manera:<br />
<br />
var descripcioncategoria = document.getElementsByClassName("term-description")[0].innerHTML;<br />
<br />
Aquí le estamos indicando que queremos acceder al primer elemento de la colección de objetos.<br />
<br />
Aunque esto puede parecer obvio la falta de habito o el desconocimiento de esto nos puede crear mucha pérdida de tiempo, dolores de cabeza y frustración.<br />
<br />
Otro dato a tener en cuenta aquí es que cuando se quiere añadir algo con innerHTML se usa las " " , como siempre lo mejor es ver un ejemplo de como se hace :<br />
<br />
<br />
var descripcioncategoria = document.getElementsByClassName("term-description")[0].innerHTML=descripcioncategoria+" pues ya ves"<br />
<br />
En este ejemplo he hecho sobrecarga en la variable descripcioncategoria guardando a ella misma más el texto nuevo que he añadido, en este caso el " pues ya ves".<br />
<br />
<br />
<br />Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-23112251920265209112017-11-09T00:13:00.000-08:002017-11-09T00:13:21.049-08:00One month JQuery: Como se hace un set de imagenes en Lightbox y que esEn JQuery lightbox que es una libreria JQuery para presentaciones de imágenes se puede realizar un set de estas, un set es un conjunto de imagenes supuestamente de misma tématica en la cual puedes navegar entre ellas mediante los cursores. Para eso simplemente en el campo data-lightbox deben de tener el mismo nombre todas las fotos que pertenezcan a ese set. He aquí un ejemplo:<br />
<br />
<!DOCTYPE html><br />
<html lang="en"><br />
<head><br />
<meta charset="utf-8"><br />
<meta http-equiv="X-UA-Compatible" content="IE=edge"><br />
<meta name="viewport" content="width=device-width, initial-scale=1"><br />
<title>Summer Vacation</title><br />
<!-- CSS --><br />
<link href="styles.css" rel="stylesheet"><br />
<link href="lightbox2-master/dist/css/lightbox.css" rel="stylesheet"><br />
</head><br />
<body><br />
<div class="container"><br />
<header><br />
<span>— My Trip to —</span><br />
<h1>The Golden State</h1><br />
</header><br />
<!-- Thumbnail Images --><br />
<a href="assets/images/image1.jpg" data-lightbox="roadtrip" data-title="Surfing"><br />
<span style="white-space: pre;"> </span><img src="assets/thumbnails/thumb1.jpg" alt="Surfing"/><br />
</a><br />
<a href="assets/images/image2.jpg" data-lightbox="roadtrip" data-title="Lifeguard Stand"><br />
<span style="white-space: pre;"> </span><img src="assets/thumbnails/thumb2.jpg" alt="Lifeguard Stand"/><br />
</a><br />
<a href="assets/images/image3.jpg" data-lightbox="roadtrip" data-title="Hot Air Balloon"><br />
<span style="white-space: pre;"> </span><img src="assets/thumbnails/thumb3.jpg" alt="Hot Air Balloon"/><br />
</a><br />
<a href="assets/images/image4.jpg" data-lightbox="roadtrip" data-title="Field Freedom"><br />
<span style="white-space: pre;"> </span><img src="assets/thumbnails/thumb4.jpg" alt="Field Freedom"/><br />
</a><br />
<a href="assets/images/image5.jpg" data-lightbox="roadtrip" data-title="Golden Gate Bridge"><br />
<span style="white-space: pre;"> </span><img src="assets/thumbnails/thumb5.jpg" alt="Golden Gate Bridge"/><br />
</a><br />
<a href="assets/images/image6.jpg" data-lightbox="roadtrip" data-title="Pacific Ocean Sunset"><br />
<span style="white-space: pre;"> </span><img src="assets/thumbnails/thumb6.jpg" alt="Pacific Ocean Sunset"/><br />
</a><br />
</div><br />
<!-- JavaScript --><br />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script><br />
<script src="lightbox2-master/dist/js/lightbox.js"></script><br />
<script><br />
<span style="white-space: pre;"> </span>lightbox.option({<br />
<span style="white-space: pre;"> </span>'positionFromTop': 100,<br />
<span style="white-space: pre;"> </span><br />
<span style="white-space: pre;"> </span>})<br />
</script><br />
</body><br />
</html>Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-61454937118999342042017-08-10T22:29:00.001-07:002017-08-10T22:30:31.823-07:00Comando para permitir la gestión remota de CUPS desde el navegador<pre><code>cupsctl --remote-admin</code></pre>
<pre><code> </code></pre>
<pre><code>Tan fácil como poner este comando con estos argumentos en la terminal :-) </code></pre>
Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-1573523705493585542017-07-17T09:39:00.001-07:002017-07-17T09:39:38.680-07:00JQuery mostrar imagen 1 o 2 según si tiene precio o el texto consultarEste es el script que he hecho para que según contexto ponga una imagen u otra:<br />
<br />
var nodoprecio = document.getElementsByClassName("price");<br />
nodoprecio = nodoprecio[0].textContent;<br />
nodoprecio = nodoprecio.trim();<br />
var consultar = 'Consultar';<br />
if (nodoprecio === consultar){<br />
$(".price").after("<div id='imgportes'><img src='http://www.mundobodega.com/content/972068/consultar_mundobodega.png' /></div>");<br />
}<br />
else{<br />
$(".price").after("<div id='imgportes2'><img src='http://www.mundobodega.com/content/972068/envio_mundobodega_2.png' /></div>");<br />
}<br />
<br />
la primera versión me daba problemas en FireFox porque en vez de textContent que es el que marca el estándar a usar usaba outerText que es propietario de MS.<br />
<br />
Bien está lo que bien acaba.Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-88968946211834305062017-07-12T00:36:00.001-07:002017-07-12T00:36:12.863-07:00Añadir al carro y seleccionar variacion del producto desde la pagina de catalogoCon este trozo de código pegado en el functions.php del tema que este vigente conseguiremos que en la catalog shop page (pagina que muestra los productos nos salga el añadir al carrito y escoger las variaciones si el producto dispone de ellas claro está.<br /> El código es de Remi Corson, grande!<br />
<a href="http://www.remicorson.com/display-woocommerce-product-variations-dropdown-on-the-shop-page/">http://www.remicorson.com/display-woocommerce-product-variations-dropdown-on-the-shop-page/</a><br />
<br />
// Display variations dropdowns on shop page for variable products<br /> add_filter( 'woocommerce_loop_add_to_cart_link', 'woo_display_variation_dropdown_on_shop_page' );<br /><br /> function woo_display_variation_dropdown_on_shop_page() {<br /> <br /> global $product;<br /> if( $product->is_type( 'variable' )) {<br /> <br /> $attribute_keys = array_keys( $product->get_attributes() );<br /> ?><br /> <br /> <form class="variations_form cart" method="post" enctype='multipart/form-data' data-product_id="<?php echo absint( $product->id ); ?>" data-product_variations="<?php echo htmlspecialchars( json_encode( $product->get_available_variations() ) ) ?>"><br /> <?php do_action( 'woocommerce_before_variations_form' ); ?><br /> <br /> <?php if ( empty( $product->get_available_variations() ) && false !== $product->get_available_variations() ) : ?><br /> <p class="stock out-of-stock"><?php _e( 'This product is currently out of stock and unavailable.', 'woocommerce' ); ?></p><br /> <?php else : ?><br /> <table class="variations" cellspacing="0"><br /> <tbody><br /> <?php foreach ( $product->get_attributes() as $attribute_name => $options ) : ?><br /> <tr><br /> <td class="label"><label for="<?php echo sanitize_title( $attribute_name ); ?>"><?php echo wc_attribute_label( $attribute_name ); ?></label></td><br /> <td class="value"><br /> <?php<br /> $selected = isset( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ? wc_clean( urldecode( $_REQUEST[ 'attribute_' . sanitize_title( $attribute_name ) ] ) ) : $product->get_variation_default_attribute( $attribute_name );<br /> wc_dropdown_variation_attribute_options( array( 'options' => $options, 'attribute' => $attribute_name, 'product' => $product, 'selected' => $selected ) );<br /> echo end( $attribute_keys ) === $attribute_name ? apply_filters( 'woocommerce_reset_variations_link', '<a class="reset_variations" href="#">' . __( 'Clear', 'woocommerce' ) . '</a>' ) : '';<br /> ?><br /> </td><br /> </tr><br /> <?php endforeach;?><br /> </tbody><br /> </table><br /> <br /> <?php do_action( 'woocommerce_before_add_to_cart_button' ); ?><br /> <br /> <div class="single_variation_wrap"><br /> <?php<br /> /**<br /> * woocommerce_before_single_variation Hook.<br /> */<br /> do_action( 'woocommerce_before_single_variation' );<br /> <br /> /**<br /> * woocommerce_single_variation hook. Used to output the cart button and placeholder for variation data.<br /> * @since 2.4.0<br /> * @hooked woocommerce_single_variation - 10 Empty div for variation data.<br /> * @hooked woocommerce_single_variation_add_to_cart_button - 20 Qty and cart button.<br /> */<br /> do_action( 'woocommerce_single_variation' );<br /> <br /> /**<br /> * woocommerce_after_single_variation Hook.<br /> */<br /> do_action( 'woocommerce_after_single_variation' );<br /> ?><br /> </div><br /> <br /> <?php do_action( 'woocommerce_after_add_to_cart_button' ); ?><br /> <?php endif; ?><br /> <br /> <?php do_action( 'woocommerce_after_variations_form' ); ?><br /> </form><br /> <br /> <?php } else {<br /> <br /> echo sprintf( '<a rel="nofollow" href="%s" data-quantity="%s" data-product_id="%s" data-product_sku="%s" class="%s">%s</a>',<br /> esc_url( $product->add_to_cart_url() ),<br /> esc_attr( isset( $quantity ) ? $quantity : 1 ),<br /> esc_attr( $product->id ),<br /> esc_attr( $product->get_sku() ),<br /> esc_attr( isset( $class ) ? $class : 'button' ),<br /> esc_html( $product->add_to_cart_text() )<br /> );<br /> <br /> }<br /> <br />}Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-33427092641277012272016-09-28T23:32:00.001-07:002016-09-28T23:32:08.337-07:00Problemas borrando productos (variaciones siguen en BD pero no aparecen en la interfaz)Este es un problema que se ve que es bastante común en WOO COMMERCE. De hecho encontré mucha gente que hablaban de este problema y muchas soluciones, desde peticiones MySQL para actualizar la base de datos borrando variaciones, etc...<br />
<br />
Yo propongo una que le gustara a la mayoría de gente por su sencillez, sin arriesgarse a peticiones " a mano" a la base de datos ( aunque siempre se recomienda copia de seguridad, porque al fin y al cabo aunque sea por interfaz web el resultado es el mismo: una petición a la base de datos que comprobará que variaciones estan "huerfanas" (padre borrado) y las borrará, que es lo que pretendemos.<br />
<br />
Seccion Wocommerce > Estado de sistema<br />
<br />
En esta página arriba hay varios tabuladores, como se muestra en la captura:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-dbf44mBalzk/V-y1FL7PvcI/AAAAAAAADo4/2vgh4R4fyU09gqZM8XT1e8OacwIc9JqdQCLcB/s1600/Selecci%25C3%25B3n_00129.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://1.bp.blogspot.com/-dbf44mBalzk/V-y1FL7PvcI/AAAAAAAADo4/2vgh4R4fyU09gqZM8XT1e8OacwIc9JqdQCLcB/s1600/Selecci%25C3%25B3n_00129.png" /></a></div>
<br />
<br />
escogemos el de herramientas, y allí buscamos la opción:<br />
<br />
Delete Orphans (borrar huérfanos)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-DS203KFiu9I/V-y1YqhGMOI/AAAAAAAADo8/GAX8FzCxVcw_-ER1SbMpZrUS5phrCm5SgCLcB/s1600/Selecci%25C3%25B3n_00229.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="84" src="https://2.bp.blogspot.com/-DS203KFiu9I/V-y1YqhGMOI/AAAAAAAADo8/GAX8FzCxVcw_-ER1SbMpZrUS5phrCm5SgCLcB/s320/Selecci%25C3%25B3n_00229.png" width="320" /></a></div>
<br />Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-72404292161750475622016-09-02T06:48:00.001-07:002016-09-02T06:48:35.507-07:00Botón leer más con JqueryAquí pego un fragmento de un botón de leer más que hemos hecho:<br />
Explicar que el texto viene oculto desde el div con id #panel.<br />
<br />
<br />
<strong>Prodimex Global</strong> es una empresa zapatera ubicada en Logroño (España). Ha desarrollado la marca <strong>ORIOCX</strong>, dedicada a la fabricación de <em><b><u>calzado montaña</u></b></em> para actividades al aire libre.<br /><br />Los productos que presenta <strong>ORIOCX</strong> son el fruto de una larga experiencia en la fabricación de <strong><i><u>calzado</u></i></strong> de calidad que se remonta a 1948.<br /><br /><strong>ORIOCX</strong> fabrica un <strong><i><u>calzado montaña</u></i></strong> cómodo y práctico para disfrutar al máximo de la actividad junto a la naturaleza.<br /><br />Este <strong><i><u>zapato montaña</u></i></strong> está pensado para practicar trekking, travesía, trail running, backpacking, caza o para uso cotidiano.<br /><br />Podemos encontrar <strong><i><u>botas</u></i></strong>, <strong><i><u>zapatos</u></i></strong>, <strong><i><u>deportivos</u></i></strong> y <strong><i><u>sandalias</u></i></strong>.<br />
<br /><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script><br /><script> <br />$(document).ready(function(){<br /> $("#panel p").hide()<br /> $("button").click(function(){<br /> $("#panel p").slideToggle(1000, function(){<br /> });<br /> });<br />});<br /></script><br /><br /><style> <br />#panel, #flip {<br /> text-align: center;<br />padding: 5px;<br />}<br /><br />#panel {<br /> padding: 50px;<br /> display: none;<br />}<br /></style><br /><button>Leer más</button><br /><div id="panel"><br /><p><strong>ORIOCX</strong> trabaja en investigar y diseñar un <em><b><u>calzado montaña</u></b></em> tecnológicamente avanzado con materiales de primera calidad.<br /><br /><strong>X-System,</strong> es un sistema de protección y sujeción en la zona del maléolo que permite realizar travesías por todo tipo de terrenos, aportando a los<span class="apple-converted-space"> </span><strong><i><u>zapatos montaña</u></i></strong><span class="apple-converted-space"> </span>una sujeción extra.<br /><br /><strong>ULTRA LIGHT System, </strong>el uso de innovadores materiales ligeros permite crear unos <em><b><u>zapatos</u></b></em><em><u> </u></em><strong><i><u>montaña</u></i></strong> con los que se puede andar más cómodo y ligero.<br /><br /><strong>Ocx2-Dry, </strong>gracias a componentes probados y controlados, y a un concepto de ensamble específico, estos <em><b><u>zapatos montaña</u></b></em> son impermeables y transpirables. La membrana Ocx2-Dry asegura una impermeabilidad duradera al <strong><i><u>calzado montaña</u></i></strong>, permitiendo la evacuación de la humedad. El cuero es naturalmente transpirable y tratado hidrófobo. Membrana OCX2DRY formada por 70% poliéster y 30% poliéter.<br /><br />Forro <em><b>SYMPATEX,</b></em> se trata de una membrana ecológica de cinco micras de espesor laminada sobre base textil, que protege contra la humedad. Sus componentes hidrofílicos atraen el agua y absorben la humedad (transpiración), expulsándola desde el interior hacia el exterior, asegurando al <em><b><u>calzado montaña</u></b></em> un control óptimo del clima interno al tiempo que repele el agua.</p><br /></div><br /><br />Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-26275129209601736552016-08-31T00:31:00.000-07:002016-08-31T00:31:45.219-07:00Mostrar precio variación seleccionadaEste otro lo encontré en Stack Overflow, cuantas veces nos has salvavo el culo oh estimada Stack Overflow? demasiadas, y espero que siga siendo así por mucho más tiempo. La mejor página para pedir socorro cuando las cosas no salen como queremos....<br />
<br />
El precio lo muestra en el desplegable de las variaciones, mostrando el precio de cada una de ellas. <br />
<br />
// Mostrar precio de la variacion escogida en el desplegable de variaciones<br /><br />add_filter( 'woocommerce_variation_option_name', 'display_price_in_variation_option_name' );<br /><br />function display_price_in_variation_option_name( $term ) {<br /> global $wpdb, $product;<br /><br /> if ( empty( $term ) ) return $term;<br /> if ( empty( $product->id ) ) return $term;<br /><br /> $result = $wpdb->get_col( "SELECT slug FROM {$wpdb->prefix}terms WHERE name = '$term'" );<br /><br /> $term_slug = ( !empty( $result ) ) ? $result[0] : $term;<br /><br /> $query = "SELECT postmeta.post_id AS product_id<br /> FROM {$wpdb->prefix}postmeta AS postmeta<br /> LEFT JOIN {$wpdb->prefix}posts AS products ON ( products.ID = postmeta.post_id )<br /> WHERE postmeta.meta_key LIKE 'attribute_%'<br /> AND postmeta.meta_value = '$term_slug'<br /> AND products.post_parent = $product->id";<br /><br /> $variation_id = $wpdb->get_col( $query );<br /><br /> $parent = wp_get_post_parent_id( $variation_id[0] );<br /><br /> if ( $parent > 0 ) {<br /> $_product = new WC_Product_Variation( $variation_id[0] );<br /> return $term . ' (' . wp_kses( woocommerce_price( $_product->get_price() ), array() ) . ')';<br /> }<br /> return $term;<br /><br />}<br />
<br />
<br />Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-72774756942989274912016-08-31T00:28:00.002-07:002016-08-31T00:33:40.947-07:00Código para mostrar Desde X (menor precio de todas las variaciones de ese producto)<pre> </pre>
<pre>En <a href="http://woodemia.com/problema-de-rango-de-precios-en-woocommerce/" target="_blank">woodemia</a> he encontrado este código que te permite que en vez de mostrar el rango de precios</pre>
<pre>salga Desde x, el autor original de este código es el magnífico <a href="https://gerhardpotgieter.com/" target="_blank">gerhardpotgieter</a>: </pre>
<pre> </pre>
<pre>/**
* Use WC 2.0 variable price format, now include sale price strikeout
*
* @param string $price
* @param object $product
* @return string
*/
function wc_wc20_variation_price_format( $price, $product ) {
// Main Price
$prices = array( $product->get_variation_price( 'min', true ), $product->get_variation_price( 'max', true ) );
$price = $prices[0] !== $prices[1] ? sprintf( __( 'From: %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );
// Sale Price
$prices = array( $product->get_variation_regular_price( 'min', true ), $product->get_variation_regular_price( 'max', true ) );
sort( $prices );
$saleprice = $prices[0] !== $prices[1] ? sprintf( __( 'From: %1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] );
if ( $price !== $saleprice ) {
$price = '<del>' . $saleprice . '</del> <ins>' . $price . '</ins>';
}
return $price;
}
add_filter( 'woocommerce_variable_sale_price_html', 'wc_wc20_variation_price_format', 10, 2 );
add_filter( 'woocommerce_variable_price_html', 'wc_wc20_variation_price_format', 10, 2 );</pre>
Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-61612557823690214412016-08-25T03:07:00.000-07:002016-08-25T03:07:06.656-07:00Opción en el desplegable de ordenador por número de referencia (SKU)// Para ordenador por numero de referencia (Código de Beka Rice https://www.skyverge.com/ )<br /><br />/**<br /> * Adds the ability to sort products in the shop based on the SKU<br /> * Can be combined with tips here to display the SKU on the shop page: https://www.skyverge.com/blog/add-information-to-woocommerce-shop-page/<br /> */<br /><br />function sv_add_sku_sorting( $args ) {<br /><br /> $orderby_value = isset( $_GET['orderby'] ) ? wc_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );<br /><br /> if ( 'sku' == $orderby_value ) {<br /> $args['orderby'] = 'meta_value';<br /> $args['order'] = 'asc'; <br /> // ^ lists SKUs alphabetically 0-9, a-z; change to desc for reverse alphabetical<br /> $args['meta_key'] = '_sku';<br /> }<br /><br /> return $args;<br />}<br />add_filter( 'woocommerce_get_catalog_ordering_args', 'sv_add_sku_sorting' );<br /><br /><br />function sv_sku_sorting_orderby( $sortby ) {<br /> $sortby['sku'] = 'Sort by SKU';<br /> // Change text above as desired; this shows in the sorting dropdown<br /> return $sortby;<br />}<br />add_filter( 'woocommerce_catalog_orderby', 'sv_sku_sorting_orderby' );<br />add_filter( 'woocommerce_default_catalog_orderby_options', 'sv_sku_sorting_orderby' );Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-39516823534195342812016-08-09T00:19:00.002-07:002016-08-09T00:19:39.156-07:00Añadiendo el SKU a la página de detalles de productosPara que se visualice el SKU de un producto en su página de detalles del producto es tan simple como añadir el siguiente código en el archivo functions.php que se encuentra localizado en tu theme correspondiente <br />
<br />
<pre class="default prettyprint prettyprinted"><code><span class="pln">add_action</span><span class="pun">(</span><span class="pln"> </span><span class="str">'woocommerce_single_product_summary'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'dev_designs_show_sku'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> dev_designs_show_sku</span><span class="pun">(){</span><span class="pln">
</span><span class="kwd">global</span><span class="pln"> $product</span><span class="pun">;</span><span class="pln">
echo </span><span class="str">'SKU: '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $product</span><span class="pun">-></span><span class="pln">get_sku</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></code></pre>
<pre class="default prettyprint prettyprinted"><code><span class="pun"> </span></code></pre>
<pre class="default prettyprint prettyprinted"><code><span class="pun">Si quieres puedes personalizar el texto cambiando la línea de echo, yo lo he dejado de </span></code></pre>
<pre class="default prettyprint prettyprinted"><code><span class="pun">la siguiente manera :</span></code></pre>
<pre class="default prettyprint prettyprinted"><code><span class="pun">
</span></code></pre>
<pre class="default prettyprint prettyprinted">
<code><span class="pln">add_action</span><span class="pun">(</span><span class="pln"> </span><span class="str">'woocommerce_single_product_summary'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'dev_designs_show_sku'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> dev_designs_show_sku</span><span class="pun">(){</span><span class="pln">
</span><span class="kwd">global</span><span class="pln"> $product</span><span class="pun">;</span><span class="pln">
echo </span><span class="str">'Referencia producto: '</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $product</span><span class="pun">-></span><span class="pln">get_sku</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></code></pre>
<pre class="default prettyprint prettyprinted"><code><span class="pun"> </span></code></pre>
<pre class="default prettyprint prettyprinted"><code><span class="pun">Así en vez de SKU que sonará raro a los clientes se les mostrará Referencia de producto, algo </span></code></pre>
<pre class="default prettyprint prettyprinted"><code><span class="pun">mucho más intuitivo :) </span></code></pre>
Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-83225310028674149732016-08-09T00:08:00.001-07:002016-08-09T00:08:16.342-07:00Resolviendo problemas rarunos gracias a las herramientas de desarrollador de Mozilla FirefoxLlevaba un par de días que me ocurría algo extraño... en una de las página cuando entraba a una categoría no cargaba bien las imágenes, es más, cargaba la primera y tras dos segundos cargaba el resto.<br />
Tras muchas pruebas y muchos comederos de cabeza decidí hacer lo que tenía que haber hecho desde un principio: usar el inspector de Firefox.<br />
Tras echar un vistazo en la sección de red me dí cuenta de que cuando tenía que cargar un CSS no lo localizaba (error 404) así que mira cual era y lo subí de nuevo. Error solucionado y todo funcionando correctamente.<br />
La pregunta que me hago ahora es... ¿y cómo es que había desaparecido? ¿actualización mal hecha? ¿Polstergeist? Misterios de la ciencia y el vudú... Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com1tag:blogger.com,1999:blog-3388124125256092930.post-9669959151572842842016-07-19T08:48:00.001-07:002016-07-19T08:48:46.474-07:00Hostings, transferencias de dominio, y DNS locas xDDDEsta tarde nos ha pasado algo bastante curioso pero simple a la vez, tras pedir una transferencia de dominio de un proveedor a otro, nos aparecería la página de redirección de cuando estaba en el otro servidor... pero no aparecía en ninguna parte en el nuevo servidor.<br />
Tras un rato trasteando y buscando pasamos a la acción.<br />
De la manera más simple, empezamos comprobando mediante un ping al dominio si este apuntaba al antiguo o al nuevo servidor, la respuesta fue al nuevo.<br />
Tras esto decidimos probar a borrar los datos de navegación del navegador y ahi estaba el problema, el muy simpatico nos cargaba la página de la cache en vez de descargar la nueva dirección.<br />
<br />Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-6280195562342020802016-06-09T22:11:00.000-07:002016-06-09T22:11:05.696-07:00La recta final del cursoYa estamos en la recta final del curso que se me ha hecho muy cuesta arriba pues es muy difícil compaginar bien tantas cosas pero también así se valoran más las cosas.Tengo ganas de ir un día al parque con mi hija sin tener que estar pendiente del reloj, sin agobios, y tengo ganas de poder profundizar más, eso sí, a mi paso, en ciertas materias.Para este verano tres cosas en mente para profundizar: PHP, XML y SQL.Nos leemosBruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-90959495186283114762016-06-07T08:19:00.001-07:002016-06-07T14:15:25.974-07:00WordPress everywhere! parte 3 Este código que pongo a continuación os servirá para cumplir con la normativa española en la cual (si no me equivoco, no soy administrativo...) toda factura debe de ir acompañada del NIF/CIF correspondiente del cliente.Sin más dilación os pego el código el cual pertenece a la siguiente página, la cual os recomiendo encarecidamente debido al alto nivel de calidad de los posts <a href="http://woodemia.com/aun-sabes-generar-facturas-con-woocommerce/" target="_blank">woodemia</a>.<br />
<br />
<span class="matrix">
// Incluir NIF en la factura<br />
add_filter( 'wpo_wcpdf_billing_address', 'incluir_nif_en_factura' );<br />
function incluir_nif_en_factura( $address ){<br />
global $wpo_wcpdf;<br />
echo $address . '<p>';<br />
$wpo_wcpdf->custom_field( 'NIF', 'NIF: ' );<br />
echo '</p>';<br />
}<br />
/**<br />
* Añade el campo NIF a la página de checkout de WooCommerce<br />
*/<br />
add_action( 'woocommerce_after_order_notes', 'agrega_mi_campo_personalizado' );<br />
<br />
function agrega_mi_campo_personalizado( $checkout ) {<br />
<br />
echo '<div id="additional_checkout_field"><h2>' . __('Información adicional') . '</h2>';<br />
<br />
woocommerce_form_field( 'nif', array(<br />
'type' => 'text',<br />
'class' => array('my-field-class form-row-wide'),<br />
'label' => __('NIF'),<br />
'placeholder' => __('Ej: 99999999D'),<br />
), $checkout->get_value( 'nif' ));<br />
<br />
echo '</div>';<br />
}<br />
<br />
/**<br />
* Actualiza la información del pedido con el nuevo campo<br />
*/<br />
add_action( 'woocommerce_checkout_update_order_meta', 'actualizar_info_pedido_con_nuevo_campo' );<br />
<br />
function actualizar_info_pedido_con_nuevo_campo( $order_id ) {<br />
if ( ! empty( $_POST['nif'] ) ) {<br />
update_post_meta( $order_id, 'NIF', sanitize_text_field( $_POST['nif'] ) );<br />
}<br />
}<br />
<br />
<br />
/**<br />
* Muestra el valor del nuevo campo NIF en la página de edición del pedido<br />
*/<br />
add_action( 'woocommerce_admin_order_data_after_billing_address', 'mostrar_campo_personalizado_en_admin_pedido', 10, 1 );<br />
<br />
function mostrar_campo_personalizado_en_admin_pedido($order){<br />
echo '<p><strong>'.__('NIF').':</strong> ' . get_post_meta( $order->id, 'NIF', true ) . '</p>';<br />
}<br />
<br />
</span>Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-54235914852785919592016-06-07T07:47:00.000-07:002016-06-07T14:14:51.847-07:00WordPress everywhere! parte 2Si lo que te interesa es que te muestre el número SKU aquí tienes el código:<br />
<br />
// añadir numero SKU debajo del título del producto<br />
<span class="matrix"><br />
add_action( 'woocommerce_after_shop_loop_item_title', 'woo_add_SKU_title' );<br />
<br />
function woo_add_SKU_title() {<br />
global $product;<br />
echo '<div class="sku">REF: ' . $product->sku . '</div>';<br />
}<br />
<br />
</span>Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-31708993862055009922016-06-07T04:26:00.000-07:002016-06-07T14:13:58.485-07:00WordPress everywhere!Buenos días a todos, estos días me esta tocando pelearme con el fascinante mundo de WordPress, una maravilla que te permite hacer cosas espectaculares en nada y menos y que si encima sabes programar ya ni te cuento...<br />
<br />
Para aquellos que van con el ansia encima, si necesitas por un casual que en la tienda los productos muestren la descripción corta (esto me ha pasado en más de una plantilla que viene desactivado por defecto, y yo me pregunto...si cuando entras en un producto te muestra la descripción larga, para que demonios no activan la corta en la vista de categoría por defecto?), este código en el <b>functions.php del tema que uses te salvará el día:</b><br />
<br />
<code><span class="matrix">add_action( 'woocommerce_after_shop_loop_item_title', 'my_add_short_description', 9 );
function my_add_short_description() {
echo '<span class="title-description">' . the_excerpt() . '</span><br />';
}</span></code>
<br />
<br />Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-21671867625660459232015-10-14T07:42:00.000-07:002015-10-14T07:42:23.835-07:00RenovaciónAunque tengo muy poco tiempo libre creo que me voy a decantar por una renovación del blog, tanto física como "espiritual".<br />
Los post que escribo son de escaso interés y los redacto rápido y mal, así que vamos a empezar a plantearnos las cosas de otra manera y a profundizar más en todo lo que hable por aquí.<br />
Nos leemos, y esta vez espero que en muy breveBruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-953819163884648152015-10-07T08:16:00.001-07:002015-10-07T08:16:25.075-07:00Nuevo diseño o nuevo blog?Estoy dandole vueltas a esto y la verdad es que no me convence nada como estoy llevando el blog, escribo poco y mal, tan pronto os cuento cosas de mi vida que ni van ni le vienen a nadie como que hago mini-tutoriales o cosillas así...<br />
<br />
Creo que cuando algo no te emociona algo pues, lo mejor es hacer borrón y cuenta nueva y hacer algo con más sustancia, algo que te emocione de verdad, y así es como me siento con esto ahora mismo...<br />
<br />
Así que le daré vueltas y decidiré que hago...si renovamos diseño y planificamos contenidos o empezamos de cero.<br />
<br />
Saldremos de dudas en breveBruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-78158906188339830642015-10-05T08:15:00.001-07:002015-10-05T08:15:12.090-07:00SEO,PYTHON y bases de datosÚltimamente ando algo metido en el mundo del SEO, el cual por un lado me aburre extremadamente (buscar las combinaciones de keywords,etc...) y por otro lado me apasiona y también he decidido que voy a seguir la senda del Python, ya que veo que es un lenguaje muy multiproposito y que se ha portado muy bien conmigo.<br />
De hecho de aquí nada tengo que volver a hacer un programa que me ayude a automatizar ciertas tareas que se me antojan tediosas y que chico, para esto se inventó la programación...<br />
Este año se me está haciendo bastante tedioso pues es más de lo mismo de lo que ya hemos dado y me da a mí que terminará el año y apenas habremos mirado nada nuevo.<br />
Lo único nuevo que estamos dando es Gestores de Bases de datos y la verdad es que voy bastante perdido, pero espero que nada que no se supere dedicándole horas...<br />
En fín....tiempo al tiempo y paciencia, mientras tanto, podría haberme hecho famoso como ELRubius o alguno de estos y vivir de maravilla soltando paridas...<br />
<br />Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-77753073154732952232015-09-25T09:31:00.002-07:002015-09-25T09:31:30.958-07:00Vuelta a la batalla! (empezamos superior)Este año empezamos el superior, y retomo el blog aunque tengo muy poco tiempo libre debido a todos los proyectos que he empezado por mi cuenta para seguir formando a la espera de conseguir ver de nuevo, algún dulce día, un contrato de trabajo, que esto ya es más legendario que el Santo Grial.<br />
La leyenda dice que unos pocos elegidos han visto uno en los últimos años...yo no lo tengo tan claro jajajaja<br />
Bromas aparte, espero poder cumplir algo más con el blog e ir posteando aunque sean tonterias, pero poco a poco ir haciendo cosas.<br />
Nos leemos!Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-38927390804500376712015-07-04T07:57:00.002-07:002015-07-04T07:57:55.139-07:00Soy certificado Linux Essentials !Pues eso, que aunque el examen fue bastante más duro de lo que me esperaba (estos del LPI se lo toman muy en serio eso de que tengas los conocimientos que certifican...) e incluso llegué a pensar que era muy posible que lo iba a suspender, pero no!, aprobado y además con bastante buena nota 605 de 800 o un 77,50% sobre 100.<br />
Así que comparto la alegría con todos y a por el siguiente objetivo...<br />
(el 101 y el 102 de momento se quedan en stand-by o pausa, el siguiente objetivo es hacer un par de páginas con PHP, MySQL, Javascript y usando Bootstrap de Framework que me ha gustado bastante :) )<br />
Nos leemos!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-sbrP3zd-Keo/VZf0VcpJWtI/AAAAAAAABo0/eQ53PoL7Djs/s1600/instant%25C3%25A1nea1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="http://4.bp.blogspot.com/-sbrP3zd-Keo/VZf0VcpJWtI/AAAAAAAABo0/eQ53PoL7Djs/s640/instant%25C3%25A1nea1.png" width="640" /></a></div>
<br />Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-83600968173839874632015-06-22T12:17:00.003-07:002015-06-22T12:17:46.177-07:00Scripting Bash parte ICon motivo de que estoy estudiando para sacarme el primer certificado de la LPI ( Linux Professional Institute), el Essentials, he decidido tras leer el capítulo 12 hacer un pequeño y simple ejercicio.En este script muy simple y sin filigranas, pero que sirve para hacerse una pequeña idea de que, con un poco de imaginación y ganas el Bash (interprete de comandos de Linux) nos ofrece una potente herramienta con la cual vamos a poder, entre otras cosas, automatizar tareas.<br />
Este script simplemente nos pide un número de usuarios y un nombre de usuario para ellos, por ejemplo, le decimos que queremos tres usuarios de nombre alumno, pues nos creará el usuario: alumno1, alumno2 y alumno3.<br />
Desde luego este script se puede mejorar y mucho, por ejemplo automatizando la generación de contraseñas, añadiendo más opciones como la creación de un directorio que comparta con el grupo, un enlace suave, etc...<br />
<br />
<br />#!/bin/bash<br /><br />echo -n "Cuantos usuarios deseas crear? "<br />read numusers<br />echo -n "que nombre estandar les quieres asignar? "<br />read nombre<br />for (( c=1; c<=$numusers; c++ ))<br />do<br /> nombrefinal=$nombre$c<br /> useradd -m $nombrefinal<br /> passwd $nombrefinal<br />done<br />echo -n "finalizado el loop"<br />
<br />
En la primera línea iniciamos el interprete.<br />
Con echo mostramos por pantalla lo que queremos que nos proporcione el usuario, lo cual lo recogemos con read y lo guardamos en la variable de nombre numusers.<br />
Más de lo mismo con el nombre y despues el bucle for, escrito al más puro estilo C, aunque con ligeras diferencias: aquí no va entre {} y tenemos que usar do y done a tal efecto. Dentro del bucle veis una variable que no es más que la concatenación de la variable nombre con el número de iteración dentro del bucle para ir generando los usuarios:<br />
por ejemplo en la primera iteración nombrefinal será igual a alumno1, en la segunda alumno2, etc...<br />
useradd y passwd son los comandos de Linux, el primero generará el usuario y el segundo le asignará una contraseña que tendremos que introducir.<br />
Después simplemente finalizo avisando de que se acabó el bucle.<br />
<br />Un simple ejercicio que se puede ampliar fácilmente y que cumple con el objetivo, que es simplemente hacernos una idea de la potencia del interprete de comandos y de lo bonito que es programar :-) Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-3002813428585631382015-06-18T10:18:00.004-07:002015-06-18T10:18:52.771-07:00Camino del LPI Linux EssentialsYa hemos pasado el estrés de las pruebas de acceso al superior con resultado cuanto menos curioso, y ahora para no parar seguimos haciendo camino con el certificado del LPI (Linux Professional Institute), empezaremos por el Essentials, el más básico de todos, que certificada que sabes los conocimientos básicos para trabajar con un sistema Linux.<br />
De hecho esta semana va a ser una semanita cargada de Ubuntu, OpenSuse y algo de Arch Linux que le tengo muchas ganas...<br />
También estamos repasando ciertos conceptos de programación, he vuelto a los entrenos y seguimos luchando por ese objetivo que me pondría las cosas mucho más fáciles y que me daría una buena estabilidad económica.<br />
La cuestión es que organizandome un poco y con algo de sacrificio todo se puede...aunque no sea fácil.<br />
Nos vemos! Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0tag:blogger.com,1999:blog-3388124125256092930.post-70442127126500417192015-05-22T09:45:00.000-07:002015-05-22T09:45:02.458-07:00La importancia de un buen framework y de estar al díaPues como bien dice el título, es muy importante estar al día y conocer bien las herramientas.<br />
Es muy loable haber hecho páginas web responsive desde 0 pero nada como usar un buen framework para ello...<br />
Se aprende igualmente mucho y además te ahorrará un montón de tiempo y siempre ayuda a que quede el resultado algo más profesional.<br />
<br />
Un buen consejo:<br />
Pierde tiempo en conocer herramientas buenas, a medio y largo plazo lo amortizarás.<br />
<br />
Al igual que reusar código es una muy buena idea, pues te ahorrará tiempo y en teoría sabes que ese código funciona...<br />
<br />
...aunque te puede pasar como me pasó a mi el otro día, que encontré un formulario de PHP pero que luego no funcionaba, me imagino que el autor al publicarlo le pudieron las ansias y no lo probó.<br />
El caso es que el error lo detecté y lo corregí... es fantástico saber programar, y no tienes porque ser un super experto, empieza poco a poco y cuando te quieras dar cuenta ya tendrás un buen nivel.<br />
<br />
En esto, cómo en muchas cosas de la vida, es una cuestión de tiempo, un maratón o un entreno de pesas... no puedes pretender de golpe ponerte el chándal y hacer 50km de una tacada o levantar 70 o 100 kg en un press de banca o de piernas... pero con el tiempo entrenando todo se consigue ;) doy fe!Bruno Celaya Monterohttp://www.blogger.com/profile/17641890548830732151noreply@blogger.com0