| 开发者 | puntoexeconsultores |
|---|---|
| 更新时间 | 2026年6月4日 12:55 |
| PHP版本: | 7.4 及以上 |
| WordPress版本: | 7.0 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
required => true) y el plugin agregaba otro mediante JavaScript. Ahora ambos campos están definidos con required => false para que la obligatoriedad y el asterisco se gestionen solo desde el JavaScript del plugin (igual que ya se hacía con RUT y Razón Social), evitando la duplicación.echo PHP), en lugar de usar wp_add_inline_script(). Esto resuelve un bug detectado en algunos sitios donde el script inline simplemente no se cargaba aunque los campos del plugin sí aparecían — el listener change del select "¿Factura con RUT?" no se disparaba y los campos RUT/Razón Social nunca se mostraban. La causa raíz era que algunos plugins de optimización/caché de WordPress (o ciertos temas) descartaban el handle vacío pfwc-checkout-inline antes de que se inyectara el contenido inline asociado. Ahora el script va directamente en el HTML, sin depender del lifecycle de enqueue/print de WordPress.[woocommerce_checkout] o el bloque "Classic Checkout" de WooCommerce, aunque no estén configuradas como la página oficial de checkout en WooCommerce → Ajustes → Avanzado → Páginas de pago. Útil para páginas de prueba o casos donde el admin usa el checkout en múltiples páginas.PFWC_VERSION en lugar de un número hardcoded 1.0.6. Esto fuerza a los navegadores a actualizar la caché de los assets cuando el usuario actualiza el plugin, evitando situaciones donde el JS quedaba con código viejo aún después de actualizar.pFacturas.php que generaba un Fatal Error (HTTP 500) al actualizar el plugin desde el admin de WordPress. La función pf_log() fue renombrada a pfwc_log() hace varias versiones, pero quedó una llamada a pf_log() huérfana en el callback del hook upgrader_process_complete. Resultado: cada vez que un admin actualizaba el plugin desde "Plugins → Hay actualizaciones disponibles", veía un error visual ("Actualización fallida") aunque los archivos del plugin sí se reemplazaban correctamente (el fatal ocurría DESPUÉS de copiar los archivos). Al reintentar la actualización, WordPress detectaba que ya tenía la versión nueva y no mostraba el error. Bug presente desde 1.x. Ahora la llamada se corrigió a pfwc_log() y las actualizaciones futuras (de 1.2.5.3 en adelante) serán limpias sin errores visibles.pfwc_validar_rut() ya existente en helpers.php (factor cíclico 2→9 idéntico al de Checkout Block).pfwc_validar_rut y pfwc_validar_ci).PFWC_Checkout::valid_rut() y PFWC_Checkout::valid_ci() que duplicaban (con bugs en el caso de RUT) las funciones correctas pfwc_validar_rut() y pfwc_validar_ci() ya existentes en helpers.php. Ahora hay una sola fuente de verdad para la validación de DV en todo el plugin.::before y ::after en cada <p class="form-row"> como clearfix legacy (de la era pre-flexbox cuando el layout usaba floats). Al haber convertido el <p> de "¿Factura con RUT?" a display: flex para mostrar el label y el select inline, esos pseudo-elementos pasaron a ser flex items y empujaban el contenido hacia el centro. Ahora se desactivan con content: none específicamente para .pf-rut-inline. No afecta al Checkout Block (que no usa <p class="form-row">) ni al resto de los campos del Checkout Clásico.1,234.56 para USD o formato europeo/uruguayo 1.234,56 para UYU/EUR). Antes asumía siempre formato europeo, por lo que un monto en USD como "U$S 90.00" se parseaba erróneamente como 9000 (al borrar el punto pensando que era separador de miles). Resultado del bug: en tiendas con moneda USD, los campos de Persona Física (Tipo de Documento y Documento) se mostraban en el checkout aunque el monto estuviera muy por debajo del umbral de identificación. Aplicado en los 3 lugares con el mismo problema: parseo principal del Checkout Clásico, fallback del Checkout Clásico, y fallback del Checkout Blocks.input además del change existente para detectar cambios en el select "¿Factura con RUT?". Necesario en sitios que tienen plugins de Checkout adicionales como Direct Checkout for WooCommerce, que reemplazan el <select> nativo por widgets custom que no siempre disparan eventos change estándar del DOM.change ni el input se disparan correctamente debido a interferencia de otros plugins. Si el valor cambia respecto al último observado, se dispara el toggle de campos. Bajo overhead (un querySelector + comparación de string por intervalo).value de los <option> con el texto visible ("Sí"/"No") en vez de los valores "1"/"0" que el plugin emite. Antes la comparación era estricta contra "1" tanto en JavaScript como en PHP, por lo que en sitios con TranslatePress, Google Tag Manager mal configurado, Direct Checkout u otros plugins que manipulan los selects, el plugin nunca mostraba los campos de RUT y Razón Social aunque el cliente eligiera "Sí". Ahora se acepta "1", "si", "sí", "yes" o "true" en el value O en el texto de la option seleccionada, y al guardar el meta se normaliza siempre a "1"/"0" para que el resto del backend (mapper, sincronización con billing, panel admin) siga funcionando sin cambios.options, y WooCommerce también inserta automáticamente su propio placeholder cuando el campo es required=true. Ahora se delega el placeholder al atributo placeholder del form field para evitar la duplicación.=== strict en self::f() fallaba porque PHP convierte automáticamente las keys numéricas de string a int en arrays, y '1' === 1 siempre da false. Resultado: ningún option recibía selected y el browser mostraba el primero por default. El valor en la base de datos se guardaba correctamente; el bug era solo de visualización. Fix: cast explícito a string en la comparación.checkout_adenda_meta_key en el tab Checkout (solo para órdenes del checkout web) y nuevo checkbox pos_use_customer_note_for_adenda en el tab Backoffice/POS (activado por default) para usar la Nota del Cliente como Adenda. Útil para YITH POS y sistemas similares que no exponen meta keys custom: el operador escribe en la nota y se incluye automáticamente en el CFE. Si no se desea este comportamiento, desmarcar el checkbox después de actualizar.pos_adenda_meta_key ahora solo se lee para órdenes que NO vienen del checkout web (antes se aplicaba a todas, generando comportamiento engañoso).read_pos_meta() y la lectura de meta keys de Adenda ahora usan $order->get_meta() en vez de get_post_meta(), que es la API correcta para sitios con HPOS habilitado. Sin este fix, en sitios con HPOS habilitado el plugin no podía leer el meta key del documento (típicamente billing_vat o _billing_vat) ni los meta keys de adenda, y emitía todas las órdenes POS como consumo final, aunque el operador hubiera ingresado un RUT o CI válido. Sigue funcionando correctamente en instalaciones sin HPOS (legacy wp_postmeta).log_enabled vs enable_logging) entre el sanitizador y la lectura.billing_country del cliente en vez de forzar "UY" cuando el tipo de documento es 3 (CI uruguaya). El "País del Tipo de Documento" sigue siendo "UY" para CI (la CI es uruguaya por definición), pero el país donde vive el receptor puede ser distinto.on_payment_complete) que producía un Error fatal de PHP no atrapado por el primer try/catch, por lo que el botón nunca llegaba a hacer la conexión al WebService de pFacturas. Ahora invoca correctamente emit_if_needed().pos_doc_meta_key quedaba guardado como string vacío (el nuevo default billing_vat no se aplica automáticamente a configuraciones ya guardadas)billing_vat para el meta key del documento — funciona out-of-the-box con la mayoría de plugins POSpfwc_nombre_parece_empresa() para detectar sufijos SA/S.A./SAS/S.A.S./SRL/S.R.L./LTDA/Ltda (con o sin puntos)pf_rut_invalido_empresa para órdenes POS bloqueadas por inconsistencia entre documento y sufijo empresarialbilling_company está presente pero los meta keys fiscales no están configurados, evitando la emisión silenciosa como consumo finalpos_rut_meta_key y pos_razon_social_meta_keytipo_doc (2=RUT, 3=CI, etc.) alineado con los códigos de tipo de documento de DGIpos_billing_first_name, pos_billing_last_name, pos_billing_company) con defaults estándar de WooCommercecheckout_razon_social_meta_key (default: billing_company) sincroniza la Razón Social en el checkoutIndicadorDeFacturacion ahora se infiere a partir de la tasa efectiva de impuestos en vez del nombre de la tax classindicador_por_tasa()console.log verbosos de debug en blocks.jsorder_id de $_POSTcheck_ajax_referer() en vez de nonces específicos por ordenpfwc_emit_cfe en lugar del dinámico pf_emit_ . $order_idob_start() y ob_get_clean() separados en líneas individuales para manejo explícito del bufferwp_localize_script() para pasar nonce y ajaxUrl al JavaScriptpf_ al prefijo pfwc_ (WordPress.org requiere 4 caracteres o más)phpcs:ignore agregados para el uso de $_GET en el enqueueing de scripts del admin (solo para mostrar mensaje, no procesa datos)PF_ a PFWC_ (WordPress.org requiere 4 caracteres o más)PF_PLUGIN_DIR y PF_PLUGIN_URL cambiadas a PFWC_PLUGIN_DIR y PFWC_PLUGIN_URL<script> inline convertidos a wp_add_inline_script() para enqueueing correctoajax_emit()emit_if_needed() y removido el procesamiento directo de $_POSTvar_export() y print_r() inseguros de datos de $_POST en el loggingesc_html() a todas las variables echoeadasCompress-Archive para compatibilidad con WordPress.org)/* a /** (estándar PHPDoc DocBlock)* agregado al inicio de cada línea según el estándar de WordPress.org)phpcs:ignore inline a un bloque phpcs:disable/phpcs:enable en class-pf-emitter.php líneas 588-590phpcs:ignore inline en class-pf-emitter.php línea 589phpcs:ignore inline en class-pf-emitter.php línea 589 para NonceVerification.Missingsanitize_text_field() en class-pf-emitter.php línea 606 para el noncewp_unslash() en class-pf-emitter.php línea 606 para $_POST['_wpnonce']phpcs:ignore faltantes en class-pf-checkout.php (líneas 18-20, 37-39)phpcs:ignore para var_export en class-pf-emitter.php línea 155phpcs:ignore para $_POST en class-pf-emitter.php líneas 588, 592, 605phpcs:ignore para var_export y print_r en class-pf-mapper.php líneas 17, 20, 25sanitize_callback a register_setting() para cumplir con los estándares de WordPressphpcs:ignore para los warnings de verificación de nonce en hooks de WooCommercephpcs:ignore para las funciones de debug (var_export, print_r) usadas solo para loggingclass-pf-manual-updater.php con la funcionalidad de actualización manualclass-pf-manual-updater.php para pasar Plugin Check sin erroresclass-pf-manual-updater.php para funcionalidad completa_dev/ para explicar el sistema de builds dualphpcs:ignore a todos los print_r() y var_export() usados en logging_dev/enable-manual-updates.flagDevelopmentFunctions en class-pf-blocks.php y class-pf-emitter.phpdate() reemplazados por gmdate() para evitar problemas de timezoneesc_html() al mensaje de error de wp_die() en class-pf-settings.phpWordPress.DateTime.RestrictedFunctions: Todos los date() cambiados a gmdate() en helpers.php, class-pf-client.php y class-pf-mapper.phpesc_attr() a todas las salidas de self::OPTION_KEY en class-pf-settings.phpesc_html(), esc_attr(), esc_textarea() a los parámetros dinámicos de la función f()phpcs:ignore para print_r() y var_export() usados en loggingdate() por current_time('mysql') en helpers.php para consistencia con WordPressin_array() con el parámetro de comparación estrictaphpcs:ignore con justificación para variables segurasclass-pf-checkout.php, class-pf-emitter.php y class-pf-settings.phpesc_attr(), esc_js(), esc_url() donde correspondewp_redirect() cambiado a wp_safe_redirect() para mayor seguridadget_billing_first_name(), get_billing_last_name(), get_billing_address_1(), get_billing_city() y get_billing_country() del objeto orden.