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.