# Függvények: hozzáférés-ellenőrzés, tagsági állapotok és frissítés

> Az rcp_is_restricted_content(), rcp_user_can_access(), rcp_user_can_access_term(), rcp_user_has_access(), rcp_user_has_active_membership(), rcp_user_has_expired_membership(), rcp_user_has_free_membership(), rcp_is_trialing(), rcp_set_expiration_date(), rcp_update_membership() és rcp_update_discount() függvény.

Egyedi kódhoz tartozó függvények, ezért a bevezetésükhöz érdemes fejlesztő segítségét kérni.

## rcp_is_restricted_content()

Megmondja, hogy egy bejegyzésen van-e bármilyen korlátozás: a bejegyzés saját beállításai, a bejegyzéstípus szabályai vagy egy taxonómiakifejezéstől (kategória, címke) örökölt korlátozás. **Nem** vizsgálja, hogy az adott felhasználó megnézheti-e a tartalmat. Ahhoz az `rcp_user_can_access()` függvényt használd.

- `$post_id` (egész): a bejegyzés azonosítója. Csak számszerű azonosító jó, az üres vagy érvénytelen érték `false`-t ad.

Visszatérési érték (logikai): `true`, ha a bejegyzés bármilyen módon korlátozott, különben `false`.

```php
if ( rcp_is_restricted_content( get_the_ID() ) ) {
	// Ezen a bejegyzésen van korlátozás.
}

if ( ! rcp_is_restricted_content( $post_id ) ) {
	// Nincs rajta korlátozás.
}
```

### Az rcp_is_restricted_content szűrő

Ugyanezen a néven szűrő is van, amellyel felülbírálhatod az eredményt. Két paramétert kap: `$is_restricted` (logikai, korlátozott-e a bejegyzés bármilyen módon) és `$post_id` (egész, az ellenőrzött bejegyzés azonosítója). Ez a szűrő sem azt dönti el, hogy a felhasználó láthatja-e a tartalmat, csak azt, hogy vannak-e korlátozások.

Kapcsolódó függvények: `rcp_get_post_restrictions()` és a bejegyzés korlátozásait ellenőrző `rcp_has_post_restrictions`.

## rcp_user_can_access()

Eldönti, hogy egy felhasználó megnézhet-e egy adott bejegyzést (vagy a ciklusban éppen aktuális bejegyzést). A bővítmény teljes korlátozási logikáját lefuttatja: tagsági szinteket, hozzáférési szinteket és a kapcsolódó szabályokat. Sablonokban ez a legmegbízhatóbb ellenőrzés.

Ha a felhasználónak van ügyfélrekordja, a döntést az `RCP_Customer::can_access( $post_id )` hozza. Ügyfélrekord nélkül is lehet hozzáférése, ha a bejegyzés nem korlátozott, ha a felhasználó adminisztrátor, vagy ha a bejegyzést csak WordPress-szerepkör korlátozza. A taxonómiákra az `rcp_user_can_access_term()` való.

- `$user_id` (egész): a felhasználó azonosítója. Alapérték: `0`, vagyis a bejelentkezett felhasználó.
- `$post_id` (egész): a bejegyzés azonosítója. Alapérték: `0`, ilyenkor a ciklus globális `$post` bejegyzését használja. Ha nem állapítható meg bejegyzés, a függvény `true`-t ad.

Visszatérési érték (logikai): `true`, ha a felhasználó hozzáfér a tartalomhoz, különben `false`.

```php
// Az aktuális felhasználó és az aktuális bejegyzés.
if ( rcp_user_can_access( get_current_user_id(), get_the_ID() ) ) {
	// Korlátozott tartalom megjelenítése.
} else {
	// Korlátozási üzenet vagy átirányítás.
}

// Meghatározott felhasználó és bejegyzés.
if ( rcp_user_can_access( 42, 100 ) ) {
	// A 42-es felhasználó eléri a 100-as bejegyzést.
}

// A ciklusban a $post_id elhagyható.
if ( rcp_user_can_access() ) {
	the_content();
}
```

## rcp_user_can_access_term()

Megmondja, hogy egy felhasználó megfelel-e egy taxonómiakifejezés (kategória, címke vagy más regisztrált taxonómia) korlátozásainak. A szabályokat az `rcp_get_term_restrictions()` függvénnyel olvassa. Az adminisztrátorok (`manage_options` jogosultság) mindig hozzáférnek, a korlátozás nélküli kifejezés pedig mindenkinek `true`.

