# Kódpéldák: tagságtábla, e-mail címke, pénznem, tagságok lekérése

> Rövid PHP-példák: új oszlop a tagságok táblájában, egyéni e-mail címke, új pénznem, tagságok lekérdezése és a szintmeta API.

Ez a fejezet egyéni kódot mutat be. Az ilyen kód a saját felelősséged: a példák kiindulópontnak szólnak, ha elakadsz, kérj fejlesztő segítséget. A kódot érdemes egy saját bővítménybe vagy a gyermektéma `functions.php` fájljába tenni.

## Új oszlop a tagságok táblájában

Ha saját tagságmetát használsz (például „company”), megjelenítheted egy külön oszlopban a **Memberships** táblázatban. Két lépés kell: az oszlop regisztrálása, majd az értékek kiírása.

### 1. Az oszlop regisztrálása

Az `rcp_memberships_list_table_columns` szűrővel add hozzá az oszlopot. Ez még csak a fejlécet hozza létre, értékek nélkül.

```php
function ag_rcp_memberships_list_table_columns( $columns ) {
	$key  = 'company';              // Kisbetűs, szóköz nélküli egyedi azonosító.
	$name = __( 'Company', 'rcp' ); // A fejlécben megjelenő felirat, lehet benne szóköz.

	$columns[ $key ] = $name;

	return $columns;
}
add_filter( 'rcp_memberships_list_table_columns', 'ag_rcp_memberships_list_table_columns' );
```

### 2. Az értékek kiírása

Az `rcp_memberships_list_table_column_{oszlopkulcs}` szűrő adja meg, mi jelenjen meg az oszlopban. A `{oszlopkulcs}` helyére az 1. lépésben választott kulcs kerül. Itt a kulcs `company`, ezért a szűrő neve `rcp_memberships_list_table_column_company`.

```php
function ag_rcp_memberships_list_table_column_company( $value, $membership ) {
	$company = rcp_get_membership_meta( $membership->get_id(), 'company', true );

	return $company;
}
add_filter( 'rcp_memberships_list_table_column_company', 'ag_rcp_memberships_list_table_column_company', 10, 2 );
```

A függvény a tagságmeta API-val olvassa ki az értéket. Cseréld arra, amit meg akarsz jeleníteni.

### Alapértelmezett oszlop eltávolítása

Ugyanezzel a szűrővel oszlopot el is tüntethetsz. Az alapértelmezett oszlopok kulcsai:

| Kulcs | Oszlop |
| --- | --- |
| `customer` | Az ügyfél |
| `object_id` | A tagsági szint neve |
| `status` | Az állapot |
| `auto_renew` | Az ismétlődés |
| `created_date` | A létrehozás dátuma |
| `expiration_date` | A lejárat dátuma |

Például a létrehozás dátumának oszlopát így távolíthatod el:

```php
function ag_rcp_memberships_list_remove_column( $columns ) {
	$key_to_remove = 'created_date'; // Ide a törölni kívánt oszlop kulcsa kerül.

	if ( array_key_exists( $key_to_remove, $columns ) ) {
		unset( $columns[ $key_to_remove ] );
	}

	return $columns;
}
add_filter( 'rcp_memberships_list_table_columns', 'ag_rcp_memberships_list_remove_column' );
```

## Új e-mail sablon címke

Az e-mailek szövegébe a sablon címkékkel (például `%username%`) szúrhatsz be dinamikus adatot. A beépített címkék listáját az e-mail beállítások oldalán találod. Saját címkét két lépésben vehetsz fel: regisztrálod, majd megírod a függvényt, amely az értéket adja.

### A címke regisztrálása

Az `rcp_email_template_tags` szűrővel add hozzá:

```php
function ag_rcp_email_template_tags( $email_tags ) {
	$email_tags[] = array(
		'tag'         => 'my_custom_tag',
		'description' => __( 'Description of my custom tag.' ),
		'function'    => 'ag_rcp_my_custom_tag_callback_function',
	);

	return $email_tags;
}
add_filter( 'rcp_email_template_tags', 'ag_rcp_email_template_tags' );
```

A tömb három értéke:

| Kulcs | Jelentése |
| --- | --- |
| `tag` | A címke neve a `%` jelek nélkül. A fenti példa címkéjét az e-mailben `%my_custom_tag%` alakban használod. |
| `description` | Rövid leírás, ez jelenik meg a címkék listájában a beállítások oldalon. |
| `function` | Annak a függvénynek a neve, amely az értéket szolgáltatja. |

A regisztrálás után a címke megjelenik a **Restrict → Settings → Emails** oldal címkelistájában.

![Az e-mail beállítások oldala, ahol az elérhető sablon címkék listája látható](./kepek/beallitasok-1-emailek.webp)

