# Akciók és szűrők: admin felület, profil, tagsági szint, e-mail fejlécek

> Tizenkét hook paraméterekkel és példákkal: a kedvezménykódok táblázatának oszlopai, a kedvezmény, a tag, a tagság és a fizetés szerkesztőoldala, a profilűrlap hibái, a tagsági szint űrlapja, az e-mail fejlécek.

Ez a fejezet a [második hookfejezet](https://hub.hellowp.io/hu/plugins/learndash-restrict-content-pro/fejlesztok-hookok-urlapok-es-fizetes-2/) 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_edit_subscription_level', 'fuggveny', 10, 2 )`.

## Kedvezménykódok oldala

A **Restrict → Discount Codes** lista táblázatát három akcióval bővítheted új oszloppal.

| Hook | Mikor fut | Paraméter |
|---|---|---|
| `rcp_discounts_page_table_header` | Új fejlécoszlopot adhatsz a táblázathoz. | nincs |
| `rcp_discounts_page_table_footer` | Új láblécoszlopot adhatsz a táblázathoz. | nincs |
| `rcp_discounts_page_table_column` | Új oszlop tartalmát írhatod ki soronként. | `$discount_id`: a megjelenített kedvezmény azonosítója |

Az oszlop három hookját együtt használd: a fejlécben és a láblécben a címet, a soronkénti hookban az értéket írd ki, hogy a táblázat szerkezete egyben maradjon.

### `rcp_edit_discount`

Akció. Közvetlenül egy kedvezménykód szerkesztése után fut le.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$discount_id` | egész | A szerkesztett kedvezménykód azonosítója. |
| `$args` | tömb | A kedvezmény adatai: `name`, `description`, `amount`, `status`, `unit`, `code`, `expiration`, `max_uses`, `use_count`, `subscription_id`. |

## Tag, tagság és fizetés szerkesztése

### `rcp_edit_member`

Akció. Akkor fut le, amikor egy tagot az adminfelületen szerkesztenek. Egyedi mezők mentésére vagy tetszőleges kód lefuttatására jó.

- Paraméter: `$user_id` (egész), a szerkesztett felhasználó azonosítója.

```php
/**
 * A beküldött profiladatok mentése.
 */
function pw_rcp_save_user_fields_on_profile_save( $user_id ) {
	if ( ! empty( $_POST['rcp_profession'] ) ) {
		update_user_meta( $user_id, 'rcp_profession', sanitize_text_field( $_POST['rcp_profession'] ) );
	}

	if ( ! empty( $_POST['rcp_location'] ) ) {
		update_user_meta( $user_id, 'rcp_location', sanitize_text_field( $_POST['rcp_location'] ) );
	}
}
add_action( 'rcp_edit_member', 'pw_rcp_save_user_fields_on_profile_save', 10 );
```

### `rcp_edit_member_after`

Akció. Szöveget vagy HTML-t írhatsz vele az adminfelület ügyfélrészletek oldalára, az **IP-cím** mező után, a részlettáblázat belsejébe.

- Paraméter: `$user_id`, a szerkesztett felhasználó azonosítója. Figyelem: ez a WordPress-felhasználó azonosítója, nem az ügyfélé.

### `rcp_edit_membership_after`

Akció. A tagság részletei oldal táblázatának végén fut le. A **Restrict → Memberships** listában nyiss meg egy tagságot, ott jelenik meg. Mivel a táblázat végén fut, a kimenetet táblázatsorként (`<tr>`) írd ki.

- Paraméter: `$membership` (`RCP_Membership`), a tagság objektuma.

A példa egy „Cég” szövegmezőt ír ki a tagság `company` metaadatának értékével:

```php
/**
 * Cég mező a tagság részletei táblázatban.
 *
 * @param RCP_Membership $membership A tagság objektuma.
 */
function ag_rcp_edit_membership_after( $membership ) {
	$meta_value = rcp_get_membership_meta( $membership->get_id(), 'company', true );
	?>
	<tr>
		<th scope="row" class="row-title">
			<label for="rcp-company"><?php esc_html_e( 'Cég:', 'rcp' ); ?></label>
		</th>
		<td>
			<input type="text" name="rcp_company" id="rcp-company" value="<?php echo esc_attr( $meta_value ); ?>" />
		</td>
	</tr>
	<?php
}
add_action( 'rcp_edit_membership_after', 'ag_rcp_edit_membership_after' );
```

Ez a kód csak megjeleníti a mezőt. A mentéshez külön függvény kell, amelyet az `rcp_action_edit_membership` akcióra kell csatlakoztatni **9-es prioritással**, hogy még azelőtt fusson le, hogy a bővítmény feldolgozza az űrlapot és átirányít:

```php
/**
 * A Cég mező mentése a tagság részletei oldalról.
 */
function ag_rcp_save_custom_membership_field() {
	// Jogosultság-ellenőrzés, ne szerkeszd.
	if ( ! wp_verify_nonce( $_POST['rcp_edit_membership_nonce'], 'rcp_edit_membership' ) ) {
		wp_die( __( 'Nonce verification failed.', 'rcp' ), __( 'Error', 'rcp' ), array( 'response' => 403 ) );
	}

	if ( ! current_user_can( 'rcp_manage_members' ) ) {
		wp_die( __( 'You do not have permission to perform this action.', 'rcp' ), __( 'Error', 'rcp' ), array( 'response' => 403 ) );
	}

	// Melyik tagságot mentjük, ne szerkeszd.
	if ( empty( $_POST['membership_id'] ) ) {
		wp_die( __( 'Invalid membership ID.', 'rcp' ), __( 'Error', 'rcp' ), array( 'response' => 400 ) );
	}

	$membership_id = absint( $_POST['membership_id'] );
	$membership    = rcp_get_membership( $membership_id );

	if ( empty( $membership ) ) {
		wp_die( __( 'Invalid membership.', 'rcp' ), __( 'Error', 'rcp' ), array( 'response' => 400 ) );
	}

	// Az ellenőrzések után jöhet a saját érték mentése.
	if ( ! empty( $_POST['rcp_company'] ) ) {
		rcp_update_membership_meta( $membership->get_id(), 'company', sanitize_text_field( $_POST['rcp_company'] ) );
	} else {
		rcp_delete_membership_meta( $membership->get_id(), 'company' );
	}
}
add_action( 'rcp_action_edit_membership', 'ag_rcp_save_custom_membership_field', 9 );
```

A tagság metaadatairól a fejlesztői függvények fejezetei szólnak.

### `rcp_edit_payment_after`

Akció. Az adminfelület fizetésszerkesztő oldalán fut le, közvetlenül a táblázat lezárása előtt. Ide tehetsz saját sorokat vagy tartalmat.

## Profilűrlap hibái

### `rcp_edit_profile_form_errors`

Akció. Azután fut le, hogy a bővítmény megvizsgálta a profilszerkesztő űrlapot hibákra. Itt ellenőrizheted a saját mezőidet, és hibát adhatsz, ha nincsenek kitöltve.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$post` | tömb | Az űrlappal beküldött `$_POST` adat. |
| `$user_id` | egész | A profilját módosító felhasználó azonosítója. |

A példa hibát ad, ha az egyedi mező üres:

```php
function ag_rcp_edit_profile_form_errors( $post, $user_id ) {
	if ( empty( $post['my_custom_field'] ) ) {
		rcp_errors()->add( 'custom_field_empty', __( 'Az egyedi mezőt ki kell tölteni.', 'rcp' ) );
	}
}
add_action( 'rcp_edit_profile_form_errors', 'ag_rcp_edit_profile_form_errors', 10, 2 );
```

## Tagsági szint szerkesztése

### `rcp_edit_subscription_form`

Akció. A tagsági szint szerkesztő táblázatába illeszthetsz vele tartalmat: a **Restrict → Membership Levels** listában szerkessz egy szintet. Új mező hozzáadására való; a mentéshez az `rcp_edit_subscription_level` akciót használd.

- Paraméter: `$level` (`Membership_Level`), a szerkesztett tagsági szint objektuma.

A példa egy „Csoportos helyek” számmezőt ad az űrlaphoz, és kitölti a szinthez mentett értékkel:

```php
/**
 * Csoportos helyek mező a tagsági szint szerkesztő űrlapján.
 *
 * @param Membership_Level $level A szerkesztett tagsági szint.
 */
function rcpga_edit_groups_checkbox_subscription_form( $level ) {
	$level_id   = $level->get_id();
	$seat_count = empty( $level_id ) ? 0 : rcpga_get_level_group_seats_allowed( $level_id );
	?>
	<tr class="form-field">
		<th scope="row" valign="top">
			<label for="rcpga-group-seats"><?php esc_html_e( 'Csoportos helyek', 'rcp-group-accounts' ); ?></label>
		</th>
		<td>
			<input id="rcpga-group-seats" type="number" name="rcpga-group-seats" value="<?php echo absint( $seat_count ); ?>" min="0" style="width: 100px;" />
			<p class="description"><?php esc_html_e( 'A szinthez elérhető csoportos helyek száma a csoport tulajdonosával együtt.', 'rcp-group-accounts' ); ?></p>
		</td>
	</tr>
	<?php
}
add_action( 'rcp_edit_subscription_form', 'rcpga_edit_groups_checkbox_subscription_form' );
```

### `rcp_edit_subscription_level`

Akció. Közvetlenül egy tagsági szint szerkesztése után fut le. Az `rcp_edit_subscription_form` akcióval felvett egyedi mező mentésére való.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$level_id` | egész | A most szerkesztett szint azonosítója. |
| `$args` | tömb | A szint frissítésekor használt adatok. |

```php
/**
 * Egyedi mező mentése a tagsági szint szerkesztő űrlapjáról.
 *
 * @param int   $level_id A most szerkesztett szint azonosítója.
 * @param array $args     A frissítéskor használt adatok.
 */
function rcpga_save_groups_seats_subscription( $level_id, $args ) {
	if ( ! isset( $_POST['rcpga-group-seats'] ) ) {
		return;
	}

	// Itt mentsd el a saját értéket a $level_id szinthez.
}
add_action( 'rcp_edit_subscription_level', 'rcpga_save_groups_seats_subscription', 10, 2 );
```

A `2` az `add_action` hívásban kötelező, különben a függvény csak a `$level_id` paramétert kapja meg.

## E-mailek

### `rcp_email_headers`

Szűrő. Az `RCP_Emails` osztály e-mail fejléceit módosítja; a fejlécek ezután a `wp_mail()` függvénybe kerülnek.

| Paraméter | Típus | Jelentés |
|---|---|---|
| `$headers` | szöveg | Az e-mail fejlécei egyetlen szövegként. |
| `$rcp_email` | `RCP_Emails` | Az e-mailt küldő osztály példánya. |

A példa minden kimenő levélről másolatot küld a webhely adminisztrátorának:

```php
function ag_rcp_emails_headers( $headers, $rcp_email ) {
	$headers .= sprintf( 'BCC: %s', get_bloginfo( 'admin_email' ) ) . "\r\n";

	return $headers;
}
add_filter( 'rcp_email_headers', 'ag_rcp_emails_headers', 10, 2 );
```