- `$user_id` (egész): az ellenőrzött felhasználó azonosítója.
- `$term_id` (egész): az ellenőrzött kifejezés azonosítója.

Visszatérési érték (logikai): `true`, ha a felhasználó elérheti a kifejezéshez kötött tartalmat, vagy a kifejezés nem korlátozott. `false`, ha nem felel meg a „csak fizetős”, a hozzáférési szint vagy a tagsági szint követelményének, vagy ha korlátozás van, de nincs ügyfélrekordja.

```php
$term_id = get_queried_object_id();
if ( rcp_user_can_access_term( get_current_user_id(), $term_id ) ) {
	// A felhasználó megnézheti ezt a kategóriaarchívumot.
}
```

Egy-egy bejegyzés ellenőrzéséhez az `rcp_user_can_access()` való.

## rcp_user_has_access()

Azt nézi, hogy a felhasználó aktív tagságai közül legalább az egyik a megadott vagy annál magasabb hozzáférési szintet ad-e. Az `RCP_Customer::has_access_level()` metódust használja.

Ne keverd össze az `rcp_user_can_access()` függvénnyel: az egy konkrét bejegyzés megtekinthetőségét vizsgálja, ez pedig csak a hozzáférési szintet. Tartalomkorlátozáshoz a bejegyzés szintű függvényt használd.

- `$user_id` (egész): a felhasználó azonosítója. Alapérték: `0`, vagyis a bejelentkezett felhasználó.
- `$access_level_needed` (egész): a szükséges hozzáférési szint, `0` és `10` között. Alapérték: `0`.

Visszatérési érték (logikai): `true`, ha az ügyfélnek van legalább egy megfelelő szintű tagsága. `false`, ha nincs ügyfélrekord, vagy egyik tagság sem éri el a szintet. A `0` szint teljesítettnek számít, ezért `true`-t ad akkor is, ha az ügyfélnek nincs tagsága.

```php
if ( rcp_user_has_access( get_current_user_id(), 5 ) ) {
	// A felhasználó hozzáférési szintje legalább 5.
}

// A 0 szint a tagság nélküli felhasználóra is igaz.
if ( rcp_user_has_access( $user_id, 0 ) ) {
	// ...
}
```

## rcp_user_has_active_membership()

Megmondja, hogy a felhasználónak van-e legalább egy aktív tagsága, fizetős vagy ingyenes. Az ügyfélrekordból indul ki, az `active` és a `cancelled` állapotú tagságokat vizsgálja tovább, mindegyiket az `RCP_Membership::is_active()` metódussal. A lemondott tagság a lejárati dátumáig még aktívnak számít.

Összehasonlításul: az `rcp_user_has_paid_membership()` csak a fizetős vagy próbaidőszakos tagságot veszi figyelembe (ugyanígy az elavult `rcp_is_active()`).

- `$user_id` (egész): a felhasználó azonosítója. Alapérték: `0`, vagyis a bejelentkezett felhasználó.

Visszatérési érték (logikai): `true`, ha van legalább egy aktív tagság. `false`, ha nincs ügyfél, nincs megfelelő tagság, vagy a tagságok lejártak vagy függőben vannak.

```php
if ( rcp_user_has_active_membership() ) {
	// A bejelentkezett felhasználónak van aktív tagsága.
}

$user_id = 12;
if ( rcp_user_has_active_membership( $user_id ) ) {
	// A 12-es felhasználónak van aktív tagsága.
}
```

## rcp_user_has_paid_membership()

Megmondja, hogy a felhasználónak van-e legalább egy aktív, fizetős tagsága. Alapértelmezés szerint a próbaidőszakos tagság is fizetősnek számít. Az elavult `rcp_is_active()` belül ezt a függvényt hívja.

A függvény a felhasználóhoz tartozó ügyfél `RCP_Customer::has_paid_membership()` metódusát használja. A lemondott tagság is adhat `true` eredményt, ha a szint fizetős, és a tagság hozzáférési ideje még tart.

- `$user_id` (egész): az ellenőrzött felhasználó azonosítója. Alapérték: `0`, vagyis a bejelentkezett felhasználó.

Visszatérési érték (logikai): `true`, ha az ügyfélnek van legalább egy aktív fizetős tagsága (a próbaidőszak is fizetősnek számít). `false`, ha nincs ügyfél, csak ingyenes tagságai vannak, vagy egy fizetős sem aktív.

