{"id":233576,"date":"2023-02-18T17:20:00","date_gmt":"2023-02-18T14:20:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233576"},"modified":"2022-11-11T00:26:08","modified_gmt":"2022-11-10T21:26:08","slug":"guia-sobre-como-agregar-tarifas-personalizadas-a-woocommerce-checkout-por-codigo","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/guia-sobre-como-agregar-tarifas-personalizadas-a-woocommerce-checkout-por-codigo\/","title":{"rendered":"Gu\u00eda sobre c\u00f3mo agregar tarifas personalizadas a WooCommerce Checkout por c\u00f3digo"},"content":{"rendered":"\n<p>Hay algunos casos en los que es posible que deba agregar una tarifa a los totales del carrito. A veces, solo si se cumple una determinada condici\u00f3n, por ejemplo, seg\u00fan los totales del carrito o la ubicaci\u00f3n de env\u00edo. Con WooCommerce, agregar una tarifa es bastante f\u00e1cil, mucho m\u00e1s f\u00e1cil que agregar un descuento, de hecho. En esta publicaci\u00f3n, aprenderemos c\u00f3mo agregar una tarifa personalizada a WooCommerce.<\/p>\n<p>WooCommerce tiene una funci\u00f3n integrada en el objeto del carrito para agregar tarifas. Todo lo que necesita es conectarse a la acci\u00f3n correcta y, con el objeto de carrito provisto, llame a una funci\u00f3n para agregar una tarifa. WooCommerce mostrar\u00e1 autom\u00e1ticamente las tarifas en el carrito y los totales de pago. T\u00fa decides la etiqueta y el importe de la tarifa.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152845-61e4fc291b3a1.png\" data-rel=\"lightbox\" ><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-152845-61e4fc291b3a1.png\" alt=\"Gu\u00eda sobre c\u00f3mo agregar tarifas personalizadas a WooCommerce Checkout por c\u00f3digo\" ><\/a><\/p>\n<p>Es importante tener en cuenta que el monto de la tarifa <strong>no puede ser negativo<\/strong>, lo que le otorga al cliente un descuento. Este &quot;truco&quot; sol\u00eda funcionar antes en versiones anteriores de WooCommerce, pero ya no.<\/p>\n<p>\u00a1Entremos en los detalles del c\u00f3digo! El \u00fanico gancho por el que debe preocuparse es <code>woocommerce_cart_calculate_fees<\/code>. Dentro de este enlace, puede obtener el objeto del carrito llamando a <code>WC()-&gt;cart<\/code>. Con ese objeto puede llamar <code>add_fee()<\/code>que acepta cuatro par\u00e1metros (probablemente solo necesite los dos primeros); <code>add_fee($fee_name, $amount_in_float, $taxable_boolean, $tax_class_string)<\/code>. Los dos primeros se explican por s\u00ed mismos. El tercer par\u00e1metro es un valor booleano que decide si la tarifa est\u00e1 sujeta a impuestos o no. Y el cuarto es para proporcionar una clase de impuestos para la tarifa (si el tercer par\u00e1metro es verdadero). Pero se puede dejar en blanco para la clase de impuestos est\u00e1ndar.<\/p>\n<h2>Agregar una tarifa fija<\/h2>\n<p>Agregar una tarifa personalizada se realiza en su forma m\u00e1s simple de esta manera:<\/p>\n<pre><code>add_action('woocommerce_cart_calculate_fees', function() {\n    if (is_admin() &amp;&amp; !defined('DOING_AJAX')) {\n        return;\n    }\n    WC()-&gt;cart-&gt;add_fee(__('A small fee', 'txtdomain'), 5);\n});<\/code><\/pre>\n<p>El primer paso es evitar agregar una tarifa si estamos en administraci\u00f3n o si Ajax est\u00e1 en progreso. A continuaci\u00f3n llamamos <code>add_fee()<\/code>al objeto carrito. Esto agregar\u00e1 una tarifa denominada &quot;Una peque\u00f1a tarifa&quot; con el valor de 5. El valor ser\u00e1 en cualquier moneda que tenga en su tienda. Si la moneda de la tienda se establece en d\u00f3lares, se convierte en $5. Ajusta el nombre y la cantidad a tus necesidades.<\/p>\n<h2>Agregar una tarifa como un porcentaje de los totales del carrito<\/h2>\n<p>Si desea que el monto de la tarifa sea un porcentaje de los totales del carrito, solo necesita calcularlo de manera diferente. Recuerde que siempre tenemos acceso al objeto del carrito llamando <code>WC()-&gt;cart<\/code>y desde ah\u00ed podemos obtener los totales.<\/p>\n<pre><code>add_action('woocommerce_cart_calculate_fees', function() {\n    if (is_admin() &amp;&amp; !defined('DOING_AJAX')) {\n        return;\n    }\n    $percentage = 0.05;  \/\/ Percentage (5%) in float\n    $percentage_fee = (WC()-&gt;cart-&gt;get_cart_contents_total() + WC()-&gt;cart-&gt;get_shipping_total()) * $percentage;\n\u00a0\n    WC()-&gt;cart-&gt;add_fee(__('A small fee', 'txtdomain'), $percentage_fee);\n});<\/code><\/pre>\n<p>El c\u00f3digo anterior agregar\u00e1 una tarifa que asciende al 5% del total del carrito, que es el total de art\u00edculos del carrito (<code>get_cart_contents_total()<\/code>) m\u00e1s el costo de env\u00edo del carrito (<code>get_shipping_total()<\/code>). Ajuste la tasa y qu\u00e9 totales incluir o excluir en lo que necesita.<\/p>\n<p>As\u00ed que esto est\u00e1 muy bien, pero en algunos casos es posible que deseemos personalizar cu\u00e1ndo agregar una tarifa. Tal vez desee agregar una tarifa solo para un determinado m\u00e9todo de env\u00edo, m\u00e9todo de pago o seg\u00fan el total del carrito. El proceso es el mismo, solo agregamos la tarifa solo si se cumplen nuestras condiciones.<\/p>\n<h2>Agregar una tarifa dependiendo de los totales del carrito<\/h2>\n<p>Digamos que solo desea agregar una tarifa si los totales del carrito est\u00e1n por debajo de cierta cantidad. Suponga que desea agregar una tarifa por manejar cantidades peque\u00f1as. Podr\u00edas hacerlo as\u00ed:<\/p>\n<pre><code>add_action('woocommerce_cart_calculate_fees', function() {\n    if (is_admin() &amp;&amp; !defined('DOING_AJAX')) {\n        return;\n    }\n\u00a0\n    $cart_total = WC()-&gt;cart-&gt;get_cart_contents_total();  \/\/ This is excluding shipping\n    if ($cart_total &lt; 500) {\n        WC()-&gt;cart-&gt;add_fee(__('Fee for small transactions', 'txtdomain'), 50);\n    }\n});<\/code><\/pre>\n<p>\u00daselo <code>WC()-&gt;cart-&gt;get_cart_contents_total()<\/code>para obtener el n\u00famero flotante del total del carrito, sin incluir el env\u00edo. (Si tambi\u00e9n desea incluir el env\u00edo, mire arriba al agregar la tarifa porcentual para obtener los totales de env\u00edo). Luego haz tus comparaciones.<\/p>\n<p>Tambi\u00e9n puede darle la vuelta y decidir agregar una tarifa si el carrito super\u00f3 cierto l\u00edmite.<\/p>\n<h2>Agregar una tarifa dependiendo de la ubicaci\u00f3n de env\u00edo<\/h2>\n<p>Tambi\u00e9n puede agregar una tarifa seg\u00fan la ubicaci\u00f3n de env\u00edo, por ejemplo, por pa\u00eds. De manera similar a obtener el objeto del carrito, podemos usar <code>WC()-&gt;customer<\/code>para el objeto del cliente. Tenga en cuenta que cuando el cliente no ha iniciado sesi\u00f3n y a\u00fan no lleg\u00f3 a la caja y complet\u00f3 su direcci\u00f3n, los valores del objeto del cliente estar\u00e1n vac\u00edos o los valores predeterminados establecidos en su tienda.<\/p>\n<p>Necesitar\u00e1 saber el c\u00f3digo de pa\u00eds: aqu\u00ed hay una <a href=\"http:\/\/creatingawebstore.com\/woocommerce-country-codes-and-state-codes-list.html\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">buena referencia de c\u00f3digo de pa\u00eds<\/a>. Este es un ejemplo de c\u00f3mo agregar una tarifa si el cliente es de Noruega.<\/p>\n<pre><code>add_action('woocommerce_cart_calculate_fees', function() {\n    if (is_admin() &amp;&amp; !defined('DOING_AJAX')) {\n        return;\n    }\n\u00a0\n    $shipping_country = WC()-&gt;customer-&gt;get_shipping_country(); \n    if ($shipping_country == 'NO') {\n        WC()-&gt;cart-&gt;add_fee(__('Fee for shipping to Norway', 'txtdomain'), 50);\n    }\n});<\/code><\/pre>\n<h2>Agregar una tarifa seg\u00fan el m\u00e9todo de env\u00edo elegido<\/h2>\n<p>Obtener el m\u00e9todo de env\u00edo es un poco m\u00e1s complicado ya que depende de la sesi\u00f3n del usuario y no viene en un &quot;formato agradable y comprensible&quot;. Puede obtener el m\u00e9todo de env\u00edo elegido actualmente con <code>WC()-&gt;session-&gt;get('chosen_shipping_methods')<\/code>. Tenga en cuenta que dice &quot;m\u00e9todos&quot; y no &quot;m\u00e9todo&quot;, por lo que devuelve una matriz. Normalmente, la matriz contiene un elemento, donde cada elemento consta de cadenas de ID de env\u00edo, dos puntos y una ID despu\u00e9s. Recomiendo usar m\u00e9todos de cadena PHP para verificar si la cadena contiene la ID, por ejemplo <code>strpos()<\/code>, y no si es igual.<\/p>\n<pre><code>add_action('woocommerce_cart_calculate_fees', function() {\n    if (is_admin() &amp;&amp; !defined('DOING_AJAX')) {\n        return;\n    }\n\u00a0\n    $chosen_shipping_method = WC()-&gt;session-&gt;get('chosen_shipping_methods');\n\u00a0\n    if (strpos($chosen_shipping_method[0], 'flat_rate') !== false) {\n        WC()-&gt;cart-&gt;add_fee(__('Fee for flat rate shipping', 'txtdomain'), 50);\n    }\n});<\/code><\/pre>\n<h2>Agregar una tarifa seg\u00fan el m\u00e9todo de pago elegido<\/h2>\n<p>Si desea agregar una tarifa seg\u00fan la pasarela de pago elegida, puede obtener la pasarela de pago elegida actualmente <code>WC()-&gt;session-&gt;get('chosen_payment_method')<\/code>y hacer una comparaci\u00f3n con su nombre (por ejemplo, para Paypal devolver\u00eda <code>'paypal'<\/code>). Sin embargo, puede notar que cuando el cliente cambia entre las pasarelas de pago en el proceso de pago, la tarifa no se agrega ni elimina din\u00e1micamente. Por lo tanto, deber\u00e1 agregar Javascript adicional para asegurarse de que WooCommerce actualice el carrito para que su tarifa funcione de manera constante.<\/p>\n<pre><code>add_action('woocommerce_cart_calculate_fees', function() {\n    if (is_admin() &amp;&amp; !defined('DOING_AJAX')) {\n        return;\n    }\n\u00a0\n    $chosen_payment_method = WC()-&gt;session-&gt;get('chosen_payment_method');\n    if ($chosen_payment_method == 'paypal') {\n        WC()-&gt;cart-&gt;add_fee(__('Paypal Fee', 'txtdomain'), 50);\n    }\n});\n\u00a0\nadd_action('woocommerce_review_order_before_payment', function() {\n    ?&gt;&lt;script type=\"text\/javascript\"&gt;\n        (function($){\n            $('form.checkout').on('change', 'input[name^=\"payment_method\"]', function() {\n                $('body').trigger('update_checkout');\n            });\n        })(jQuery);\n    &lt;\/script&gt;&lt;?php\n});<\/code><\/pre>\n<p>Para agregar el Javascript, nos enganchamos al <code>woocommerce_review_order_before_payment<\/code>que ocurre justo antes del cuadro de pago en el proceso de pago y generamos el script en l\u00ednea. Todo lo que hace el c\u00f3digo es activar el gancho de WooCommerce <code>update_checkout<\/code>cada vez que se cambia la elecci\u00f3n del m\u00e9todo de pago. Esto garantiza que se ejecuten todos los m\u00e9todos y ganchos de PHP necesarios (incluido el gancho de pago) cada vez que se actualiza el carrito.<\/p>\n<h2>Agregar una tarifa dependiendo de qu\u00e9 productos est\u00e1n en el carrito<\/h2>\n<p>Lo mencion\u00e9 antes, pero lo mencionar\u00e9 nuevamente: tiene acceso total al objeto del carrito con <code>WC()-&gt;cart<\/code>, por lo que puede buscar en el contenido del carrito un ID de producto espec\u00edfico y agregar una tarifa si existe en el carrito.<\/p>\n<p>El uso <code>WC()-&gt;cart-&gt;get_cart_contents()<\/code>devuelve una matriz de todos los productos en el carrito. Puede recorrer esto con un <code>foreach<\/code>ciclo simple y verificar cada producto en la condici\u00f3n deseada, o si simplemente desea verificar las identificaciones, puede extraer todas las identificaciones de productos en una l\u00ednea de esta manera:<\/p>\n<pre><code>$products_in_cart = WC()-&gt;cart-&gt;get_cart_contents();\n$product_ids_in_cart = array_column(array_values($products_in_cart), 'product_id');\n\/\/ Now you can use e.g. in_array() to check for certain product IDs.<\/code><\/pre>\n<p>El siguiente ejemplo muestra c\u00f3mo puede agregar una tarifa dependiendo de que el carrito contenga un producto de una identificaci\u00f3n determinada:<\/p>\n<pre><code>add_action('woocommerce_cart_calculate_fees', function() {\n    if (is_admin() &amp;&amp; !defined('DOING_AJAX')) {\n        return;\n    }\n\u00a0\n    $really_expensive_product_id = 12;  \/\/ product ID that triggers a fee\n\u00a0\n    $products_in_cart = WC()-&gt;cart-&gt;get_cart_contents();\n    $product_ids_in_cart = array_column(array_values($products_in_cart), 'product_id');\n    if (in_array($really_expensive_product_id, $product_ids_in_cart)) {\n        WC()-&gt;cart-&gt;add_fee(__('Fee for really expensive product', 'txtdomain'), 50);\n    }\n});<\/code><\/pre>\n<p>Tambi\u00e9n puede usar operaciones similares para extraer cantidades si necesita agregar una tarifa cuando un cliente agrega una cantidad realmente grande de algo.<\/p>\n<h2>En conclusi\u00f3n<\/h2>\n<p>Esta publicaci\u00f3n le ha mostrado c\u00f3mo agregar una tarifa personalizada y, a trav\u00e9s de cinco ejemplos, c\u00f3mo agregar una tarifa seg\u00fan ciertas condiciones. Estas condiciones fueron todo lo que encontr\u00e9 y pude pensar, y al menos deber\u00edan dar pistas sobre c\u00f3mo obtener informaci\u00f3n para personalizar a\u00fan m\u00e1s sus condiciones. \u00a1Av\u00edseme si funcion\u00f3 para usted o si ha encontrado otra condici\u00f3n en la que no pens\u00e9!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esta gu\u00eda le muestra c\u00f3mo agregar una tarifa personalizada a los totales del carrito de WooCommerce y tambi\u00e9n agregarla seg\u00fan la ubicaci\u00f3n de env\u00edo o el m\u00e9todo de pago.<\/p>\n","protected":false},"author":1,"featured_media":224911,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,892,810,716,716,1110,810,840,840,851,851,861,861],"tags":[1172],"class_list":["post-233576","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-complementos","category-desarrollador","category-n-a","category-tutoriales","category-woocommerce-2","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233576","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=233576"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/233576\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/224911"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=233576"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=233576"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=233576"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}