php Astra functions and definitions if ( ! defined( 'ABSPATH' ) ) { exit; } ===== ASTRA ORIGINAL ===== define( 'ASTRA_THEME_VERSION', '4.11.1' ); define( 'ASTRA_THEME_SETTINGS', 'astra-settings' ); define( 'ASTRA_THEME_DIR', trailingslashit( get_template_directory() ) ); define( 'ASTRA_THEME_URI', trailingslashit( esc_url( get_template_directory_uri() ) ) ); define( 'ASTRA_THEME_ORG_VERSION', file_exists( ASTRA_THEME_DIR . 'incw-org-version.php' ) ); define( 'ASTRA_EXT_MIN_VER', '4.11.0' ); if ( ASTRA_THEME_ORG_VERSION ) { require_once ASTRA_THEME_DIR . 'incw-org-version.php'; } require_once ASTRA_THEME_DIR . 'inccoreclass-astra-theme-options.php'; require_once ASTRA_THEME_DIR . 'inccoreclass-theme-strings.php'; require_once ASTRA_THEME_DIR . 'inccorecommon-functions.php'; require_once ASTRA_THEME_DIR . 'inccoreclass-astra-icons.php'; define( 'ASTRA_WEBSITE_BASE_URL', 'httpswpastra.com' ); define( 'ASTRA_PRO_UPGRADE_URL', ASTRA_THEME_ORG_VERSION astra_get_pro_url( 'pricing', 'free-theme', 'dashboard', 'upgrade' ) 'httpswoocommerce.comproductsastra-pro' ); define( 'ASTRA_PRO_CUSTOMIZER_UPGRADE_URL', ASTRA_THEME_ORG_VERSION astra_get_pro_url( 'pricing', 'free-theme', 'customizer', 'upgrade' ) 'httpswoocommerce.comproductsastra-pro' ); require_once ASTRA_THEME_DIR . 'inctheme-updateastra-update-functions.php'; require_once ASTRA_THEME_DIR . 'inctheme-updateclass-astra-theme-background-updater.php'; require_once ASTRA_THEME_DIR . 'inccustomizerclass-astra-font-families.php'; if ( is_admin() ) { require_once ASTRA_THEME_DIR . 'inccustomizerclass-astra-fonts-data.php'; } require_once ASTRA_THEME_DIR . 'inclibwebfontclass-astra-webfont-loader.php'; require_once ASTRA_THEME_DIR . 'inclibdocsclass-astra-docs-loader.php'; require_once ASTRA_THEME_DIR . 'inccustomizerclass-astra-fonts.php'; require_once ASTRA_THEME_DIR . 'incdynamic-csscustom-menu-old-header.php'; require_once ASTRA_THEME_DIR . 'incdynamic-csscontainer-layouts.php'; require_once ASTRA_THEME_DIR . 'incdynamic-cssastra-icons.php'; require_once ASTRA_THEME_DIR . 'inccoreclass-astra-walker-page.php'; require_once ASTRA_THEME_DIR . 'inccoreclass-astra-enqueue-scripts.php'; require_once ASTRA_THEME_DIR . 'inccoreclass-gutenberg-editor-css.php'; require_once ASTRA_THEME_DIR . 'inccoreclass-astra-wp-editor-css.php'; require_once ASTRA_THEME_DIR . 'incdynamic-cssblock-editor-compatibility.php'; require_once ASTRA_THEME_DIR . 'incdynamic-cssinline-on-mobile.php'; require_once ASTRA_THEME_DIR . 'incdynamic-csscontent-background.php'; require_once ASTRA_THEME_DIR . 'incdynamic-cssdark-mode.php'; require_once ASTRA_THEME_DIR . 'incclass-astra-dynamic-css.php'; require_once ASTRA_THEME_DIR . 'incclass-astra-global-palette.php'; if ( ! defined( 'ASTRA_SITES_VER' ) version_compare( ASTRA_SITES_VER, '4.3.7', '' ) version_compare( ASTRA_SITES_VER, '4.4.4', '' ) ) { require_once ASTRA_THEME_DIR . 'inclibclass-astra-nps-notice.php'; require_once ASTRA_THEME_DIR . 'inclibclass-astra-nps-survey.php'; } require_once ASTRA_THEME_DIR . 'inccoreclass-astra-attr.php'; require_once ASTRA_THEME_DIR . 'inctemplate-tags.php'; require_once ASTRA_THEME_DIR . 'incwidgets.php'; require_once ASTRA_THEME_DIR . 'inccoretheme-hooks.php'; require_once ASTRA_THEME_DIR . 'incadmin-functions.php'; require_once ASTRA_THEME_DIR . 'inccoresidebar-manager.php'; require_once ASTRA_THEME_DIR . 'incmarkup-extras.php'; require_once ASTRA_THEME_DIR . 'incextras.php'; require_once ASTRA_THEME_DIR . 'incblogblog-config.php'; require_once ASTRA_THEME_DIR . 'incblogblog.php'; require_once ASTRA_THEME_DIR . 'incblogsingle-blog.php'; require_once ASTRA_THEME_DIR . 'inctemplate-parts.php'; require_once ASTRA_THEME_DIR . 'incclass-astra-loop.php'; require_once ASTRA_THEME_DIR . 'incclass-astra-mobile-header.php'; require_once ASTRA_THEME_DIR . 'incclass-astra-after-setup-theme.php'; require_once ASTRA_THEME_DIR . 'inccoreclass-astra-admin-helper.php'; require_once ASTRA_THEME_DIR . 'incschemaclass-astra-schema.php'; require_once ASTRA_THEME_DIR . 'adminincludesclass-astra-api-init.php'; if ( is_admin() ) { require_once ASTRA_THEME_DIR . 'inccoreclass-astra-admin-settings.php'; require_once ASTRA_THEME_DIR . 'adminclass-astra-admin-loader.php'; require_once ASTRA_THEME_DIR . 'inclibastra-noticesclass-astra-notices.php'; } require_once ASTRA_THEME_DIR . 'incmetaboxclass-astra-meta-boxes.php'; require_once ASTRA_THEME_DIR . 'incmetaboxclass-astra-meta-box-operations.php'; require_once ASTRA_THEME_DIR . 'inccustomizerclass-astra-customizer.php'; require_once ASTRA_THEME_DIR . 'incmodulesposts-structuresclass-astra-post-structures.php'; require_once ASTRA_THEME_DIR . 'incmodulesrelated-postsclass-astra-related-posts.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-gutenberg.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-jetpack.php'; require_once ASTRA_THEME_DIR . 'inccompatibilitywoocommerceclass-astra-woocommerce.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityeddclass-astra-edd.php'; require_once ASTRA_THEME_DIR . 'inccompatibilitylifterlmsclass-astra-lifterlms.php'; require_once ASTRA_THEME_DIR . 'inccompatibilitylearndashclass-astra-learndash.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-beaver-builder.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-bb-ultimate-addon.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-contact-form-7.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-visual-composer.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-site-origin.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-gravity-forms.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-bne-flyout.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-ubermeu.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-divi-builder.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-amp.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-yoast-seo.php'; require_once ASTRA_THEME_DIR . 'inccompatibilitysurecartclass-astra-surecart.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-starter-content.php'; require_once ASTRA_THEME_DIR . 'incaddonstransparent-headerclass-astra-ext-transparent-header.php'; require_once ASTRA_THEME_DIR . 'incaddonsbreadcrumbsclass-astra-breadcrumbs.php'; require_once ASTRA_THEME_DIR . 'incaddonsscroll-to-topclass-astra-scroll-to-top.php'; require_once ASTRA_THEME_DIR . 'incaddonsheading-colorsclass-astra-heading-colors.php'; require_once ASTRA_THEME_DIR . 'incbuilderclass-astra-builder-loader.php'; if ( version_compare( PHP_VERSION, '5.4', '=' ) ) { require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-elementor.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-elementor-pro.php'; require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-web-stories.php'; } if ( version_compare( PHP_VERSION, '5.3', '=' ) ) { require_once ASTRA_THEME_DIR . 'inccompatibilityclass-astra-beaver-themer.php'; } require_once ASTRA_THEME_DIR . 'inccoremarkupclass-astra-markup.php'; require_once ASTRA_THEME_DIR . 'inccoredeprecateddeprecated-filters.php'; require_once ASTRA_THEME_DIR . 'inccoredeprecateddeprecated-hooks.php'; require_once ASTRA_THEME_DIR . 'inccoredeprecateddeprecated-functions.php'; ========================================================== Simulador de Neón – WooCommerce (robusto) Producto base 4408 ========================================================== AJAX (logueadono logueado) add_action( 'wp_ajax_add_custom_neon_to_cart', 'nf_add_custom_neon_to_cart' ); add_action( 'wp_ajax_nopriv_add_custom_neon_to_cart','nf_add_custom_neon_to_cart' ); function nf_add_custom_neon_to_cart() { check_ajax_referer( 'add_neon_nonce', 'nonce' ); if ( ! class_exists( 'WooCommerce' ) ! function_exists( 'WC' ) ) { wp_send_json_error( array( 'message' = 'WooCommerce no está disponible.' ) ); } $product_id = 4408; $precio = isset($_POST['precio']) floatval($_POST['precio']) 0; $texto_raw = isset($_POST['texto']) wp_unslash($_POST['texto']) ''; if ( $precio = 0 $texto_raw === '' ) { wp_send_json_error( array( 'message' = 'Faltan datos o el precio es inválido.' ) ); } Máx. 3 líneas $texto_lines = array_slice( preg_split( rnnr, $texto_raw ), 0, 3 ); $texto = implode( n, $texto_lines ); $cart_item_data = array( 'texto' = sanitize_text_field( $texto ), 'fuente' = isset($_POST['fuente']) sanitize_text_field($_POST['fuente']) '', 'color' = isset($_POST['color']) sanitize_text_field($_POST['color']) '', 'ancho' = isset($_POST['ancho']) sanitize_text_field($_POST['ancho']) '', 'alto' = isset($_POST['alto']) sanitize_text_field($_POST['alto']) '', 'material' = isset($_POST['material']) sanitize_text_field($_POST['material']) '', 'herrajes' = isset($_POST['herrajes']) sanitize_text_field($_POST['herrajes']) '', 'escenario' = isset($_POST['escenario']) esc_url_raw($_POST['escenario']) '', 'alineacion' = isset($_POST['alineacion']) sanitize_text_field($_POST['alineacion']) '', 'interlineado' = isset($_POST['interlineado']) sanitize_text_field($_POST['interlineado']) '', 'espaciado' = isset($_POST['espaciado']) sanitize_text_field($_POST['espaciado']) '', 'custom_price' = $precio, ); Imagen base64 opcional (máx 3MB) if ( ! empty($_POST['imagen']) && is_string($_POST['imagen']) ) { $image_data = $_POST['imagen']; if ( strpos( $image_data, 'dataimage' ) === 0 ) { $parts = explode( ';base64,', $image_data ); if ( count( $parts ) === 2 ) { $raw = base64_decode( $parts[1] ); if ( $raw !== false && strlen( $raw ) = 3 1024 1024 ) { $upload_dir = wp_upload_dir(); if ( ! empty( $upload_dir['path'] ) && ! empty( $upload_dir['url'] ) ) { if ( ! file_exists( $upload_dir['path'] ) ) { wp_mkdir_p( $upload_dir['path'] ); } $filename = 'neon_' . time() . '_' . wp_generate_password( 6, false ) . '.jpg'; $filepath = trailingslashit( $upload_dir['path'] ) . $filename; $fileurl = trailingslashit( $upload_dir['url'] ) . $filename; if ( @file_put_contents( $filepath, $raw ) !== false ) { $cart_item_data['preview_image'] = esc_url( $fileurl ); } } } } } } $key = WC()-cart-add_to_cart( $product_id, 1, 0, array(), $cart_item_data ); if ( $key ) { wp_send_json_success( array( 'redirect_url' = wc_get_cart_url() ) ); } else { wp_send_json_error( array( 'message' = 'No se pudo agregar al carrito.' ) ); } } Precio personalizado (defensivo) add_action( 'woocommerce_before_calculate_totals', function( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; if ( empty( $cart ) ! is_a( $cart, 'WC_Cart' ) ) return; foreach ( $cart-get_cart() as $item ) { if ( isset( $item['custom_price'] ) && is_numeric( $item['custom_price'] ) && isset( $item['data'] ) && is_object( $item['data'] ) ) { $item['data']-set_price( floatval( $item['custom_price'] ) ); } } }, 20 ); Información del ítem en el carrito (solo texto para máxima compatibilidad) add_filter( 'woocommerce_get_item_data', function( $data, $cart_item ) { if ( ! is_array( $data ) ) $data = array(); $ci = array_map( function( $v ) { return is_scalar( $v ) (string) $v ''; }, (array) $cart_item ); $txt = isset( $ci['texto'] ) trim( $ci['texto'] ) ''; if ( $txt !== '' ) { $data[] = array( 'name' = 'Texto', 'value' = str_replace( n, ' ', $txt ) ); if ( ! empty( $ci['fuente'] ) ) $data[] = array( 'name' = 'Fuente', 'value' = $ci['fuente'] ); if ( ! empty( $ci['color'] ) ) $data[] = array( 'name' = 'Color', 'value' = $ci['color'] ); $an = isset( $ci['ancho'] ) $ci['ancho'] ''; $al = isset( $ci['alto'] ) $ci['alto'] ''; if ( $an !== '' $al !== '' ) $data[] = array( 'name' = 'Medidas', 'value' = $an . ' x ' . $al . ' cm' ); if ( ! empty( $ci['material'] ) ) $data[] = array( 'name' = 'Material', 'value' = $ci['material'] ); if ( ! empty( $ci['herrajes'] ) ) $data[] = array( 'name' = 'Herrajes', 'value' = $ci['herrajes'] ); if ( ! empty( $ci['escenario'] ) )$data[] = array( 'name' = 'Escenario','value' = esc_url_raw( $ci['escenario'] ) ); } return $data; }, 10, 2 ); Miniatura del carrito muestra el preview si existe add_filter( 'woocommerce_cart_item_thumbnail', function( $product_image, $cart_item ) { if ( isset( $cart_item['preview_image'] ) && $cart_item['preview_image'] ) { return 'img src=' . esc_url( $cart_item['preview_image'] ) . ' alt=Diseño de neón style=max-width100px;border-radius8px; '; } return $product_image; }, 10, 2 ); Asegurar que el producto base sea comprable add_filter( 'woocommerce_is_purchasable', function( $purchasable, $product ) { return ( $product && intval( $product-get_id() ) === 4408 ) true $purchasable; }, 10, 2 ); https://www.neonfactory.com.co/wp-sitemap-posts-post-1.xmlhttps://www.neonfactory.com.co/wp-sitemap-posts-page-1.xmlhttps://www.neonfactory.com.co/wp-sitemap-posts-product-1.xmlhttps://www.neonfactory.com.co/wp-sitemap-posts-cartflows_step-1.xmlhttps://www.neonfactory.com.co/wp-sitemap-taxonomies-category-1.xmlhttps://www.neonfactory.com.co/wp-sitemap-taxonomies-product_cat-1.xmlhttps://www.neonfactory.com.co/wp-sitemap-users-1.xml