```php
if ( rcp_user_has_paid_membership( get_current_user_id() ) ) {
	// Fizetős vagy próbaidőszakos tag.
}

if ( ! rcp_user_has_paid_membership( $user_id ) && rcp_user_has_free_membership( $user_id ) ) {
	// Csak aktív ingyenes tag.
}
```

## rcp_user_has_expired_membership()

Megmondja, hogy az ügyfélnek van-e legalább egy `expired` (lejárt) állapotú tagságrekordja. Nem azonos az elavult `rcp_is_expired()` ellenőrzéssel: egy felhasználónak lehet egyszerre aktív és egy korábbi, lejárt tagsága is, és ilyenkor is `true` az eredmény.

- `$user_id` (egész): az ellenőrzött felhasználó azonosítója. Alapérték: `0`, vagyis a bejelentkezett felhasználó.

Visszatérési érték (logikai): `true`, ha van lejárt tagság. `false`, ha nincs ügyfél vagy nincs lejárt tagságrekord.

```php
if ( rcp_user_has_expired_membership( $user_id ) ) {
	// Az ügyfélnek legalább egy lejárt tagsága van.
}
```

Egy konkrét tagság ellenőrzéséhez töltsd be az `rcp_get_membership()` függvénnyel, és használd a `$membership->is_expired()` metódust.

## rcp_user_has_free_membership()

Megmondja, hogy az ügyfélnek van-e legalább egy ingyenes tagsága, amelynek az állapota `active`. A függvény az `active` állapotú tagságokat kérdezi le, és `true`-t ad, ha van köztük olyan, amelyik nem fizetős (az `RCP_Membership::is_paid()` hamis).

Nem azonos az `rcp_user_has_active_membership()` függvénnyel: egy lemondott, de még a hozzáférési időszakán belüli ingyenes tagság ott aktívnak számíthat, itt viszont nem.

- `$user_id` (egész): az ellenőrzött felhasználó azonosítója. Alapérték: `0`, vagyis a bejelentkezett felhasználó.

Visszatérési érték (logikai): `true`, ha van `active` állapotú ingyenes tagság. `false`, ha nincs ügyfél, nincs `active` tagság, vagy az összes `active` tagság fizetős.

```php
if ( rcp_user_has_free_membership() ) {
	// A bejelentkezett felhasználónak aktív, ingyenes tagsága van.
}

if ( rcp_user_has_active_membership( $user_id ) && ! rcp_user_has_paid_membership( $user_id ) ) {
	// Aktív tag, de nem fizetős szinten.
}

// Lehet igaz akkor is, ha az rcp_user_has_free_membership() hamis:
if ( rcp_user_has_active_membership( $user_id ) ) {
	// A felhasználó aktív, vagy lemondott, de még le nem járt tagság révén fér hozzá.
}
```

## rcp_is_trialing()

Megmondja, hogy a felhasználónak van-e legalább egy éppen próbaidőszakban lévő tagsága. Betölti a felhasználó ügyfélrekordját, és minden tagságot megvizsgál az `RCP_Membership::is_trialing()` metódussal.

- `$user_id` (egész): a felhasználó azonosítója. Alapérték: `0`, vagyis a bejelentkezett felhasználó.

Visszatérési érték (logikai): `true`, ha legalább egy tagság próbaidőszakban van. `false`, ha nincs ügyfél vagy nincs próbaidőszakos tagság.

```php
if ( rcp_is_trialing() ) {
	// A bejelentkezett felhasználó próbaidőszakban van.
}

$membership = rcp_get_membership( 456 );
if ( $membership && $membership->is_trialing() ) {
	// A 456-os tagság próbaidőszakban van.
}
```

## rcp_set_expiration_date()

Elavult (a bővítmény 3.0-s változata óta). Új lejárati dátumot állít be egy felhasználónak. Új kódban egy tagságrekordon az `RCP_Membership::set_expiration_date()` metódust használd; a lejárati dátum lekérdezéséhez az `rcp_get_expiration_date()` való.

- `$user_id` (egész, nem kötelező): a felhasználó azonosítója. A `0` a bejelentkezett felhasználót jelenti.
- `$new_date` (szöveg): az új lejárati dátum MySQL-formátumban, például `ÉÉÉÉ-HH-NN ÓÓ:PP:MM`.

Visszatérési érték (logikai): `true`, ha a dátum frissült, különben `false`.

