# Akciók és szűrők: tagság-szűrők, aktiválás, lemondás, tagok oszlopa

> Tíz hook paraméterekkel és példákkal: a tagság hozzáférése, lejárata, megújítása, lemondása, állapota, időarányos jóváírása, az átjáróbeli lemondás, az első aktiválás és a tagok oldalának régi oszlop-hookja.

Ez a fejezet az [előző hookfejezet](https://hub.hellowp.io/hu/plugins/learndash-restrict-content-pro/fejlesztok-hookok-bejelentkezes-es-tag-szurok/) folytatása: itt a tagságobjektum (`RCP_Membership`) szűrői szerepelnek, amelyek a régi, `rcp_member_` kezdetű szűrőket váltották fel. A hookok teljes listája az [Akciók és szűrők áttekintő listája](https://hub.hellowp.io/hu/plugins/learndash-restrict-content-pro/fejlesztok-altalanos-akciok-es-szurok-listaja/) fejezetben van. Az itt szereplő kód egyedi fejlesztés: a bővítmény támogatása nem terjed ki rá, bonyolultabb feladathoz érdemes fejlesztőt bevonni.

Az akciót `add_action`, a szűrőt `add_filter` hívással csatlakoztatod. Mivel ezek a hookok több paramétert adnak át, a prioritás után mindig add meg a paraméterek számát is, például `add_filter( 'rcp_membership_can_access', 'fuggveny', 10, 4 )`. A szűrőnek mindig vissza kell adnia az (esetleg módosított) első paramétert.

## Hozzáférés, lejárat, megújítás, lemondás

### `rcp_membership_can_access`

Szűrő. Azt dönti el, hogy egy adott tagság hozzáférést ad-e egy adott bejegyzéshez.

- `$can_access` (bool): megfelel-e a tagság a korlátozás feltételeinek.
- `$membership_id` (int): az ellenőrzött tagság azonosítója.
- `$post_id` (int): az ellenőrzött bejegyzés azonosítója.
- `$membership` (`RCP_Membership`): a tagságobjektum.

```php
function pelda_rcp_membership_can_access( $can_access, $membership_id, $post_id, $membership ) {
	// A 42-es azonosítójú oldalt minden tagság elérheti.
	if ( 42 === (int) $post_id ) {
		return true;
	}
	return $can_access;
}
add_filter( 'rcp_membership_can_access', 'pelda_rcp_membership_can_access', 10, 4 );
```

Kapcsolódó: a régi `rcp_member_can_access`.

### `rcp_membership_calculated_expiration_date`

Szűrő. A tagság kiszámított lejárati dátumát módosítja. A 3.0-s tagságrendszerben ez váltotta fel a `rcp_member_calculated_expiration` szűrőt. Fontos: az első regisztrációkor **nem** fut le, csak akkor, ha egy már létező tagságnál új lejáratot számol a bővítmény, például megújításkor.

- `$expiration` (string): a lejárat MySQL-formátumban (`Y-m-d 23:59:59`), vagy `none`, ha a tagság korlátlan.
- `$membership_id` (int): a tagság azonosítója.
- `$membership` (`RCP_Membership`): a tagságobjektum.

```php
function pelda_rcp_membership_calculated_expiration_date( $expiration, $membership_id, $membership ) {
	if ( 'none' === $expiration ) {
		return $expiration;
	}
	// Megújításkor 7 nap türelmi idő a számított lejárathoz.
	return gmdate( 'Y-m-d 23:59:59', strtotime( $expiration . ' +7 days' ) );
}
add_filter( 'rcp_membership_calculated_expiration_date', 'pelda_rcp_membership_calculated_expiration_date', 10, 3 );
```

### `rcp_membership_can_renew`

Szűrő. Azt dönti el, hogy a tagság megújítható-e. Alapesetben **hamis** az eredmény, ha:

- a tagság ingyenes,
- a tagság sosem jár le,
- a tagság részletfizetési tervhez tartozik, és a terv már befejeződött (elérte a legnagyobb számlázási számot),
- a tagság ismétlődő, és az állapota „aktív”.

Paraméterek: `$can_renew` (bool), `$membership_id` (int), `$membership` (`RCP_Membership`). Ez váltotta fel a `rcp_member_can_renew` szűrőt.

```php
function pelda_rcp_membership_can_renew( $can_renew, $membership_id, $membership ) {
	// Az 5-ös azonosítójú szintű tagság sosem újítható meg.
	if ( 5 === (int) $membership->get_object_id() ) {
		return false;
	}
	return $can_renew;
}
add_filter( 'rcp_membership_can_renew', 'pelda_rcp_membership_can_renew', 10, 3 );
```

### `rcp_membership_can_cancel`

Szűrő. Azt dönti el, hogy a tagság lemondható-e.

- `$can_cancel` (bool): igaz, ha lemondható.
- `$membership_id` (int): az ellenőrzött tagság azonosítója.
- `$membership` (`RCP_Membership`): a tagságobjektum.

```php
function pelda_rcp_membership_can_cancel( $can_cancel, $membership_id, $membership ) {
	// Az 5-ös azonosítójú szintű tagság nem mondható le az oldalról.
	if ( 5 === (int) $membership->get_object_id() ) {
		return false;
	}
	return $can_cancel;
}
add_filter( 'rcp_membership_can_cancel', 'pelda_rcp_membership_can_cancel', 10, 3 );
```

### `rcp_membership_payment_profile_cancelled`

Szűrő. Azt jelzi, hogy az átjáróbeli előfizetés lemondása sikerült-e. Harmadik fél által írt fizetési átjáró ezzel hajtja végre a lemondást: ha az átjáró azonosítója egyezik a sajátoddal, mondd le az előfizetést, és `true`-t adj vissza sikernél, `WP_Error` objektumot hibánál. Csak a saját átjáród lemondásait dolgozd fel.

- `$success` (true|`WP_Error`): sikerült-e a lemondás.
- `$gateway` (string): az átjáró azonosítója (slug).
- `$gateway_subscription_id` (string): az átjáróbeli előfizetés azonosítója, ezt kell lemondani.
- `$membership_id` (int): a lemondott tagság azonosítója.
- `$membership` (`RCP_Membership`): a tagságobjektum.

```php
function pelda_rcp_elements_cancel( $success, $gateway, $gateway_subscription_id, $membership_id, $membership ) {
	// Ha már lemondták, vagy nem a Stripe Elements átjáróról van szó, nem csinálunk semmit.
	if ( $success || 'stripe_elements' !== $gateway ) {
		return $success;
	}
	return rcp_stripe_cancel_membership( $gateway_subscription_id );
}
add_filter( 'rcp_membership_payment_profile_cancelled', 'pelda_rcp_elements_cancel', 10, 5 );
```

A hook nevét kettős l-lel (`cancelled`) kell írni.

## Állapot, jóváírás, aktiválás

### `rcp_membership_get_status`

Szűrő. A tagság állapotát módosítja, amikor azt az `RCP_Membership::get_status()` metódussal kéred le. A régi `rcp_member_get_status` szűrőt váltotta fel.

- `$status` (string): a tagság jelenlegi állapota.
- `$membership_id` (int): az ellenőrzött tagság azonosítója.
- `$membership` (`RCP_Membership`): a tagságobjektum.

```php
function pelda_rcp_membership_get_status( $status, $membership_id, $membership ) {
	// Naplózáshoz: kiírjuk, milyen állapotot kapott a kód.
	error_log( sprintf( 'Tagság %d állapota: %s', $membership_id, $status ) );
	return $status;
}
add_filter( 'rcp_membership_get_status', 'pelda_rcp_membership_get_status', 10, 3 );
```

### `rcp_membership_is_expired`

Szűrő. Azt dönti el, hogy a tagság lejárt-e. A régi `rcp_member_is_expired` utódja.

- `$is_expired` (bool): lejárt-e a tagság.
- `$membership_id` (int): az ellenőrzött tagság azonosítója.
- `$membership` (`RCP_Membership`): a tagságobjektum.

A példa két órával eltolja az összehasonlítást: a tagság a lejárat után még két óráig érvényesnek számít.

```php
function pelda_rcp_is_expired( $is_expired, $membership_id, $membership ) {
	// Ha még nem járt le, nincs teendő.
	if ( ! $is_expired ) {
		return $is_expired;
	}

	$expiration = $membership->get_expiration_date( false );

	if ( $expiration && strtotime( '-2 hours', current_time( 'timestamp' ) ) > strtotime( $expiration, current_time( 'timestamp' ) ) ) {
		$is_expired = true;
	} else {
		$is_expired = false;
	}

	return $is_expired;
}
add_filter( 'rcp_membership_is_expired', 'pelda_rcp_is_expired', 10, 3 );
```

### `rcp_membership_get_prorate_credit`

Szűrő. Azt az összeget módosítja, amelyet a tagság fel nem használt idejének értékeként jóváírsz, ha a tag másik szintre vált (feljebb vagy lejjebb). Ez a hátralévő idő értéke.

- `$credit_amount` (float): a másik tagságra felhasználható jóváírás összege.
- `$membership_id` (int): a tagság azonosítója.
- `$membership` (`RCP_Membership`): a tagságobjektum.

```php
function pelda_rcp_membership_get_prorate_credit( $credit_amount, $membership_id, $membership ) {
	// Legfeljebb 50 egységnyi jóváírás.
	return min( $credit_amount, 50 );
}
add_filter( 'rcp_membership_get_prorate_credit', 'pelda_rcp_membership_get_prorate_credit', 10, 3 );
```

### `rcp_membership_post_activate`

Akció. Akkor fut le, amikor a tagság először aktiválódik: vagyis a tagság létrejötte és az első fizetés beérkezése után. Megújításkor **nem** fut le (ahhoz a `rcp_membership_post_renew` való).

- `$membership_id` (int): a tagság azonosítója.
- `$membership` (`RCP_Membership`): a tagságobjektum.

```php
function pelda_rcp_membership_post_activate( $membership_id, $membership ) {
	// Például: naplóbejegyzés az első aktiváláskor.
	error_log( sprintf( 'A(z) %d azonosítójú tagság először aktiválódott.', $membership_id ) );
}
add_action( 'rcp_membership_post_activate', 'pelda_rcp_membership_post_activate', 10, 2 );
```

## Tagok oldala: régi oszlop-hook

### `rcp_members_page_table_column`

Akció, **elavult**. Egy új oszlop tartalmát írja ki a tagok oldalának táblázatába. Helyette használd a `rcp_memberships_list_table_column_{column}` hookot, ahol a `{column}` az oszlop azonosítója.

- `$user_id` (int): a megjelenített tag azonosítója.

```php
function pelda_rcp_members_page_table_column( $user_id ) {
	echo '<td>' . esc_html( get_user_meta( $user_id, 'telefonszam', true ) ) . '</td>';
}
add_action( 'rcp_members_page_table_column', 'pelda_rcp_members_page_table_column' );
```
