prefix . 'cfep_block_fields'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) { return; } $cache_key = 'cfep_block_field_positions'; $fields = wp_cache_get($cache_key, 'cfep'); if ($fields === false) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter $fields = $wpdb->get_results( "SELECT field_key, position, location FROM {$table_name} WHERE enabled = 1 ORDER BY position ASC" ); wp_cache_set($cache_key, $fields, 'cfep', 300); } if (empty($fields)) { return; } $field_positions = array(); foreach ($fields as $field) { // Store multiple variations $field_positions[$field->field_key] = (int) $field->position; // Also store without prefix for matching $clean_key = preg_replace('/^(billing|shipping|contact)_/', '', $field->field_key); $field_positions[$clean_key] = (int) $field->position; } wp_add_inline_script('wp-hooks', " (function() { const fieldPositions = " . wp_json_encode( $field_positions ) . "; const processedContainers = new WeakSet(); // Track processed containers function reorderContainer(container, containerName) { if (!container) { return false; } // Skip if already processed if (processedContainers.has(container)) { return false; } console.log('CFEP: Processing', containerName); const children = Array.from(container.children); const fieldsWithPosition = []; children.forEach((child, index) => { let fieldKey = null; let position = index * 100; const input = child.querySelector('input, select, textarea'); if (input) { // Get field key from name or id fieldKey = input.name || input.id; if (fieldKey) { // Try multiple key variations let foundPosition = null; // Try exact match if (fieldPositions[fieldKey]) { foundPosition = fieldPositions[fieldKey]; } // Try without namespace (e.g., 'contact-cfep/xyz' -> 'xyz') if (!foundPosition) { const withoutNamespace = fieldKey.replace(/^[a-z]+[-_]cfep\\//, ''); if (fieldPositions[withoutNamespace]) { foundPosition = fieldPositions[withoutNamespace]; fieldKey = withoutNamespace; } } // Try without prefix (e.g., 'shipping_city' -> 'city') if (!foundPosition) { const withoutPrefix = fieldKey.replace(/^(billing|shipping|contact)[-_]/, ''); if (fieldPositions[withoutPrefix]) { foundPosition = fieldPositions[withoutPrefix]; fieldKey = withoutPrefix; } } if (foundPosition) { position = foundPosition; console.log(' ✓ Position', position, 'for', fieldKey); } } } fieldsWithPosition.push({ element: child, position: position, key: fieldKey || 'unknown-' + index }); }); // Sort by position fieldsWithPosition.sort((a, b) => a.position - b.position); // Reorder fieldsWithPosition.forEach(item => { container.appendChild(item.element); }); // Mark as processed processedContainers.add(container); console.log('CFEP: ✓ Done -', containerName); return true; } function reorderAll() { let processed = 0; // Contact section const contactFieldset = document.querySelector('.wc-block-checkout__contact-fields fieldset'); if (contactFieldset && reorderContainer(contactFieldset, 'contact')) { processed++; } // Shipping address const shippingForms = document.querySelectorAll('.wc-block-components-address-form'); shippingForms.forEach((form, idx) => { if (reorderContainer(form, 'address-form-' + idx)) { processed++; } }); return processed > 0; } // Try multiple times with delays let attempts = 0; const maxAttempts = 5; function tryReorder() { attempts++; const success = reorderAll(); if (success) { console.log('CFEP: Reordering successful!'); } else if (attempts < maxAttempts) { console.log('CFEP: Retry', attempts, 'of', maxAttempts); setTimeout(tryReorder, 500); } } // Start after DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => setTimeout(tryReorder, 100)); } else { setTimeout(tryReorder, 100); } })(); "); } }