# Akciók és szűrők: bejelentkezés, régi tag-szűrők, táblázat-hookok

> Tizenkét hook paraméterekkel és példákkal: a bejelentkezés ellenőrzése és átirányítása, a régi tagobjektum szűrői (hozzáférés, lejárat, megújítás, állapot, próbaidőszak, kártyafrissítés), a tagsági szintek és a tagok táblázatának bővítése.

Ez a fejezet a [harmadik hookfejezet](https://hub.hellowp.io/hu/plugins/learndash-restrict-content-pro/fejlesztok-hookok-email-szintvaltas-fizetes/) folytatása. 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. Ha a függvényednek több paramétert kell kapnia, a prioritás után add meg a paraméterek számát is, például `add_filter( 'rcp_member_can_access', 'fuggveny', 10, 4 )`.

## Bejelentkezés

### `rcp_login_form_errors`

Akció. A bejelentkezés feldolgozása közben fut le, a beépített felhasználónév- és jelszóellenőrzés után, a `wp_signon()` hívás előtt. Egyedi ellenőrzést és hibaüzenetet adhatsz vele a bejelentkezéshez.

Hibát az `rcp_errors()->add( $kod, $uzenet, 'login' )` hívással adhatsz hozzá. Ha a hook lefutása után van hiba, a bővítmény leáll, és nem próbálja meg a bejelentkeztetést.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$posted_data` | tömb | A bejelentkezési kérés nyers `$_POST` adata (például `rcp_user_login`, `rcp_user_pass`, `rcp_user_remember`). |

```php
function mytheme_rcp_login_form_errors( $posted_data ) {
	if ( empty( $posted_data['rcp_user_login'] ) ) {
		return;
	}

	$user = get_user_by( 'login', sanitize_user( wp_unslash( $posted_data['rcp_user_login'] ) ) );
	if ( $user && ! user_can( $user, 'read' ) ) {
		rcp_errors()->add(
			'login_not_allowed',
			__( 'A fiókoddal itt nem lehet bejelentkezni.', 'mytheme' ),
			'login'
		);
	}
}
add_action( 'rcp_login_form_errors', 'mytheme_rcp_login_form_errors' );
```

Kapcsolódó hook: `rcp_before_form_errors` (ugyanebben a bejelentkezési kezelőben korábban fut).

### `rcp_login_redirect_url`

Szűrő. A `[login_form]` rövidkóddal végzett sikeres bejelentkezés utáni átirányítás címét módosíthatod vele.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$redirect` | szöveg | Az átirányítás címe. |
| `$user` | `WP_User` | A bejelentkező felhasználó. |

## Régi tagobjektum szűrői

A következő szűrők az `RCP_Member` osztályhoz tartoznak. A 3.0-s verzió óta a tagság adatait az `RCP_Membership` osztály kezeli, ezért a legtöbb szűrő elavult, és megvan az új megfelelője. Új fejlesztésben az utódot használd.

| Szűrő | Állapot | Helyette |
|---|---|---|
| `rcp_member_calculated_expiration` | elavult | `rcp_membership_calculated_expiration_date` |
| `rcp_member_can_renew` | elavult | `rcp_membership_can_renew` |
| `rcp_member_get_status` | elavult | `rcp_membership_get_status` |
| `rcp_member_is_expired` | elavult | `rcp_membership_is_expired` vagy `rcp_user_has_expired_membership` |
| `rcp_member_post_renew` (akció) | elavult | `rcp_membership_post_renew` |
| `rcp_member_can_access` | nem elavultnak jelölt | |
| `rcp_member_has_trialed` | nem elavultnak jelölt | |
| `rcp_member_can_update_billing_card` | nem elavultnak jelölt | |

### `rcp_member_can_access`

Szűrő. Eldönti, hogy egy felhasználó láthat-e egy bejegyzést. Ha `false`-t ad vissza, a korlátozott tartalomról szóló üzenet jelenik meg a bejegyzés megnyitásakor.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$can_access` | logikai | `true`, ha hozzáfér, `false`, ha nem. |
| `$member_id` | egész | Az ellenőrzött felhasználó azonosítója. |
| `$post_id` | egész | Az ellenőrzött bejegyzés azonosítója. |
| `$member` | `RCP_Member` | A tagobjektum. |

A példa a `post` típusú bejegyzéseket csak a 2-es azonosítójú szint lejárat nélküli tagjainak engedi, az adminisztrátorok pedig mindig hozzáférnek:

```php
function pelda_rcp_member_can_access( $can_access, $member_id, $post_id, $member ) {
	if ( 'post' === get_post_type( $post_id ) ) {
		if ( 2 === (int) $member->get_subscription_id() && ! $member->is_expired() ) {
			$can_access = true;
		} else {
			$can_access = false;
		}

		if ( user_can( $member_id, 'manage_options' ) ) {
			$can_access = true;
		}
	}

	return $can_access;
}
add_filter( 'rcp_member_can_access', 'pelda_rcp_member_can_access', 10, 4 );
```

### `rcp_member_calculated_expiration`

Szűrő, elavult. Az `RCP_Member::calculate_expiration()` által számolt lejárati dátumot módosíthatod vele, általában közvetlenül a lejárat beállítása előtt. Jó például arra, hogy minden tagság a hónap utolsó napján járjon le, a feliratkozás napjától függetlenül.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$expiration` | szöveg | A számolt lejárat MySQL-formátumban (`Y-m-d 23:59:59`), vagy `none`, ha korlátlan. |
| `$user_id` | egész | Az a felhasználó, akinek a lejáratát számolják. |
| `$member` | `RCP_Member` | A tagobjektum. |

A példa a lejáratot a számolt dátum hónapjának utolsó napjára teszi. Ha valaki 2017. július 15-én egy hónapos előfizetést vesz, a számolt lejárat augusztus 15., ezzel augusztus 31. lesz. Ha az aktuális hónap végét szeretnéd, a `strtotime( $expiration )` helyett `current_time( 'timestamp' )` kell.

```php
function pelda_rcp_member_calculated_expiration( $expiration, $user_id, $member ) {
	if ( 'none' !== $expiration ) {
		$expiration = date( 'Y-m-t 23:59:59', strtotime( $expiration ) );
	}

	return $expiration;
}
add_filter( 'rcp_member_calculated_expiration', 'pelda_rcp_member_calculated_expiration', 10, 3 );
```

A számolt lejárat módosítása nem változtatja meg a fizetési átjárónál tárolt megújítási dátumot. Automatikus megújítással ezért csak akkor érdemes együtt használni, ha az átjáró API-hívását is módosítod.

### `rcp_member_can_renew`

Szűrő, elavult. Azt dönti el, hogy a tag megújíthatja-e az előfizetését. Alapesetben `false`, ha az előfizetés ingyenes, vagy ha a tagnak már van ismétlődő előfizetése aktív állapotban.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$can_renew` | logikai | Megújíthatja-e az előfizetését. |
| `$user_id` | egész | Az ellenőrzött felhasználó azonosítója. |

### `rcp_member_get_status`

Szűrő, elavult. Az `RCP_Member::get_status()` által visszaadott előfizetési állapotot módosíthatod vele.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$status` | szöveg | A tag aktuális állapota. |
| `$user_id` | egész | A felhasználó azonosítója. |
| `$member` | `RCP_Member` | A tagobjektum. |

### `rcp_member_is_expired`

Szűrő, elavult. Azt módosíthatod vele, hogy egy tag tagsága lejárt-e.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$is_expired` | logikai | Lejárt-e a tagság. |
| `$user_id` | egész | Az ellenőrzött felhasználó azonosítója. |
| `$member` | `RCP_Member` | A tagobjektum. |

A példa a lejárat időpontját két órával eltolja: a tag csak akkor számít lejártnak, ha a lejárati ideje több mint két órája elmúlt.

```php
function pelda_rcp_is_expired( $is_expired, $user_id, $member ) {
	if ( ! $is_expired ) {
		return $is_expired;
	}

	$expiration = $member->get_expiration_date( false, 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_member_is_expired', 'pelda_rcp_is_expired', 10, 3 );
```

### `rcp_member_post_renew`

Akció, elavult. Az automatikus előfizetés-megújítás feldolgozása után fut le.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$user_id` | egész | A megújított felhasználói fiók azonosítója. |
| `$expiration` | szöveg | Az új lejárati dátum MySQL-formátumban. |
| `$member` | `RCP_Member` | A tagobjektum. |

### `rcp_member_has_trialed`

Szűrő. Azt dönti el, hogy a tag korábban már igénybe vett-e próbaidőszakot. A bővítmény alapesetben felhasználónként egy próbaidőszakot enged, ezzel a szűrővel ez felülbírálható.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$has_trialed` | logikai | `true`, ha a tag már használt próbaidőszakot. |
| `$user_id` | egész | Az ellenőrzött felhasználó azonosítója. |

Ez a sor mindig `false`-t ad, így a felhasználó többször is feliratkozhat próbaidőszakra:

```php
add_filter( 'rcp_member_has_trialed', '__return_false' );
```

### `rcp_member_can_update_billing_card`

Szűrő. Azt dönti el, hogy a felhasználó frissítheti-e a számlázási kártyáját az `[rcp_update_card]` rövidkóddal. Alapesetben `true`, ha:

- a felhasználó Stripe-pal fizetett, és kitöltött a fizetési profil azonosítója (`cus_` kezdetű), vagy
- PayPal-lal fizetett, a fizetési profil azonosítója `I-` kezdetű, és a beállításokban megadtad a PayPal API-kulcsokat, vagy
- Authorize.net-tel fizetett, az azonosítója `anet_` kezdetű, és a beállításokban megadtad az Authorize.net API-kulcsokat.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$can_update_card` | logikai | Frissítheti-e a kártyaadatait. |
| `$user_id` | egész | Az ellenőrzött felhasználó azonosítója. |

## Táblázatok az adminfelületen

| Hook | Típus | Mire jó |
|---|---|---|
| `rcp_levels_page_table_header` | akció | Új fejlécoszlopot adhatsz a **Restrict → Membership Levels** oldal táblázatához. |
| `rcp_members_below_table` | akció | Tartalmat írhatsz a tagok táblázata alá az adminfelületen. |

Egyik hook sem kap paramétert. A szintek táblázatának új oszlopához a fejlécoszlop mellé a soronkénti és a láblécoszlop hookját is használd, ezek a [harmadik hookfejezetben](https://hub.hellowp.io/hu/plugins/learndash-restrict-content-pro/fejlesztok-hookok-email-szintvaltas-fizetes/) szerepelnek.

```php
function pelda_rcp_levels_page_table_header() {
	echo '<th>' . esc_html__( 'Megjegyzés', 'mytheme' ) . '</th>';
}
add_action( 'rcp_levels_page_table_header', 'pelda_rcp_levels_page_table_header' );

function pelda_rcp_members_below_table() {
	echo '<p>' . esc_html__( 'Ez a szöveg a tagok táblázata alatt jelenik meg.', 'mytheme' ) . '</p>';
}
add_action( 'rcp_members_below_table', 'pelda_rcp_members_below_table' );
```
