Un utente ha chiesto informazioni su Contact Form DB di Wordpress

Filtro personalizzato in PHP e CF7 Convalida personalizzata

Un utente ha chiesto 👇

Ciao,
e grazie per aver creato questo fantastico plugin. Non ho mai visto una documentazione più ampia. Grande!

Volevo eseguire una convalida personalizzata per Contact Form 7, ma senza alcun risultato. Ho provato 100 diverse configurazioni ma sembra che non funzioni.

Ho solo un modulo e un input. Devo assicurarmi che un utente non possa inviare lo stesso collegamento due volte, in base all’indirizzo IP corrente dell’utente.

Ho creato un filtro personalizzato utilizzando codici brevi, azioni e filtri.
E funziona se lo applico a un tavolo. Ottiene l’indirizzo IP dell’utente corrente.

Codici di filtro personalizzati, azioni e filtri:


require_once(ABSPATH . 'wp-content/plugins/contact-form-7-to-database-extension/CFDBPermittedFunctions.php');
function my_ip_sorting() {
    if ( ! empty( $_SERVER['HTTP_CLIENT_IP'] ) ) {
    //check ip from share internet
    $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif ( ! empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
    //to check ip is pass from proxy
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
    $ip = $_SERVER['REMOTE_ADDR'];
    }
	return $ip;
}
cfdb_register_function('my_ip_sorting');

E la forma in cui viene applicato:


[cfdb-datatable form="url-submit-form" id="from_current_ip_table" show="Submitted From,url-submit-input" header="false" filter="Submitted From=my_ip_sorting()"]
[/cfdb-datatable]

Ho creato una pagina di prova se vuoi dare un’occhiata. Ovviamente devi inviare una presentazione per vedere la tua presentazione. Incolla semplicemente un link dalla prima pagina, se lo desideri. Questo visualizza solo l’invio effettuato dall’IP utente corrente.

L’idea è di applicare questo filtro alla convalida personalizzata del modulo di contatto 7. Uso questo esempio https://cfdbplugin.com/?page_id=904 e sperava in questo https://contactform7.com/2015/03/28/custom-validation/ e tutti i thread correlati.

Questo è il codice per la convalida personalizzata del Modulo di contatto 7 con cui sono finito, prima di decidere di fare una domanda su questo forum. Non ho apportato molte modifiche al codice dalla pagina 904 in questo esempio, ma ho apportato molte modifiche.


function is_already_submitted($formName, $fieldName, $fieldValue) {
    require_once(ABSPATH . 'wp-content/plugins/contact-form-7-to-database-extension/CFDBFormIterator.php');
    $exp = new CFDBFormIterator();
    $atts = array();
    $atts['show'] = $fieldName;
    $atts['filter'] = "$fieldName=$fieldValue&&Submitted From=my_ip_sorting";
    $atts['unbuffered'] = 'true';
    $exp->export($formName, $atts);
    $found = false;
    while ($row = $exp->nextRow()) {
        $found = true;
    }
    return $found;
}

function my_validate_url($result, $tag) {
    $formName = 'url-submit-form'; // Change to name of the form containing this field
    $fieldName = 'url-submit-input'; // Change to your form's unique field name
    $errorMessage = 'Email has already been submitted'; // Change to your error message
    $name = $tag['name'];
    if ($name == $fieldName) {
        if (is_already_submitted($formName, $fieldName, $_POST[$name])) {
            $result->invalidate($tag, $errorMessage);
        }
    }
    return $result;
}
add_filter('wpcf7_validate_url*', 'my_validate_url', 10, 2);

Anche senza il filtro personalizzato non riesco a farlo funzionare. Che cosa sto facendo di sbagliato? Posso fare la stessa sottomissione più e più volte. Il mio modulo si chiama “url-submit-form” e il mio input è “url-submit-input”. Il filtro IP dell’utente corrente non deve richiedere “Inviato da”.

Ho fatto il filtro perché per quanto ho letto non puoi cercare nel database in set. URL e indirizzo IP corrispondenti. Quindi il filtro IP dell’utente corrente fa quel lavoro.

Ho esaminato tutti i thread di supporto relativi a questo e non sono ancora fortunato. Spero tu possa aiutare Grazie.

Questo argomento è stato modificato 1 anno, 10 mesi fa da. Questo argomento è stato modificato 1 anno, 10 mesi fa da.

Lanciatore di thread

(@jifola)

1 anno, 10 mesi fa

Ho trovato qualcosa che funziona. Infine 🙂 Ma ha un approccio molto diverso. Il mio unico problema ora è visualizzare il messaggio di errore. Qualche idea per favore?

Questo è quello che ho trovato finora. È un po ‘pesante per il traffico, ma voglio che tutti sappiano cosa sta succedendo.


// Remember to change url* to what kind of field you are validating. * means it is a required field. Remove the * if it is not.
add_filter( 'wpcf7_validate_url*', 'my_duplicate_validation', 20, 2 );
function my_duplicate_validation($result, $tag) {

// Get the existing data
require_once(ABSPATH . 'wp-content/plugins/contact-form-7-to-database-extension/CFDBFormIterator.php');
$exp = new CFDBFormIterator();
$atts = array();
$atts['show'] = 'url-submit-input'; // Input name from your form
$atts['filter'] = 'Submitted From=my_ip_sorting()'; // Custom filter sorting by the current users IP address
$atts['unbuffered'] = 'true';
$exp->export($atts['url-submit-form'], $atts); // Name of your form
$rows = array(); // Make $rows to an array
while ($row = $exp->nextRow()) {
  $rows[] = $row; // Instead of creating output, just save the data into the array $rows made just before
}

// Get the current contact form
$wpcf7 = WPCF7_ContactForm::get_current();
	
// Get the submission, which is generated when the user hits the submit button
$submission = WPCF7_Submission::get_instance();
	
// if a submission is made
if ($submission) {
	
// Put the content of the submission into a variable called $posted_data
$posted_data = $submission->get_posted_data();
	
// Exit the function if the contact form is empty
if ( empty ($posted_data))
return;

// Put the content of a single input into a varible called $tag instead of the whole content from $posted_data
// You can change the name of $tag, but make sure you change it everywhere
// The name url-submit-input is the name of a input in my contact form
$tag = $posted_data['url-submit-input'];

// Check if the value that is submitted is already in the array of values that you pulled from your existing data
// Url-submit-input is also the name of the field that the data is stored in. Dont confuse it with the name of the input in your form	
// if(in_array(value to look for, array_column(array to look in, array column to look in)))
if(in_array($tag, array_column($rows, 'url-submit-input'))) {
	
    // If value submitted in form is found in the data saved in the array $rows. Then it is a duplicate by the current IP address
    // Invalidate and return error
    $result->invalidate($tag, "error" );

} else {
	
	// If value submitted in form is NOT found in the data saved in the array $rows then it is not a duplicate. Allow the form to send
	// Remember it is based on the IP address of the current user "$atts['filter'] = 'Submitted From=my_ip_sorting()';"
	return $result;
	
} // if in_array end
	
} // If $submission end
	
} // Function my_duplicate_validation end

E il filtro personalizzato è composto da shortcode, azioni e filtri.


require_once(ABSPATH . 'wp-content/plugins/contact-form-7-to-database-extension/CFDBPermittedFunctions.php');
function my_ip_sorting() {
    if ( ! empty( $_SERVER['HTTP_CLIENT_IP'] ) ) {
    //check ip from share internet
    $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif ( ! empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
    //to check ip is pass from proxy
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
    $ip = $_SERVER['REMOTE_ADDR'];
    }
	return $ip;
}
cfdb_register_function('my_ip_sorting');

Mi ci è voluta un’eternità per raggiungere questo obiettivo. Lo sto facendo da una settimana. Tutto quello che devo fare ora è visualizzare il dannato messaggio di errore. Apprezzeremmo qualsiasi aiuto.

Questa risposta è stata modificata 1 anno, 10 mesi fa. Lanciatore di thread

(@jifola)

1 anno, 10 mesi fa

Santo cielo, funziona. Se vuoi eseguire la convalida a due fattori, puoi usarla. In questo caso non volevo che lo stesso indirizzo IP facesse lo stesso invio due volte.

Per prima cosa crea un filtro personalizzato utilizzando i filtri Clip, Azioni e Plugin. Solo un segno di spunta del codice funzione “Attivazione” è NO. Il codice seguente registra l’indirizzo IP dell’utente corrente.


require_once(ABSPATH . 'wp-content/plugins/contact-form-7-to-database-extension/CFDBPermittedFunctions.php');
function my_ip_sorting() {
    if ( ! empty( $_SERVER['HTTP_CLIENT_IP'] ) ) {
    //check ip from share internet
    $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif ( ! empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
    //to check ip is pass from proxy
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
    $ip = $_SERVER['REMOTE_ADDR'];
    }
	return $ip;
}
cfdb_register_function('my_ip_sorting');

Quindi aggiungi il seguente codice nel tuo functions.php.


// Get existing data
function my_duplicate_validation($found) {
	
    require_once(ABSPATH . 'wp-content/plugins/contact-form-7-to-database-extension/CFDBFormIterator.php');
    $exp = new CFDBFormIterator();
    $atts = array();
    $atts['show'] = 'url-submit-input'; // The field name
    $atts['filter'] = 'Submitted From=my_ip_sorting()'; // The custom filter
    $exp->export($atts['url-submit-form'], $atts); // The form name
	$found = true; // Found is set to true, and will only be returned if a duplicate is found
    $rows = array(); // Put the data you extract into an array called $rows
    while ($row = $exp->nextRow()) {
        $rows[] = $row;
    }

	// Get the form that is currently being used
    $wpcf7 = WPCF7_ContactForm::get_current();
	
	// Get the current submission which is generated when the user hits the submit button
    $submission = WPCF7_Submission::get_instance();

	// If submission is being made
    if ($submission) {
	    
		// Put the values that is being submitted into an array called $posted_data
        $posted_data = $submission->get_posted_data();

		// Exit the function if the form is empty
        if ( empty ($posted_data))
        return;

		// Put the value of the input named url-submit-input into an array called $duplicate
        $duplicate = $posted_data['url-submit-input'];

		// if(in_array(the value to look for, array_column(the array to look in, the column to look in)))
        if(in_array($duplicate, array_column($rows, 'url-submit-input'))) {
	
			// If a duplicate is found return $found which is set to true
			return $found;
			
        }
		
    }
		
}

// Contact form 7 custom validation
function my_validate_url($result, $tag) {

	// The error message is related to the field in your form by the name of url-submit-input
	if ( 'url-submit-input' == $tag->name ) {
	
		// Asking the previous function my_duplicate_validation if $found was returned
        if (my_duplicate_validation($found)) {
			
			// If $found was returned then the submission is invalidated
			// If you are using ajax then only .wpcf7-not-valid-tip will show this error message
            $result->invalidate($tag, "Error your submission is a duplicate");
		
        }
		
	}
	
	// Return the result
    return $result;
}
add_filter('wpcf7_validate_url*', 'my_validate_url', 20, 2);

Ho provato per un’intera dannata settimana a far funzionare questa cosa 🙂 Se hai qualche domanda per favore chiedi.

(@ wasimking333)

1 anno, 6 mesi fa

Ho un problema simile, sto usando un plugin CFDB e non riesco a memorizzare un campo email univoco nel DB, ho provato ad aggiungere uno strumento “aggiungi scorciatoia e filtri” per correggere questo script qui sotto. ma questo script non funziona per me.
Per favore aiuto.

funzione is_already_submitted ($ formName, $ fieldName, $ fieldValue) {
require_once (ABSPATH. ‘wp-content / plugins / contact-form-7-to-database-extension / CFDBFormIterator.php’);
$ exp = nuovo CFDBFormIterator ();
$ atts = edit ();
$ atts[‘show’] = $ fieldName;
$ atts[‘filter’] = “$ FieldName = $ fieldValue”;
$ atts[‘unbuffered’] = “vero”.
$ exp-> export ($ formName, $ atts);
$ trovato = falso;
fad ($ row = $ exp-> nextRow ()) {
$ trovato = vero;
}
restituito $ ricevuto;
}

/ **
* @param $ WPCF7_Validation result
* @param $ array di tag
* @return WPCF7_Validation
* /
funzione my_validate_email ($ risultato, $ tag) {
$ formName = ‘contact-form-1’; // Modifica il nome del modulo contenente questo campo
$ fieldName = “la tua email”; // Cambia il tuo nome in un campo univoco del tuo modulo
$ errorMessage = ‘L’email è già stata inviata’; // Cambia il tuo messaggio di errore
$ nome = $ tag[‘name’];
if ($ name == $ fieldName) {
if (is_already_submitted ($ formName, $ fieldName, $ _POST[$name])) {
$ risultato-> non valido ($ tag, $ messaggio di errore);
}
}
restituire $ risultato;

}

add_filter (‘wpcf7_validate_email *’, ‘my_validate_email’, 10, 2);

Was this helpful?

0 / 0

Lascia un commento 0

Your email address will not be published. Required fields are marked *