WordPress: creare form personalizzati con Contact Form 7

WordPress: creare form personalizzati con Contact Form 7

In un recente lavoro vi era l'esigenza di avere un form diverso con dei campi arbitrari per i post di una determinata categoria. Cercando in giro non ho trovato plugin che generassero form on the fly, così ho pensato di modificare il plugin Contact Form 7 per adattarlo alle mie esigenze. Ed ecco il risultato.

Per poter scaricare il file allegato al post l'utente doveva compilare i campi del form ed aver effettuato il login. Gran parte della logica di Contact Form 7 è contenuta nel file contact-form-7/includes/classes.php, quindi sono andato a modificare quel file.

Come prima cosa ho dovuto modificare la visualizzazione del form in base al login dell'utente. Per questo motivo ho modificato la funzione form_html():


function form_html() {
		$form = '<div class="wpcf7" id="' . $this->unit_tag . '">';
		
		global $post;
		$id = $post->ID;
		
		
		// se il post NON è nelle categorie scelte, usa l'URL del plugin
		
		if(!in_category( array(15, 16), $id )) {

			$url = wpcf7_get_request_uri();
		
		
		

		if ( $frag = strstr( $url, '#' ) )
			$url = substr( $url, 0, -strlen( $frag ) );

		$url .= '#' . $this->unit_tag;
		
		

		$url = apply_filters( 'wpcf7_form_action_url', $url );
		
		} else {
		
		   // altrimenti usa il permalink del post
		
			$url = get_permalink($id);
		
		}
		$enctype = apply_filters( 'wpcf7_form_enctype', '' );
		$class = apply_filters( 'wpcf7_form_class_attr', 'wpcf7-form' );

		$form .= '<form action="' . esc_url_raw( $url ) . '" method="post"'
			. ' class="' . esc_attr( $class ) . '"' . $enctype . '>' . "\n";

		$form .= $this->form_hidden_fields();

		$form .= $this->form_elements();

		if ( ! $this->responses_count )
			$form .= $this->form_response_output();

		$form .= '</form>';

		$form .= '</div>';
		
		
		// se il post NON è nelle categorie scelte, visualizza il form
		if(!in_category( array(15, 16), $id )) {
		
			return $form;
		
		
		} else {
		
		    // se l'utente ha effettuato il login, aggiungi un messaggio prima del form
		
			if(is_user_logged_in()) {

					return '<p><strong>Compila i seguenti campi per effettuare il download</strong></p>' . $form;
		
		
		     } else if(!is_user_logged_in()) {
		     
		        // altrimenti visualizza un messaggio di errore e NON visualizzare il form
		     
		     	return '<p>Login non effettuato o utente non riconosciuto.</p>';
		     
		     
		     }
		     
		     
		
		
		}

	}
	

Ora non dobbiamo fare altro che gestire noi la validazione e l'invio dei form generati. Occorre modificare le funzioni form_response_output(), validation_error() e submit() aggiungendo il solito check delle categorie prima della routine principale delle funzioni:


if(!in_category( array(15, 16), $id )) {
   //...
}

L'ultima cosa che ci resta da fare è specificare i nostri file JavaScript per la gestione AJAX del form nel file contact-form-7/includes/controller.php:


function wpcf7_enqueue_scripts() {
	
	global $post;
	
	$id = $post->ID;
	
	if(!in_category( array(15, 16), $id )) {
	   // codice predefinito del plugin
	} else {
	
		wp_register_script('download', get_bloginfo('template_url') . '/js/download.js', array('jquery'), '1.0', true);
		wp_enqueue_script('download');
	
	}
	
}

Cosa abbiamo ottenuto? Il plugin continuerà a funzionare normalmente su tutto il sito ad eccezione di quei post inclusi nelle categorie specificate. In pratica ora possiamo creare form personalizzati e gestirli in totale autonomia.

Torna su