# Kosár helyreállítás testreszabása kóddal

> Elhagyott kosarak követésének szűrése, extra adatok mentése, címzett, stílus, fejlécek és tartalom módosítása, események, adattábla.

A [Kosár helyreállítása](https://hub.hellowp.io/hu/plugins/checkout-for-woocommerce/funkciok-kosar-helyreallitas/) alapműködése a beállítások oldalon állítható. Ha ennél többre van szükséged, a folyamat minden szakaszához tartozik szűrő vagy akciókampó. A kódot a gyermektéma `functions.php` fájljába vagy egy kódrészlet-kezelő bővítménybe tedd, vagy a **CheckoutWC → Haladó → Szkriptek** oldal **PHP kódrészletek** mezőjébe (lásd [PHP kódrészletek](https://hub.hellowp.io/hu/plugins/checkout-for-woocommerce/fejlesztoknek-php-kodreszletek/)).

A folyamat szakaszai, hogy tudd, melyikbe nyúlj bele:

1. **Követés:** amint a vásárló megadja az e-mail-címét a pénztáron, a rendszer elmenti a kosár tartalmát, az elérhetőségeit és a hozzáadott egyedi adatokat.
2. **Elhagyottnak jelölés:** 5 percenként fut egy ellenőrzés, amely a beállított elhagyási idő után elhagyottnak jelöli a le nem zárt kosarat.
3. **E-mailek:** az ütemezés szerint kimennek az emlékeztetők.
4. **Visszanyerés vagy elvesztés:** ha a vásárló a linken át befejezi a rendelést, a kosár visszanyert lesz, ha a határidőn belül nem, akkor elveszett.

## Mely kosarakat kövesse a rendszer?

Nem minden kosárnak kell emlékeztető. Érdemes kizárni a munkatársak tesztrendeléseit, a nagykereskedelmi vevőket, a nagyon kis értékű kosarakat, a nemrég vásárlókat és az előfizetések automatikus megújítását.

A `cfw_acr_exclude_cart` szűrő a kosár mentése előtt fut. Ha `true` értéket adsz vissza, a kosár követése kimarad.

| Paraméter | Tartalma |
| --- | --- |
| `$exclude` | Kizárjuk-e a kosarat (alapból `false`). |
| `$email` | A vásárló e-mail-címe. |
| `$cart_contents` | A kosár tartalma tömbként. |
| `$subtotal` | A kosár részösszege. |
| `$first_name` | A vásárló utóneve. |
| `$last_name` | A vásárló vezetékneve. |
| `$fields` | A pénztármezők összes értéke. |
| `$meta` | Az egyedi metaadatok tömbje. |

```php
add_filter( 'cfw_acr_exclude_cart', function( $exclude, $email, $cart_contents, $subtotal, $first_name, $last_name, $fields, $meta ) {
    // Ide jön a saját feltételed.
    return $exclude;
}, 10, 8 );
```

### Példa: kis értékű kosarak kizárása

Egy emlékeztető költséggel jár (levélküldés, esetleges kedvezmény), ezért egy kis értékű kosárnál nem biztos, hogy megéri.

```php
add_filter( 'cfw_acr_exclude_cart', function( $exclude, $email, $cart_contents, $subtotal ) {
    // 15 000 Ft alatti kosarakat nem követünk.
    if ( $subtotal < 15000 ) {
        return true;
    }

    return $exclude;
}, 10, 4 );
```

### Példa: nagykereskedelmi vevők kizárása

A nagykereskedelmi vevőknek gyakran saját kapcsolattartójuk van, az általános emlékeztető náluk zavaró lehet. (Szerepkör szerint a beállítások oldalon is kizárhatsz, ez a kód akkor kell, ha más feltételed van.)

```php
add_filter( 'cfw_acr_exclude_cart', function( $exclude, $email ) {
    $user = get_user_by( 'email', $email );

    if ( $user && in_array( 'wholesale_customer', $user->roles, true ) ) {
        return true;
    }

    return $exclude;
}, 10, 2 );
```

### Példa: nemrég vásárlók kizárása

Aki három napja rendelt, és most újra nézelődik, nem hagyott el semmit. Neki az emlékeztető tolakodó lehet.

```php
add_filter( 'cfw_acr_exclude_cart', function( $exclude, $email ) {
    $recent_orders = wc_get_orders( array(
        'customer'   => $email,
        'date_after' => '14 days ago',
        'status'     => array( 'completed', 'processing' ),
        'limit'      => 1,
    ) );

    if ( ! empty( $recent_orders ) ) {
        return true;
    }

    return $exclude;
}, 10, 2 );
```

### Példa: munkatársak és belső rendelések kizárása

```php
add_filter( 'cfw_acr_exclude_cart', function( $exclude, $email ) {
    // A cég teljes tartománya.
    if ( strpos( $email, '@pelda-ceg.example' ) !== false ) {
        return true;
    }

    // Vagy konkrét címek.
    $excluded_emails = array(
        'teszt1@example.com',
        'teszt2@example.com',
    );

    if ( in_array( $email, $excluded_emails, true ) ) {
        return true;
    }

    return $exclude;
}, 10, 2 );
```

## További adatok mentése a kosárhoz

Alapból a rendszer a kosár tartalmát, a vásárló nevét, e-mail-címét és a részösszeget menti. A `cfw_acr_cart_meta` szűrővel egyedi adatokat fűzhetsz a kosárhoz. Ezek JSON-ként tárolódnak, és a teljes visszanyerési folyamat alatt elérhetők. Hasznos, ha tudni akarod, melyik csatornából jött a vásárló, szeretnéd szegmentálni a kosarakat, mintázatokat elemeznél, vagy az e-mail sablonban személyre szabnál.

```php
add_filter( 'cfw_acr_cart_meta', function( $meta ) {
    // Ide jön a saját adatod.
    return $meta;
} );
```

### Példa: marketing-forrás követése

```php
add_filter( 'cfw_acr_cart_meta', function( $meta ) {
    $meta['utm_source']   = isset( $_GET['utm_source'] ) ? sanitize_text_field( $_GET['utm_source'] ) : '';
    $meta['utm_medium']   = isset( $_GET['utm_medium'] ) ? sanitize_text_field( $_GET['utm_medium'] ) : '';
    $meta['utm_campaign'] = isset( $_GET['utm_campaign'] ) ? sanitize_text_field( $_GET['utm_campaign'] ) : '';

    // Az előző oldal.
    $meta['referrer'] = isset( $_SERVER['HTTP_REFERER'] ) ? esc_url_raw( $_SERVER['HTTP_REFERER'] ) : '';

    return $meta;
} );
```

### Példa: belépőoldal mentése

Ha az első oldalbetöltéskor munkamenet-változóba teszed a belépőoldalt, itt a kosárhoz kötheted.

```php
add_filter( 'cfw_acr_cart_meta', function( $meta ) {
    if ( isset( $_SESSION['landing_page'] ) ) {
        $meta['landing_page'] = sanitize_url( $_SESSION['landing_page'] );
    }

    return $meta;
} );
```

## Az e-mail címzettjének módosítása

Előfordul, hogy nem az a megfelelő címzett, aki a pénztárat elkezdte: például cégnél a beszerzési osztály intézi a rendelést, közös fiókot többen használnak, vagy teszteléskor egy adott postafiókba akarod irányítani a leveleket.

A `cfw_acr_send_to_email` szűrő paraméterei: `$send_to_email` (az eredeti címzett), `$cart` (az elhagyott kosár objektuma) és `$email_id` (az e-mail sablon azonosítója).

```php
add_filter( 'cfw_acr_send_to_email', function( $send_to_email, $cart, $email_id ) {
    // Ide jön a saját logikád.
    return $send_to_email;
}, 10, 3 );
```

### Példa: céges címek átirányítása a beszerzésre

```php
add_filter( 'cfw_acr_send_to_email', function( $send_to_email, $cart, $email_id ) {
    $corporate_domains = array(
        'nagyugyfel.example' => 'beszerzes@nagyugyfel.example',
        'vallalat.example'   => 'beszerzes@vallalat.example',
    );

    foreach ( $corporate_domains as $domain => $redirect ) {
        if ( strpos( $send_to_email, '@' . $domain ) !== false ) {
            return $redirect;
        }
    }

    return $send_to_email;
}, 10, 3 );
```

## Az e-mailek stílusa

Az emlékeztető legyen a márkádhoz illő. A rendszer a küldés előtt a CSS-t beágyazza az elemekbe (Emogrifier könyvtárral), mert sok levelezőprogram a stíluslapot figyelmen kívül hagyja. Saját szabályokat a `cfw_acr_email_custom_css` szűrővel adhatsz hozzá, ami a CSS-szöveget adja vissza.

```php
add_filter( 'cfw_acr_email_custom_css', function() {
    return '
        /* Elsődleges gomb: a webhely gombszínéhez igazítva */
        .btn-primary a {
            background-color: #2563eb !important;
            border-color: #2563eb !important;
            border-radius: 6px !important;
        }

        /* Címsor */
        h1 {
            color: #1e293b;
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
        }

        /* Kiemelt tartalomblokk */
        .content-block {
            background: #f8fafc;
            border-left: 4px solid #2563eb;
            padding: 16px;
        }

        /* Lábléc */
        .footer {
            color: #64748b;
            font-size: 12px;
        }
    ';
} );
```

A stílusozható osztályok:

| Osztály | Mit stílusoz |
| --- | --- |
| `.body` | A levél külső burkolója. |
| `.container` | A fő tartalmi tároló (legfeljebb 580 képpont széles). |
| `.main` | A fehér tartalmi terület háttere. |
| `.content-block` | A belső margós tartalmi szakaszok. |
| `.btn-primary` | Az elsődleges gomb. |
| `.footer` | A lábléc a leiratkozási hivatkozással. |
| `.preheader` | Az előnézeti szöveg (a levélben rejtett, a postaládában látszik). |

A kosár terméktáblázatát külön a `cfw_cart_table_styles` szűrővel stílusozhatod: a kapott stílusszöveghez hozzáfűzöd a saját szabályaidat, és visszaadod.

```php
add_filter( 'cfw_cart_table_styles', function( $styles ) {
    $styles .= '
        .acr-cart-table img {
            border-radius: 8px;
        }
        .acr-cart-table td {
            padding: 12px 8px;
        }
    ';

    return $styles;
} );
```

## Az e-mail fejlécei

A fejlécekkel beállíthatod például a válaszcímet, a prioritást (óvatosan használd) vagy saját követőazonosítót a levelezési elemzőhöz. A `cfw_acr_email_headers` szűrő a fejlécsorok tömbjét kapja.

```php
add_filter( 'cfw_acr_email_headers', function( $headers ) {
    // Válaszcím, hogy a vásárló az ügyfélszolgálatnak tudjon válaszolni.
    $headers[] = 'Reply-To: ugyfelszolgalat@example.com';

    // Saját követőfejléc.
    $headers[] = 'X-ACR-Campaign: abandoned-cart-recovery';

    return $headers;
} );
```

## A kész e-mail tartalmának módosítása

A `cfw_acr_email_content` szűrő a teljesen kiállított levél HTML-jét kapja, vagyis miután a helyettesítők (például `{{checkout_url}}`) már a tényleges értékükre cserélődtek.

### Példa: UTM-paraméterek a pénztárlinkekhez

Így Google Analyticsben látható, a sorozat melyik e-mailje hozza a legtöbb visszanyerést.

```php
add_filter( 'cfw_acr_email_content', function( $content ) {
    $content = preg_replace_callback(
        '/(\?cfw_acr_cart_id=[^"&\s]+)/',
        function( $matches ) {
            return $matches[1] . '&utm_source=checkoutwc&utm_medium=email&utm_campaign=cart_recovery';
        },
        $content
    );

    return $content;
} );
```

### Példa: nyomkövető pixel beszúrása

Egyes levelezőplatformok pixellel mérik a megnyitást. A pixelt a záró `</body>` elé szúrhatod be.

```php
add_filter( 'cfw_acr_email_content', function( $content ) {
    $tracking_pixel = '<img src="https://pelda.example/pixel.gif" width="1" height="1" alt="" />';

    return str_replace( '</body>', $tracking_pixel . '</body>', $content );
} );
```

## A leiratkozás utáni üzenet

Amikor a vásárló a leiratkozási hivatkozásra kattint, megerősítő üzenetet lát. Ezt a `cfw_unsubscribe_successful_message` szűrővel átírhatod a saját hangodra.

```php
add_filter( 'cfw_unsubscribe_successful_message', function( $message ) {
    return 'Leiratkoztál a kosár-emlékeztetőkről. A továbbiakban nem küldünk neked levelet az elhagyott kosaradról.';
} );
```

## Akciókampók a folyamat eseményeihez

| Kampó | Mikor fut | Mire jó |
| --- | --- | --- |
| `cfw_checkout_update_order_review` | Amikor egy kosár követése frissül. | Adatok szinkronizálása külső rendszerbe, például CRM-be. |
| `cfw_acr_send_email` | Közvetlenül minden emlékeztető kiküldése előtt. | Naplózás, integrációk. |
| `cfw_acr_mark_lost` | Amikor egy kosár elveszett lesz (lejárt a visszanyerési idő). | Például záró „hiányzol” kampány indítása másik platformon. |

```php
add_action( 'cfw_checkout_update_order_review', function() {
    if ( function_exists( 'sajat_elemzes_kovetes' ) ) {
        sajat_elemzes_kovetes( 'cart_tracked', array(
            'email'      => WC()->customer->get_billing_email(),
            'cart_total' => WC()->cart->get_total( 'edit' ),
        ) );
    }
} );

add_action( 'cfw_acr_send_email', function() {
    if ( defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) {
        error_log( 'ACR: emlékeztető kiküldve: ' . current_time( 'mysql' ) );
    }
} );

add_action( 'cfw_acr_mark_lost', function() {
    // Itt indíthatsz winback-kampányt a levelezőplatformodban.
} );
```

## Az adattábla

Haladó integrációkhoz közvetlenül is lekérdezheted a kosarakat. Az elhagyott kosarak a `wp_cfw_acr_carts` táblában vannak (a `wp_` az adatbázis előtagja).

| Oszlop | Típus | Tartalma |
| --- | --- | --- |
| `id` | egész szám | Elsődleges kulcs. |
| `email` | szöveg | A vásárló e-mail-címe. |
| `first_name` | szöveg | Utónév. |
| `last_name` | szöveg | Vezetéknév. |
| `cart` | hosszú szöveg | A kosár tartalma JSON-ként. |
| `subtotal` | tizedes szám | A részösszeg a követés idején. |
| `status` | szöveg | `active`, `abandoned`, `recovered` vagy `lost`. |
| `created` | dátum és idő | Mikor kezdődött a követés. |
| `emails_sent` | egész szám | A kiküldött emlékeztetők száma. |
| `cart_hash` | szöveg | Egyedi azonosító a kosár biztonságos visszaállító linkjéhez. |

Példa: az elmúlt 7 nap elhagyott kosarai részösszeg szerint csökkenő sorrendben.

```php
global $wpdb;
$table = $wpdb->prefix . 'cfw_acr_carts';

$abandoned = $wpdb->get_results(
    $wpdb->prepare(
        "SELECT * FROM {$table}
         WHERE status = %s
         AND created > %s
         ORDER BY subtotal DESC",
        'abandoned',
        gmdate( 'Y-m-d H:i:s', strtotime( '-7 days' ) )
    )
);
```

## Kosarak követése e-mail-cím nélkül

Alapból a rendszer csak akkor követ kosarat, ha a vásárló megadta az e-mail-címét. A `cfw_acr_track_cart_without_emails` szűrővel korábban is követhetsz, például bejelentkezett felhasználóknál.

```php
add_filter( 'cfw_acr_track_cart_without_emails', function( $track ) {
    if ( is_user_logged_in() ) {
        return true;
    }

    return $track;
} );
```

Óvatosan használd: e-mail-cím nélkül nem tud emlékeztetőt küldeni a rendszer, ezért ez főleg akkor hasznos, ha a követési adatot elemzésre használod, nem levélküldésre.
