# Mezők és csoportok programozott hozzáadása

> A mezők adatainak módosítása megjelenítés előtt a pewc_filter_item_start_list szűrővel, és csoportok hozzáadása a pewc_filter_product_extra_groups szűrővel, négy példával.

Két szűrővel lehet futás közben, kóddal alakítani azt, ami a termékoldalon megjelenik: a `pewc_filter_item_start_list` egy mező adatait módosítja a kirajzolás előtt, a `pewc_filter_product_extra_groups` a termék csoportjait bővíti. A kódot a sablon `functions.php` fájljába vagy egy saját bővítménybe tedd.

## A `pewc_filter_item_start_list` szűrő

Minden mezőnél lefut, mielőtt a mező megjelenik. Prioritása 10, négy paramétert kap:

| Paraméter | Jelentése |
|---|---|
| `$item` | A mező adatai tömbként: a választható elemek, a típus és a többi beállítás |
| `$group` | A csoport, amelyhez a mező tartozik |
| `$group_id` | A csoport azonosítója |
| `$post_id` | A megjelenített termék azonosítója |

A `$item` tömb leggyakoribb kulcsai:

| Kulcs | Tartalma |
|---|---|
| `field_id` | A mező azonosítója; ezzel célozhatsz egy adott mezőt |
| `field_type` | A mező típusa, például `products` |
| `field_options` | A választható elemek tömbje; mindegyik elemnek van `image` (médiatár-azonosító vagy üres szöveg), `value` (felirat) és `price` (ár vagy üres szöveg) kulcsa |
| `child_products` | A termékek mezőnél a gyermektermékek azonosítóinak tömbje |

A szűrőnek mindig vissza kell adnia a (módosított) `$item` tömböt.

### 1. példa: országlista egyetlen elemből

Ha a választó mező első eleme a `countrylist` szöveg, a függvény lecseréli az összes elemet az országok listájára.

```php
add_filter( 'pewc_filter_item_start_list', 'themeslug_filter_item_start_list', 10, 4 );
function themeslug_filter_item_start_list( $item, $group, $group_id, $post_id ) {
	if ( isset( $item['field_options'][0]['value'] ) && 'countrylist' === $item['field_options'][0]['value'] ) {
		$countries = WC()->countries->get_countries();
		$options   = array();
		foreach ( $countries as $country ) {
			$options[] = array( 'image' => '', 'value' => $country, 'price' => '' );
		}
		$item['field_options'] = $options;
	}
	return $item;
}
```

### 2. példa: számsor a választó mezőben

Az első elem értékébe `kezdet||vég||lépés||kihagyások` formában írhatsz mintát, a függvény ebből generálja az elemeket. Például az `1||10||1||2,5` az 1, 3, 4, 6, 7, 8, 9, 10 számokat adja (a 2 és az 5 kimarad). Minden elem értéke és ára is a szám.

```php
add_filter( 'pewc_filter_item_start_list', 'demo_dynamic_select_field', 10, 4 );
function demo_dynamic_select_field( $item, $group, $group_id, $post_id ) {
	if ( empty( $item['field_options'][0]['value'] ) || false === strpos( $item['field_options'][0]['value'], '||' ) ) {
		return $item;
	}
	$parts = explode( '||', $item['field_options'][0]['value'] );
	if ( count( $parts ) < 3 ) {
		return $item;
	}
	$start   = (float) $parts[0];
	$end     = (float) $parts[1];
	$step    = (float) $parts[2] ?: 1;
	$exclude = isset( $parts[3] ) ? array_map( 'floatval', explode( ',', $parts[3] ) ) : array();
	$options = array();
	for ( $n = $start; $n <= $end; $n += $step ) {
		if ( in_array( $n, $exclude, true ) ) {
			continue;
		}
		$options[] = array( 'image' => '', 'value' => $n, 'price' => $n );
	}
	$item['field_options'] = $options;
	return $item;
}
```

### 3. példa: képminták a médiatárból

A képmintás mezőnél a `field_options` elemeinek `image` kulcsa médiatár-azonosítót vár. Ha csak képcímeid vannak, az `attachment_url_to_postid()` azonosítóvá alakítja őket, a `wc_get_filename_from_url()` pedig a fájlnévből felirat lesz. A példában szereplő mezőazonosítót (978) és a címeket cseréld a sajátjaidra.

```php
add_filter( 'pewc_filter_item_start_list', 'demo_filter_item_start_list', 10, 4 );
function demo_filter_item_start_list( $item, $group, $group_id, $post_id ) {
	if ( 978 !== (int) $item['field_id'] ) {
		return $item;
	}
	$urls    = array(
		'https://pelda.hu/wp-content/uploads/minta-1.jpg',
		'https://pelda.hu/wp-content/uploads/minta-2.jpg',
	);
	$options = array();
	foreach ( $urls as $url ) {
		$options[] = array(
			'image' => attachment_url_to_postid( $url ),
			'value' => wc_get_filename_from_url( $url ),
			'price' => '',
		);
	}
	$item['field_options'] = $options;
	return $item;
}
```

### 4. példa: gyermektermékek cikkszám alapján, ACF-mezőből

A **Termékek** mező `child_products` tömbje termékazonosítókat vár. Ha a termék egyik ACF-mezőjében vesszővel elválasztott cikkszámok vannak (a példában a mező neve `child_product_skus`), a `wc_get_product_id_by_sku()` azonosítóvá alakítja őket.

```php
add_filter( 'pewc_filter_item_start_list', 'prefix_populate_products_through_ACF', 10, 4 );
function prefix_populate_products_through_ACF( $item, $group, $group_id, $post_id ) {
	if ( 'products' !== $item['field_type'] ) {
		return $item;
	}
	$skus = get_field( 'child_product_skus', $post_id );
	if ( ! $skus ) {
		return $item;
	}
	$ids = array();
	foreach ( explode( ',', $skus ) as $sku ) {
		$id = wc_get_product_id_by_sku( trim( $sku ) );
		if ( $id ) {
			$ids[] = $id;
		}
	}
	$item['child_products'] = $ids;
	return $item;
}
```

## A `pewc_filter_product_extra_groups` szűrő

Két paramétert kap (`$groups`, `$product_id`), prioritása 10. A csoportok a csoportazonosító szerint vannak kulcsolva, és mindegyiknek van egy `items` kulcsa, a mezőkkel. A `pewc_get_group_fields( $group_id )` függvény egy csoport mezőit adja vissza.

### Példa: globális csoport hozzáadása az ACF-mezős termékekhez

A következő kód a 72-es azonosítójú (példa) globális csoportot hozzáadja azokhoz a termékekhez, amelyeken ki van töltve a `child_product_skus` ACF-mező. A csoportazonosítót cseréld a sajátodra.

```php
add_filter( 'pewc_filter_product_extra_groups', 'prefix_filter_groups_by_ACF', 10, 2 );
function prefix_filter_groups_by_ACF( $groups, $product_id ) {
	if ( get_field( 'child_product_skus', $product_id ) ) {
		$groups[72] = array( 'items' => pewc_get_group_fields( 72 ) );
	}
	return $groups;
}
```

A mezők és csoportok létrehozására, módosítására külső rendszerből a [REST API](https://hub.hellowp.io/hu/plugins/product-extras-for-woocommerce/fejlesztok-rest-api/) is használható, a többi hook listáját pedig a [Hookok és szűrők](https://hub.hellowp.io/hu/plugins/product-extras-for-woocommerce/fejlesztok-hookok/) fejezet tartalmazza.
