WordPress: creare una pagina di contatti in AJAX

WordPress: creare una pagina di contatti in AJAX

In questo articolo vedremo come realizzare una pagina di contatti per WordPress utilizzando una classe PHP, AJAX e jQuery. Vediamo insieme i dettagli dell'implementazione.

Preparazione

Creiamo questa struttura all'interno del nostro tema:

/tuotema
  
  /inc
    /contact
    
  /js

Inseriremo la classe PHP all'interno della directory contact e il file JavaScript all'interno della directory js. Gli stili CSS andranno nel foglio di stile del tema e il template di pagina direttamente nella directory del tema. Dovremo inoltre aggiungere del codice al nostro file functions.php.

La classe PHP

La nostra classe PHP è Contact.php:


class Contact
{
	const TO = 'me@test.it';
	protected $_from;
	protected $_subject;
	protected $_message;
	protected $_email;
	protected $_captcha;
	
	public function __construct()
	{
	
		$this->_from = $_POST['from'];
		$this->_subject = $_POST['subject'];
		$this->_email = $_POST['email'];
		$this->_message = $_POST['message'];
		$this->_captcha = $_POST['captcha'];
	
	
	}
	
	private function _validate() 
	{
	
		$errors = '';
		
		if(empty($this->_from)) {
		
			$errors .= '<div class="error">Name missing</div>';
		
		}
		
		if(empty($this->_subject)) {
		
			$errors .= '<div class="error">Subject missing</div>';
		
		}
		
		if(!filter_var($this->_email, FILTER_VALIDATE_EMAIL)) {
		
			$errors .= '<div class="error">Invalid e-mail</div>';
		
		}
		
		if(empty($this->_message)) {
		
			$errors .= '<div class="error">Message missing</div>';
		
		}
		
		if(!preg_match('/^11$/', $this->_captcha)) {
		
			$errors .= '<div class="error">Wrong answer</div>';
		
		}
		
		return $errors;
	
	
	}
	
	private function _send()
	{
	
		$headers = 'From: ' .' <'.$this->_email.'> ' . "\r\n";
		$message = $this->_from . ' wrote at ' . strftime('%d-%m-%Y %H:%M:%S', time()) . ': ' . "\n\n";
		$message .= $this->_message;
		
		@mail(self::TO, $this->_subject, $message, $headers); 
	
	}
	
	
	public function process()
	{
	
		$message = '';
		
	  if(isset($_POST['contact-submit'])) {
		
		$validation = $this->_validate();
		
		if($validation != '') {
		
			$message = $validation;
		
		} else {
		
			$this->_send();
			
			$message = '<div class="success">E-mail successfully sent!</div>';
		
		}
		
	   }
	
		return $message;
	}
	
	


}

Questa classe valida i dati (in modo elementare) e restituisce come output una stringa contenente un messaggio di avvenuto invio o un elenco di errori a seconda dei casi.

Il template di pagina

L'elaborazione dei dati AJAX deve avvenire prima che venga generato l'output di WordPress. Quindi il nostro template di pagina, chiamato template-contact.php, inizia in questo modo:


<?php
/*
Template Name: Contact Form
*/
?>

<?php
require_once('inc/contact/Contact.php');

$contact = new Contact();

if(isset($_POST['ajax'])) {

	echo $contact->process();
	
	exit();
	
} else {

?>

Per evitare che la richiesta AJAX faccia duplicare l'output abbiamo utilizzato un parametro POST per capire se la richiesta è fatta da jQuery. Se lo è, viene restituita solo la stringa del metodo Contact::process(), altrimenti viene visualizzata normalmente la pagina.

Il codice jQuery

Il codice jQuery è molto semplice ed è contenuto nel file contact.js:


(function($) {


	$(function() {
	
		var Contact = function() {
		
			var form = '#contact';
			
			
			
			
			this.process = function() {
			
			
			$(form).submit(function(event) {
			
				var $form = $(this);
				var url = $form.attr('action');
				var data = 'from=' + $('#from', $form).val() + '&email=' + $('#email', $form).val() +
				            '&subject=' + $('#subject', $form).val() +
				            '&message=' + $('#message', $form).val() +
				            '&captcha=' + $('#captcha', $form).val() +
				            '&contact-submit=Send&ajax=true';
				
				$.ajax({
					type: 'POST',
					dataType: 'text',
					url: url,
					data: data,
					success: function(txt) {
					
					    $('div.success, div.error', $form).remove();
					
						$(txt).prependTo($('ul', $form));
						
						$('html, body').animate({
							scrollTop: $form.offset().top
						}, 500);
						
					
					
					}
					
				});
				
				
				event.preventDefault();
			
			
			});
			
			}
		
		
		};
		
		var contact = new Contact();
		
		if($('#contact').length) {
		
			contact.process();
			
		}
	
	
	});


})(jQuery);

Dato che PHP controlla se il form è stato inviato usando la variabile POST contact-submit, dobbiamo inserirla nella nostra richiesta, a cui aggiungiamo anche il parametro ajax. L'effetto interessante è il seguente:


$('html, body').animate({
	scrollTop: $form.offset().top
}, 500);

In pratica la pagina si sposta con un movimento fluido verso l'alto per mostrare il messaggio restituito dalla richiesta AJAX.

Includere i file JavaScript

Aggiungiamo il seguente codice al file functions.php del nostro tema:


function add_scripts() {

	if(!is_admin()) {

	wp_enqueue_script('jquery');
	wp_register_script('contact', get_bloginfo('template_url') . '/js/contact.js', '1.0', true);
	wp_enqueue_script('contact');
	
	
	}
}

add_action('wp_footer', 'add_scripts');

Gli stili CSS

Gli stili CSS vanno inseriti nel foglio di stile principale del nostro tema:


/*= Contact form */

#contact {
	margin: 1em 0;
}

#contact ul {
	margin: 0;
	padding: 0;
	list-style: none;
}

#contact li {
	margin-bottom: 0.5em;
}

#contact li label {
	display: block;
	font-weight: bold;
	padding-bottom: 3px;
}

#contact li input {
	width: 150px;
	border: 1px solid #999;
	display: block;
}

#contact li textarea {
	display: block;
	font: 1em sans-serif;
	width: 400px;
	height: 300px;
	border: 1px solid #999;
}

#contact p input {
	display: block;
	margin-top: 1em;
	background: #000;
	color: #fff;
	font-weight: bold;
	width: 100px;
	padding: 4px;
	border: 1px solid #333;
	border-radius: 4px;
}

#contact .error,
#contact .success{ padding: 0.8em; margin-bottom: 1em; border: 2px solid #ddd; }

#contact .error { background: #fbe3e4; color: #8a1f11; border-color: #fbc2c4; }
#contact .success { background: #e6efc2; color: #264409; border-color: #c6d880; }

I file del download sono stati localizzati in italiano. Troverete tutte le indicazioni necessarie nei commenti dei file.

Torna su