*Az e-mail beállítások oldala, ahol az elérhető sablon címkék listája látható* (https://minta-bolt.hu/wp-admin/admin.php?page=rcp-settings)

A kép az e-mail beállítások fülét mutatja, a sablon címkék listájával: ide kerül az újonnan regisztrált címke is.

### A visszahívó függvény

A függvény három paramétert kap:

- `$user_id`: az e-mailt kapó felhasználó azonosítója,
- `$payment_id`: a felhasználó legutóbbi fizetésének azonosítója,
- `$tag`: a címke neve.

Például egy felhasználói metaadat visszaadása:

```php
function ag_rcp_my_custom_tag_callback_function( $user_id = 0, $payment_id = 0, $tag = '' ) {
	$my_user_meta = get_user_meta( $user_id, 'my_custom_user_meta', true );

	return $my_user_meta;
}
```

A függvény neve egyezzen a `function` értékkel a regisztrációs tömbben.

## Új pénznem felvétele

A bővítmény a legtöbb nagy pénznemet ismeri. Ha a tiéd hiányzik, PHP-kóddal felveheted.

1. Az `rcp_currencies` szűrővel add hozzá a pénznemet. Ettől megjelenik a **Restrict → Settings → Payments** oldal pénznem-legördülőjében, és ennyi elég is a működéshez.

   ```php
   function pw_rcp_custom_currency( $currencies ) {
   	$currencies['MRO'] = 'Ouguiya (UM)';

   	return $currencies;
   }
   add_filter( 'rcp_currencies', 'pw_rcp_custom_currency' );
   ```

2. Opcionális: add meg a pénznem jelét. Ha kihagyod, a bővítmény a pénznem kódját írja az ár elé vagy mögé. A jel helyét a **Currency Position** beállítás határozza meg, ezért két szűrő létezik: `rcp_{pénznemkód}_currency_filter_before` (az ár előtt) és `rcp_{pénznemkód}_currency_filter_after` (az ár után). A pénznemkódot kisbetűvel írd.

   ```php
   function ag_rcp_mro_currency_filter_after( $formatted_price, $currency_code, $price ) {
   	return $price . ' ' . 'UM';
   }
   add_filter( 'rcp_mro_currency_filter_after', 'ag_rcp_mro_currency_filter_after', 10, 3 );
   ```

   Ez az árat „10 UM” alakban jeleníti meg.

![A fizetési beállítások oldala, a pénznem legördülő listával](./kepek/beallitasok-2-fizetesek.webp)

*A fizetési beállítások oldala, a pénznem legördülő listával* (https://minta-bolt.hu/wp-admin/admin.php?page=rcp-settings)

A képen a **Payments** fül látható: a felvett pénznem a pénznem legördülőjében jelenik meg.

A kódot egy saját, egyszerű bővítménybe tedd, ne a témába, hogy téma váltásakor ne vesszen el.

## Egy felhasználó tagságainak lekérése

Három fogalom kapcsolódik egymáshoz:

1. **A felhasználói fiók** (`WP_User`): ezzel jelentkezik be valaki az oldalra.
2. **Az ügyfélrekord** (`RCP_Customer`): a felhasználó jelenlétét rögzíti a bővítményben. Ha valaki még soha nem vásárolt tagságot, nincs ügyfélrekordja. A felhasználói azonosító köti a fiókhoz.
3. **A tagságrekord** (`RCP_Membership`): magát a tagságot írja le, az ügyfélazonosítóval kapcsolódik az ügyfélhez. Jelenleg egy ügyfélnek legfeljebb egy tagsága lehet, de a jövőben több is lehet, ezért a kódot úgy írd meg, hogy tömbként kezeld.

Így jutsz el a felhasználói azonosítótól a tagságobjektumig:

```php
$user_id = 123; // A felhasználó azonosítója.

// Az ügyfélrekord lekérése a felhasználói azonosító alapján.
$customer = rcp_get_customer_by_user_id( $user_id );

// Ha nincs ügyfélrekord, nincs tagság sem.
if ( empty( $customer ) ) {
	return;
}

// Az ügyfél tagságai (tömb).
$memberships = $customer->get_memberships();

foreach ( $memberships as $membership ) {
	// $membership egy RCP_Membership objektum.
	$status              = $membership->get_status();
	$membership_level_id = $membership->get_object_id();
}
```

## Tagsági szint metaadatai

A tagsági szintekhez is tárolhatsz saját metaadatot. Az API a szokásos WordPress-metaadat-függvényekhez hasonlóan működik, a `$rcp_levels_db` globális objektumon keresztül:

```php
global $rcp_levels_db;

// Metaadat hozzáadása
$rcp_levels_db->add_meta( $level_id = 0, $key = '', $value = '', $unique = true );

// Metaadat frissítése
$rcp_levels_db->update_meta( $level_id = 0, $key = '', $value = '', $previous_value = '' );

// Metaadat lekérése
$rcp_levels_db->get_meta( $level_id = 0, $key = '', $single = true );

// Metaadat törlése
$rcp_levels_db->delete_meta( $level_id = 0, $key = '', $value = '' );
```

Ugyanezt a négy műveletet segédfüggvényekkel is elvégezheted:

```php
rcp_add_membership_level_meta( $level_id, $meta_key, $meta_value, $unique = false );
rcp_update_membership_level_meta( $level_id, $meta_key, $meta_value, $prev_value = '' );
rcp_get_membership_level_meta( $level_id, $key = '', $single = false );
rcp_delete_membership_level_meta( $level_id, $meta_key, $meta_value = '' );
```

## Fizetések metaadatai

A fizetési rekordokhoz is társíthatsz saját metaadatot, így az adat közvetlenül ahhoz a fizetéshez tartozik. A fizetési metaadat API a szokásos WordPress-metaadat-függvényekhez szinte teljesen hasonlóan működik, a `$rcp_payments_db` globális objektumon keresztül:

```php
global $rcp_payments_db;

// Metaadat hozzáadása
$rcp_payments_db->add_meta( $payment_id = 0, $key = '', $value = '', $unique = true );

// Metaadat frissítése
$rcp_payments_db->update_meta( $payment_id = 0, $key = '', $value = '', $previous_value = '' );

// Metaadat lekérése
$rcp_payments_db->get_meta( $payment_id = 0, $key = '', $single = true );

// Metaadat törlése
$rcp_payments_db->delete_meta( $payment_id = 0, $key = '', $value = '' );
```

Az első paraméter a fizetés azonosítója. A példák útmutatásnak szólnak: egyéni fejlesztésről van szó, a hibakeresés és az átalakítás a te feladatod.

## Az Ultimate Member előfizetés fülének átalakítása

Ha az Ultimate Member integrációt használod, a profil **subscription** fülének tartalmát lecserélheted. Először el kell távolítani az alapértelmezett kimenetet, utána a szűrővel újra felépíthető a fül.

```php
/**
 * Az alapértelmezett előfizetés-fül kimenetének eltávolítása.
 */
add_action( 'wp_loaded', function () {
	if ( ! class_exists( 'RCP_UMUltimateMember2' ) ) {
		return;
	}

	remove_action(
		'um_account_content_hook_subscription',
		array( RCP_UMUltimateMember2::get_instance(), 'account_page' )
	);
} );

/**
 * A fül újraépítése módosított tartalommal.
 *
 * Az Ultimate Member ezt a hookot szűrőként futtatja: HTML-szöveget kell visszaadni.
 * A profil tulajdonosának aktív tagságrekordja kell hozzá.
 */
add_filter( 'um_account_content_hook_subscription', function ( $output, $shortcode_args = array() ) {
	$user_id = function_exists( 'um_profile_id' ) ? um_profile_id() : get_current_user_id();

	if ( ! $user_id || ! function_exists( 'rcp_get_customer_by_user_id' ) ) {
		return $output;
	}

	$customer   = rcp_get_customer_by_user_id( $user_id );
	$membership = $customer ? $customer->get_pending_membership() : false;

	if ( ! $membership ) {
		$memberships = $customer ? $customer->get_memberships() : array();
		$membership  = ! empty( $memberships ) ? reset( $memberships ) : false;
	}

	$level_name = $membership ? $membership->get_membership_level_name() : __( 'None', 'rcp' );
	$status     = $membership ? $membership->get_status() : '';
	$expiration = $membership ? $membership->get_expiration_date() : '';

	ob_start();
	?>
	<div class="um-field um-field-subscription">
		<div class="um-field-label"><label><?php esc_html_e( 'Membership', 'rcp' ); ?></label></div>
		<div class="um-field-area"><?php echo esc_html( $level_name ); ?></div>
	</div>
	<div class="um-field um-field-subscription-status">
		<div class="um-field-label"><label><?php esc_html_e( 'Status', 'rcp' ); ?></label></div>
		<div class="um-field-area"><?php echo esc_html( $status ); ?></div>
	</div>
	<div class="um-field um-field-subscription-expiration">
		<div class="um-field-label"><label><?php esc_html_e( 'Expiration', 'rcp' ); ?></label></div>
		<div class="um-field-area"><?php echo esc_html( $expiration ); ?></div>
	</div>
	<?php

	return $output . ob_get_clean();
}, 10, 2 );
```