## rcp_update_membership()

Frissít egy meglévő tagságrekordot az adatbázisban. Betölti a tagságot az `rcp_get_membership()` függvénnyel, és meghívja rajta az `RCP_Membership::update()` metódust. Ha már van `RCP_Membership` példányod, közvetlenül is hívhatod: `$membership->update( $data )`.

Ha a művelettől e-mail-küldést, átjáróbeli előfizetés-módosítást vagy a bővítmény saját eseményeit is várod, a nyers adatbázismezők átírása helyett használd az `RCP_Membership` megfelelő metódusát: `activate()`, `renew()`, `cancel()`, `expire()`, `set_expiration_date()`.

- `$membership_id` (egész): a frissítendő tagság azonosítója.
- `$data` (tömb): a módosítandó oszlopok, csak azokat add meg, amelyeket változtatni szeretnél. A támogatott kulcsok megegyeznek az `rcp_add_membership()` kulcsaival:
  - `customer_id`, `user_id`, `object_id`, `object_type`
  - `currency`, `initial_amount`, `recurring_amount`
  - `created_date`, `trial_end_date`, `renewed_date`, `cancellation_date`, `expiration_date`
  - `auto_renew`, `times_billed`, `maximum_renewals`, `status`
  - `gateway`, `gateway_customer_id`, `gateway_subscription_id`
  - `signup_method`, `subscription_key`, `notes`, `upgraded_from`, `disabled`

Tudnivalók:

- `expiration_date`: MySQL-dátum-idő szöveg, vagy `none` az örökös (nem lejáró) tagsághoz.
- `status`: `pending`, `active`, `cancelled` vagy `expired`. A régi `free` érték `active`-ra változik. Ha az `active` beállítás sikerül, a tagsági szint szerepkörét is hozzárendeli a felhasználóhoz.
- `notes`: a tárolt megjegyzésmezőt írja felül. Ha meglévő szöveg megtartásával szeretnél hozzáfűzni, használd az `RCP_Membership::add_note()` metódust.
- Egyes mezők (például `status`, `expiration_date`, az átjáró azonosítói) változásakor a bővítmény automatikus adminisztrátori megjegyzést is fűz a tagsághoz.

Visszatérési érték (logikai): `true`, ha a frissítés sikerült, `false`, ha érvénytelen a tagság azonosítója vagy adatbázishiba történt.

Lejárat meghosszabbítása a 123-as tagságon:

```php
$updated = rcp_update_membership( 123, array(
	'expiration_date' => '2026-12-31 23:59:59',
) );
```

Átjáróazonosítók mentése sikeres fizetés után:

```php
rcp_update_membership( 123, array(
	'gateway'                 => 'stripe',
	'gateway_customer_id'     => 'cus_abc123',
	'gateway_subscription_id' => 'sub_xyz789',
	'auto_renew'              => true,
) );
```

Állapot aktívra állítása (például kézi fizetés után). Első aktiváláskor, üdvözlő e-mail küldéséhez inkább a tagság `activate()` metódusát használd:

```php
$membership = rcp_get_membership( 123 );

if ( $membership ) {
	rcp_update_membership( 123, array(
		'status' => 'active',
	) );
}
```

Lemondáshoz, lemondási e-mail és események kiváltásával, a `$membership->cancel()` metódust használd, ne csak a `status` értékét írd át `cancelled`-re.

## rcp_update_discount()

Frissít egy meglévő kedvezménykódot az azonosítója alapján. Csak azokat a mezőket add meg, amelyeket módosítani akarsz. Ha a `code` mezőt frissíted, a kód kisbetűsen tárolódik. A `membership_level_ids` mentés előtt szerializálódik.

Események: az `rcp_pre_edit_discount` a mentés előtt, az `rcp_edit_discount` a frissítés után fut le.

- `$discount_id` (egész): a kedvezmény azonosítója.
- `$args` (tömb): a módosítandó mezők, ugyanazok a kulcsok, mint az `rcp_add_discount()` függvénynél; részleges frissítés is rendben van.

Visszatérési érték: `true` siker esetén, `WP_Error` érvénytelen azonosító, érvénytelen összeg vagy sikertelen frissítés esetén.

```php
$result = rcp_update_discount(
	$discount_id,
	array(
		'status'   => 'active',
		'max_uses' => 100,
	)
);

if ( is_wp_error( $result ) ) {
	// Hiba kezelése.
}
```
