CVR-opslag i WooCommerce-checkout

B2B-kunder skal ikke taste firmanavn og adresse selv. Med et CVR-felt og ca. 30 linjer kode henter din WooCommerce-butik oplysningerne direkte fra CVR-registret, så snart kunden har skrevet 8 cifre.

Sådan virker det

  1. Et nyt felt, billing_cvr, lægges ind i checkout under firmanavn.
  2. Når kunden har tastet 8 cifre, kalder et lille script https://apicvr.dk/api/v1/{cvr}.
  3. Firmanavn, adresse, postnummer og by udfyldes automatisk.
  4. 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
<?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.

javascript
// 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
<?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' );
    }
} );
Koden bruger den klassiske checkout ([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.