Sådan virker det
- Et nyt felt,
billing_cvr, lægges ind i checkout under firmanavn. - Når kunden har tastet 8 cifre, kalder et lille script
https://apicvr.dk/api/v1/{cvr}. - Firmanavn, adresse, postnummer og by udfyldes automatisk.
- Valgfrit: CVR-nummeret valideres på serveren, før ordren oprettes.
1. Tilføj CVR-feltet og scriptet
Læg koden i functions.php i dit child-tema eller i et lille plugin. WooCommerce gemmer automatisk feltet på ordren som metafeltet _billing_cvr.
<?php
// functions.php i dit (child-)tema eller et lille plugin
add_filter( 'woocommerce_checkout_fields', function ( $fields ) {
$fields['billing']['billing_cvr'] = array(
'type' => 'text',
'label' => 'CVR-nummer',
'required' => false,
'class' => array( 'form-row-wide' ),
'priority' => 25, // lige efter firmanavn
'maxlength' => 8,
);
return $fields;
} );
add_action( 'wp_enqueue_scripts', function () {
if ( ! is_checkout() ) {
return;
}
wp_enqueue_script(
'cvr-autofill',
get_stylesheet_directory_uri() . '/cvr-autofill.js',
array(),
'1.0',
true
);
} );
2. Autoudfyld med JavaScript
Gem filen som cvr-autofill.js i dit child-tema. API'et sender Access-Control-Allow-Origin: *, så kaldet kan laves direkte fra browseren uden proxy og uden API-nøgle.
// cvr-autofill.js
document.addEventListener('DOMContentLoaded', () => {
const cvrInput = document.getElementById('billing_cvr');
if (!cvrInput) return;
const setField = (id, value) => {
const el = document.getElementById(id);
if (!el || value === null || value === undefined) return;
el.value = value;
el.dispatchEvent(new Event('change', { bubbles: true }));
};
cvrInput.addEventListener('input', async () => {
const cvr = cvrInput.value.replace(/\D/g, '');
if (cvr.length !== 8) return;
try {
const res = await fetch(`https://apicvr.dk/api/v1/${cvr}`);
if (!res.ok) return; // 404 = unknown CVR number
const company = await res.json();
setField('billing_company', company.name);
setField('billing_address_1', company.address);
setField('billing_postcode', company.zipcode);
setField('billing_city', company.city);
} catch (err) {
// Network error: let the customer fill in the fields by hand.
}
});
});
3. Valider CVR-nummeret på serveren (valgfrit)
Browseren kan snydes, så validér også på serveren. Svarer API'et 404, findes CVR-nummeret ikke. Er API'et utilgængeligt, lader vi ordren gå igennem, så du ikke mister salg.
<?php
add_action( 'woocommerce_checkout_process', function () {
$cvr = isset( $_POST['billing_cvr'] )
? preg_replace( '/\D/', '', wp_unslash( $_POST['billing_cvr'] ) )
: '';
if ( '' === $cvr ) {
return; // feltet er valgfrit
}
if ( 8 !== strlen( $cvr ) ) {
wc_add_notice( 'CVR-nummeret skal bestå af 8 cifre.', 'error' );
return;
}
$response = wp_remote_get( 'https://apicvr.dk/api/v1/' . $cvr, array( 'timeout' => 10 ) );
if ( is_wp_error( $response ) ) {
return; // bloker ikke checkout, hvis API'et ikke svarer
}
if ( 404 === wp_remote_retrieve_response_code( $response ) ) {
wc_add_notice( 'Vi kunne ikke finde CVR-nummeret i CVR-registret.', 'error' );
}
} );
[woocommerce_checkout]). Bruger din butik den nye blokbaserede checkout, virker filteret woocommerce_checkout_fields ikke. Der skal du tilføje feltet via WooCommerces Additional Checkout Fields API i stedet.Husk reklamebeskyttelse
Gemmer du kundens firmadata til nyhedsbreve eller anden markedsføring, så tjek feltet protected. Er det true, har virksomheden frabedt sig reklamehenvendelser. Læs mere om reklamebeskyttelse.
Ofte stillede spørgsmål
Kræver det et plugin?
Nej. Koden ovenfor kan ligge i dit child-temas functions.php. Vil du kunne flytte den mellem temaer, så pak den ind i et lille plugin.
Hvor bliver CVR-nummeret gemt?
WooCommerce gemmer felter fra woocommerce_checkout_fields som ordremeta. Du finder det under metanøglen _billing_cvr på ordren.
Koster CVR-opslagene noget?
Nej. CVR-API er gratis og kræver ingen API-nøgle. Der gælder rimelige rate limits.