# Akciók és szűrők: űrlap-hookok, lejárat, fizetés, pénznem

> Tizenkét akció és szűrő paraméterekkel és példákkal: az űrlapok előtti és utáni kimenet, az űrlap-ellenőrzés előtti hookok, a lejárati dátum, a szintváltás tiltása, új fizetés, pénznemjel.

Ez a fejezet az [első hookfejezet](https://hub.hellowp.io/hu/plugins/learndash-restrict-content-pro/fejlesztok-hookok-urlapok-szintek-kedvezmenyek/) 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_action( 'rcp_create_payment', 'fuggveny', 10, 2 )`.

## Bejelentkezési és jelszóűrlap

### `rcp_before_login_form`

Akció. Közvetlenül a szokásos bejelentkezési sablon (`login.php`) kiírása előtt fut le. Csak a normál bejelentkezési nézetnél indul el, az elfelejtett jelszó, az e-mail-ellenőrzés és a jelszó-visszaállítás nézeténél nem. Arra jó, hogy szöveget vagy egyéb tartalmat írj az űrlap fölé azokon az oldalakon, ahol a `[login_form]` rövidkód vagy a `rcp_login_form_fields()` függvényt hívó sablon van.

- Paraméter: nincs.

```php
function mytheme_rcp_before_login_form() {
	echo '<p>' . esc_html__( 'A tagok itt jelentkezhetnek be.', 'mytheme' ) . '</p>';
}
add_action( 'rcp_before_login_form', 'mytheme_rcp_before_login_form' );
```

Kapcsolódó: `rcp_after_login_form` (az űrlap után fut), `[login_form]` rövidkód.

### `rcp_before_password_form`

Akció. A jelszómódosító sablon (`change-password.php`) kiírása előtt fut le a `rcp_change_password_form()` függvényben. Ez az űrlap jelenik meg a jelszó-visszaállítás befejezésekor és a `[password_form]` rövidkódnál. Az elfelejtett jelszó kérésére szolgáló űrlapot nem érinti.

- Paraméter: nincs.

```php
function mytheme_rcp_before_password_form() {
	echo '<p>' . esc_html__( 'Válassz erős új jelszót.', 'mytheme' ) . '</p>';
}
add_action( 'rcp_before_password_form', 'mytheme_rcp_before_password_form' );
```

Kapcsolódó: `rcp_after_password_form`, `[password_form]` rövidkód.

### `rcp_before_password_form_errors`

Akció. A jelszómódosítás feldolgozásának elején fut le az `rcp_change_password()` függvényben: a nonce ellenőrzése után, de még azelőtt, hogy a bővítmény megnézné, üres-e vagy eltér-e a két jelszó. Korai ellenőrzésre való a jelszómódosító és jelszó-visszaállító űrlapon.

- Paraméter: `$posted_data` (tömb), a kérés nyers `$_POST` adata (benne `rcp_user_pass`, `rcp_user_pass_confirm`, `rcp_password_nonce` és a kapcsolódó mezők).

A példa elutasítja a 12 karakternél rövidebb jelszót:

```php
function mytheme_rcp_before_password_form_errors( $posted_data ) {
	if ( ! empty( $posted_data['rcp_user_pass'] ) && strlen( $posted_data['rcp_user_pass'] ) < 12 ) {
		rcp_errors()->add(
			'password_too_short',
			__( 'A jelszó legalább 12 karakter legyen.', 'mytheme' ),
			'password'
		);
	}
}
add_action( 'rcp_before_password_form_errors', 'mytheme_rcp_before_password_form_errors' );
```

Kapcsolódó: `rcp_password_form_errors`, `rcp_before_password_form`.

## Az ellenőrzés előtti hook

### `rcp_before_form_errors`

Akció. A bővítmény saját ellenőrzése előtt fut le, két helyen:

1. **Bejelentkezés** (`rcp_process_login()`): egy paramétert kap, a beküldött bejelentkezési adatot. A felhasználónév és jelszó ellenőrzése, valamint az `rcp_login_form_errors` előtt indul.
2. **Regisztráció** (`rcp_process_registration()`): két paramétert kap, a beküldött regisztrációs adatot és a bejelentkezett felhasználó `RCP_Customer` objektumát. Teljesen új feliratkozónál ez üres lehet. A tagsági szint és a fizetési átjáró ellenőrzése előtt fut.

A harmadik paramétert (`10, 2`) csak akkor add meg az `add_action` hívásnál, ha a regisztrációs változatra csatlakozol.

Paraméterek:

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$posted_data` | tömb | A bejelentkezési vagy regisztrációs kérés nyers `$_POST` adata. |
| `$customer` | `RCP_Customer` vagy `false` | Csak regisztrációnál: a bejelentkezett felhasználó ügyfélrekordja, ha van. |

```php
function mytheme_rcp_before_login_form_errors( $posted_data ) {
	// Bejelentkezés: a hibacsoport neve 'login'.
}
add_action( 'rcp_before_form_errors', 'mytheme_rcp_before_login_form_errors', 10, 1 );

function mytheme_rcp_before_register_form_errors( $posted_data, $customer ) {
	if ( empty( $_POST['rcp_company'] ) ) {
		rcp_errors()->add( 'missing_company', __( 'A cég neve kötelező.', 'mytheme' ), 'register' );
	}
}
add_action( 'rcp_before_form_errors', 'mytheme_rcp_before_register_form_errors', 10, 2 );
```

Kapcsolódó: `rcp_form_errors`, az egyedi regisztrációs mezők létrehozása.

## Regisztrációs űrlap

### `rcp_before_register_form`

Akció. Az `rcp_registration_form_fields()` függvényben fut le, közvetlenül azelőtt, hogy a bővítmény betöltené a regisztrációs sablont (`register.php`, `register-single.php` vagy a szintre szabott sablon). Az egész űrlap fölé tehetsz vele szöveget vagy értesítést; ez a `[register_form]` és a `[register_form_stripe]` rövidkód kimenetére is vonatkozik.

Paraméterek:

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$level_id` | egész vagy `null` | A tagsági szint azonosítója, ha az űrlap egyetlen szintre szól (egyszintes rövidkód). `null`, ha minden szint látszik. |
| `$atts` | tömb | A rövidkódnak átadott attribútumok. |

```php
function mytheme_rcp_before_register_form( $level_id, $atts ) {
	if ( $level_id ) {
		echo '<p>' . esc_html__( 'Egy konkrét tagsági szintre regisztrálsz.', 'mytheme' ) . '</p>';
	}
}
add_action( 'rcp_before_register_form', 'mytheme_rcp_before_register_form', 10, 2 );
```

Kapcsolódó: `rcp_after_register_form`, `rcp_before_register_form_fields`.

### `rcp_before_register_form_fields`

Akció. A regisztrációs űrlap sablonjában (`register-common.php`) fut le, az alapértelmezett felhasználónév-, e-mail-, név- és jelszómezők előtt. Csak akkor indul el, ha a látogató nincs bejelentkezve: a megújító vagy szintet váltó, bejelentkezett felhasználó nem látja ezt a blokkot.

A HTML-t az `<form>` belsejébe írja ki, így a mezők a regisztrációval együtt elküldődnek. A beküldött értékeket az `rcp_form_errors` akcióban ellenőrizd `'register'` hibacsoporttal. Ha az egész űrlap köré kell tartalom, használd az `rcp_before_register_form` vagy az `rcp_after_register_form` akciót.

- Paraméter: nincs.

```php
function mytheme_rcp_before_register_form_fields() {
	?>
	<p id="rcp_company_wrap">
		<label for="rcp_company"><?php esc_html_e( 'Cég', 'mytheme' ); ?></label>
		<input type="text" name="rcp_company" id="rcp_company" class="required" value="<?php echo isset( $_POST['rcp_company'] ) ? esc_attr( wp_unslash( $_POST['rcp_company'] ) ) : ''; ?>" />
	</p>
	<?php
}
add_action( 'rcp_before_register_form_fields', 'mytheme_rcp_before_register_form_fields' );
```

Az ellenőrzést és a mentést az egyedi regisztrációs mezők mintája szerint végezd el.

Kapcsolódó: `rcp_after_register_form_fields`, `rcp_after_password_registration_field`.

### `rcp_before_registration_submit_field`

Akció. További mezőket illeszthetsz vele a regisztrációs oldal elküldés gombja elé.

## Tagsági szintek és lejárat

### `rcp_calculate_membership_level_expiration`

Szűrő. A tagsági szint kiszámított lejárati dátumát módosítja. Csak az első feliratkozásnál és a szintváltásnál (upgrade) fut, a megújításnál nem.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$expiration_date` | szöveg | A számított dátum MySQL formátumban, vagy `none`, ha nincs lejárat. |
| `$membership_level` | objektum | A tagsági szint objektuma az adatbázisból. |
| `$set_trial` | logikai | Próbaidőszakot számol-e éppen a bővítmény. |

### `rcp_can_upgrade_subscription`

Szűrő. Azt dönti el, válthat-e a felhasználó magasabb szintre.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$can_upgrade` | logikai | `true`, ha válthat, `false`, ha nem. |
| `$user_id` | egész | Az ellenőrzött felhasználó azonosítója. |

A példa mindenkinek letiltja a szintváltást:

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

## Fizetés és pénznem

### `rcp_create_payment`

Akció. Akkor fut le, amikor egy új fizetés bekerül az adatbázisba.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$payment_id` | egész | Az új fizetés azonosítója. |
| `$args` | tömb | A fizetés létrehozásakor használt adatok (lent). |

A `$args` tömb elemei:

| Kulcs | Típus | Jelentés |
|---|---|---|
| `subscription` | szöveg | A hozzá tartozó tagsági szint neve. |
| `object_id` | egész | A hozzá tartozó objektum azonosítója (általában a tagsági szinté). |
| `object_type` | szöveg | Az objektum típusa (általában `subscription`, vagyis tagsági szint). |
| `date` | szöveg | A fizetés rögzítésének ideje MySQL formátumban. |
| `amount` | tizedes | A végső fizetett összeg. |
| `subtotal` | tizedes | A szint alapára a kedvezmények, jóváírások és díjak előtt. |
| `credits` | tizedes | A fizetésből levont, időarányos jóváírás. |
| `fees` | tizedes | A fizetéshez adott díjak. |
| `discount_amount` | tizedes | A kedvezménykóddal levont összeg. |
| `discount_code` | szöveg | A használt kedvezménykód. |
| `user_id` | egész | A felhasználó azonosítója. |
| `payment_type` | szöveg | A fizetés típusa (például „Credit Card One Time”). |
| `transaction_type` | szöveg | A tranzakció fajtája: `new`, `renewal`, `downgrade` vagy `upgrade`. |
| `subscription_key` | szöveg | A feliratkozás kulcsa. |
| `transaction_id` | szöveg | A tranzakció azonosítója a fizetési átjárónál. |
| `status` | szöveg | A fizetés állapota (például `complete`, `pending`). |
| `gateway` | szöveg | A használt fizetési átjáró azonosítója. |

A példa e-mailt küld az ügyfélnek, ha új, kézi (`manual`) fizetés jön létre:

```php
/**
 * E-mail az ügyfélnek új kézi fizetés létrehozásakor.
 */
function pelda_rcp_create_payment( $payment_id, $args ) {
	// Ha az átjáró nem a kézi fizetés, kilépünk.
	if ( 'manual' != $args['gateway'] ) {
		return;
	}

	$user_info = get_userdata( $args['user_id'] );

	// Ha nincs felhasználói adat, kilépünk.
	if ( ! $user_info ) {
		return;
	}

	$subject = __( 'A fizetésed függőben van', 'rcp' );
	$message = __( 'Szia %name%! A(z) %subscription_name% fizetésed még függőben van.', 'rcp' );

	$emails            = new RCP_Emails;
	$emails->member_id  = $args['user_id'];
	$emails->payment_id = $payment_id;

	$emails->send( $user_info->user_email, $subject, $message );
}
add_action( 'rcp_create_payment', 'pelda_rcp_create_payment', 10, 2 );
```

### `rcp_{pénznem}_symbol`

Szűrő. Egy pénznem jelét módosítja. A hook neve a pénznem kisbetűs kódját tartalmazza, például `rcp_usd_symbol`.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$symbol` | szöveg | A pénznem jele. |
| `$currency` | szöveg | A pénznem kódja nagybetűvel. |

A példa az USD jelét „$” helyett „USD”-re cseréli:

```php
function pelda_rcp_usd_symbol( $symbol, $currency ) {
	return 'USD';
}
add_filter( 'rcp_usd_symbol', 'pelda_rcp_usd_symbol', 10, 2 );
```

## Admin felület

### `rcp_discounts_below_table`

Akció. Az adminfelületen, a kedvezménykódok táblázata alá tehetsz vele tartalmat.
