# Nemkívánatos e-mail-címek automatikus tiltása kóddal

> Kódrészlet, amely megjegyzi a spamvédelmen fennakadó e-mail-címeket, és a későbbi beküldéseknél elutasítja őket.

Ez az útmutató egy kódrészletet ad, amely megtanulja, eltárolja és blokkolja azokat az e-mail-címeket, amelyeket a spamvédelem elkap. A címeket egy WordPress-beállításban (opcióban) tárolja, a későbbi beküldéseket elutasítja, ha tartalmazzák ezeket az értékeket (teljes egyezés vagy részleges, például `@example.com`), és eltávolítja őket, ha egy beküldést később „Nem spam”-nek jelölsz.

## Mit csinál a kód

- Ha egy beküldés elbukik a mézesbödön (honeypot) ellenőrzésen, és az űrlap mentés nélkül megszakad, a címet megjegyzi.
- Ha egy beküldés spamként mentődik, a címét megjegyzi.
- Ha egy spam beküldést visszaállítasz aktívra, a címet elfelejti (csökkenti a számlálót).
- Az E-mail mező ellenőrzése a `gform_email_field_rejectable_values` szűrővel használja a tárolt értékeket, így a későbbi beküldések tiltottak lesznek.

## A kódrészlet

```php
define( 'GF_EFRJ_FILTER_OPTION', 'gform_email_field_rejectable_values' );

/**
 * A tárolt értékeket átadja a gform_email_field_rejectable_values szűrőnek,
 * így az E-mail mező a mezőellenőrzéskor használja őket.
 */
add_filter( 'gform_email_field_rejectable_values', function ( $rejectable_values ) {
	$emails = get_option( GF_EFRJ_FILTER_OPTION );
	if ( empty( $emails ) ) {
		return $rejectable_values;
	}

	// Ahányszor egy cím bekerül az opcióba, mielőtt elutasítjuk.
	$min_count = 2;
	$emails    = array_keys( array_filter( $emails, function ( $count ) use ( $min_count ) {
		return $count >= $min_count;
	} ) );

	return array_unique( array_merge( $rejectable_values, $emails ) );
} );

/**
 * Frissíti az opciót, ha a beküldés az űrlapküldéskor spamként mentődik.
 */
add_action( 'gform_entry_created', function ( $entry, $form ) {
	if ( rgar( $entry, 'status' ) !== 'spam' ) {
		return;
	}
	update_gform_email_field_rejectable_values_option( $entry, $form );
}, 10, 2 );

/**
 * Frissíti az opciót, ha a beküldés elbukott a mézesbödön-ellenőrzésen,
 * és az űrlap mentés nélkül megszakad.
 */
add_action( 'gform_post_process', function ( $form ) {
	$form_id = absint( rgar( $form, 'id' ) );
	if ( empty( $form_id ) ) {
		return;
	}

	if ( ! rgars( GFFormDisplay::$submission, $form_id . '/abort_with_confirmation' ) ) {
		return;
	}

	$found          = false;
	$honeypot_valid = GFCache::get( 'honeypot_' . $form_id, $found, false );
	if ( $found && $honeypot_valid ) {
		return;
	}

	$entry = GFFormsModel::get_current_lead( $form );
	update_gform_email_field_rejectable_values_option( $entry, $form );
} );

/**
 * Frissíti az opciót, ha a beküldést utólag spamnek vagy nem spamnek jelölöd
 * (például a beküldések listáján vagy a részletező oldalon).
 */
add_action( 'gform_update_status', function ( $entry_id, $new_value, $previous_value ) {
	$mark_as_spam = ( $new_value === 'spam' && $previous_value === 'active' );
	$mark_as_ham  = ( $new_value === 'active' && $previous_value === 'spam' );
	if ( ! $mark_as_spam && ! $mark_as_ham ) {
		return;
	}

	$entry = GFAPI::get_entry( $entry_id );
	if ( is_wp_error( $entry ) ) {
		return;
	}

	$form = GFAPI::get_form( rgar( $entry, 'form_id' ) );
	if ( ! $form ) {
		return;
	}

	update_gform_email_field_rejectable_values_option( $entry, $form, $mark_as_spam );
}, 1, 3 );

/**
 * Segédfüggvény az opció frissítéséhez.
 *
 * @param array $entry A feldolgozandó beküldés.
 * @param array $form  Az űrlap, amelyből a beküldés származik.
 * @param bool  $add   Hozzáadás (true) vagy eltávolítás (false).
 */
function update_gform_email_field_rejectable_values_option( $entry, $form, $add = true ) {
	$fields = GFAPI::get_fields_by_type( $form, array( 'email' ), true );
	if ( empty( $fields ) ) {
		return;
	}

	$emails = get_option( GF_EFRJ_FILTER_OPTION, array() );

	if ( ! is_array( $emails ) ) {
		if ( ! $add ) {
			delete_option( GF_EFRJ_FILTER_OPTION );

			return;
		}
		$emails = array();
	}

	foreach ( $fields as $field ) {
		$email = $field->get_value_export( $entry );
		if ( empty( $email ) ) {
			continue;
		}

		if ( $add ) {
			$emails[ $email ] = ( $emails[ $email ] ?? 0 ) + 1;
		} elseif ( isset( $emails[ $email ] ) ) {
			$emails[ $email ] -= 1;
			if ( $emails[ $email ] <= 0 ) {
				unset( $emails[ $email ] );
			}
		}
	}

	update_option( GF_EFRJ_FILTER_OPTION, $emails );
}
```

## Hová tedd a kódot

Az aktív téma `functions.php` fájljába, egy egyedi funkciókat tartalmazó bővítménybe, egyedi kiegészítőbe vagy kódrészlet-kezelő bővítménybe.

## Hogyan működik

- **Tanulás:** a `gform_post_process` megjegyzi a címet, ha a mézesbödön elbukik és az űrlap mentés nélkül megszakad. A `gform_entry_created` megjegyzi, ha a beküldés spam állapottal mentődik.
- **Felejtés:** a `gform_update_status` eltávolítja vagy csökkenti a cím számlálóját, ha a spam beküldést visszaállítod aktívra.
- **Blokkolás:** a `gform_email_field_rejectable_values` visszaadja a tárolt értékeket az E-mail mező ellenőrzésének. Miután egy érték legalább kétszer szerepelt (`$min_count = 2`), a tartalmazó beküldéseket elutasítja.

A szűrő teljes címet és részleges értéket is támogat. Az `@tempmail.com` például egy egész tartományt kizár.

## Testreszabás

- **Tanulási küszöb:** a `$min_count` növelésével vagy csökkentésével szabályozhatod, hány észlelés után tiltson.
- **Egész tartományok tiltása:** a `update_gform_email_field_rejectable_values_option()` függvényben a teljes cím helyett csak a tartományt (például `@pelda.hu`) normalizáld és tárold.
- **Egyes űrlapokra korlátozás:** tegyél a logikára űrlapazonosító-ellenőrzést, ha csak bizonyos űrlapokon akarod a tanulást és a tiltást.

## Megjegyzések és korlátok

- A tanult lista globális, minden űrlapra érvényes, hacsak kódban nem korlátozod.
- Az űrlap előnézetében a mögöttes szűrő alapértéke üres tömb. Beágyazott űrlapoknál az alapértékek között lehet például `@domain.com` vagy `@example.com`.
- Az e-mail-címek tárolása személyes adatnak számít. Egyeztesd az adatkezelési tájékoztatóddal és a megőrzési gyakorlatoddal.
- A nagy opcióadat hatással lehet az automatikus betöltésre és a memóriahasználatra. Sok spam esetén időnként töröld a régi tételeket, vagy válts egyedi táblára.
