[Contact Form 7] Zapisywanie wiadomości z formularza jako własne wpisy

Plugin Contact Form 7 to bardzo popularna wtyczka formularza kontaktowego. Posiada bardzo duże możliwości konfiguracji, przez co jest bardzo użyteczna i uniwersalna. Niestety, w standardzie nie posiada niektórych funkcji, które wydają się obowiązkowe dla tego typu modułów, np. zapisywanie wiadomości przesyłanych przez formularz. Moją propozycją sposobu zapisu wiadomości przesyłanych przez formularz wiadomości jest utworzenie nowego typu wpisów (custom post type) oraz zapisywanie każdej wiadomości jako nowy wpis. W tym celu musimy utworzyć nowy typ wpisu, np. “request”. add_action('init', 'register_request_post_type'); function register_request_post_type() { register_post_type( 'request', array( 'label' => 'Requests', 'description' => 'Our Requests', 'public' => false, 'show_ui' => true, 'show_in_menu' => true, 'capability_type' => 'post', 'map_meta_cap' => true, 'hierarchical' => false, 'rewrite' => array('slug' => 'request', 'with_front' => false), 'query_var' => true, 'supports' => array('title', 'editor'), 'labels' => array ( 'name' => 'Requests', 'singular_name' => 'Request', 'menu_name' => 'Requests', 'add_new' => 'Add new request', 'add_new_item' => 'Add new request', 'edit' => 'View message', 'edit_item' => 'View message', 'new_item' => 'New request', 'search_items' => 'Search request', 'not_found' => 'Not found', 'not_found_in_trash' => 'Not found in trash' ) ) ); } Kolejnym krokiem jest utworzenie funkcji zapisującej dane z formularza jako wpis utworzonego wcześniej typu. Funkcja ta musi być podpięta do funkcji wysyłania formularza wtyczki Contact Form 7. add_action( 'wpcf7_mail_sent', 'save_request' ); function save_request( $cf7 ){ $submission = WPCF7_Submission::get_instance(); if ( $submission ) { $posted_data = $submission->get_posted_data(); } $content = ' From: '.$posted_data['name'].' ('.$posted_data['email'].') Message Body: '.$posted_data['message']; $new_request = array( 'post_type' => 'request', 'post_title' => $posted_data['name'] . ' ('.$posted_data['email'].')', 'post_content' => $content, 'post_status' => 'private', 'post_author' => 1 ); wp_insert_post( $new_request ); } Tak utworzona funkcja zapisuje każdą wiadomość wysyłaną formularzem. Wiadomości te widoczne są...

Lista wyboru (select) wpisów własnego typu (custom post type)

WordPress daje bardzo fajne narzędzie pozwalające na szybkie i sprawne tworzenie panelu zarządzania szablonem po stronie admina z możliwością wyboru istniejących stron w formularzach. Jeżeli potrzebna jest możliwość wyboru istniejącej strony w formularzu, możemy skorzystać z funkcji wp_dropdown_page(). Aby wyświetlić taką listę w formularz wystarczy następująca forma: <?php $args = array( 'depth' => 0, 'child_of' => 0, 'selected' => 0, 'echo' => 1, 'name' => 'page_id', 'id' => null, // string 'show_option_none' => null, // string 'show_option_no_change' => null, // string 'option_none_value' => null, // string ); wp_dropdown_pages( $args ); ?> Najważniejsze argumenty funkcji mają następujące znaczenie: child_of – określa rodzica dla listowanych stron, selected – wybrana opcja dla rozwijanej listy, echo – wyświetlanie lista (w przeciwnym razie można ją zapisać do zmiennej), name – nazwa zmiennej / pola formularza. Dla standardowych stron utworzonych na WordPressie jest to doskonałe rozwiązanie. Problem pojawia się jednak wówczas, gdy chcemy wyświetlić listę wyboru wpisów własnego typu, czyli custom_post_type. Aby stworzyć sobie wygodne rozwiązanie tego problemu, można skorzystać z poniższej funkcji: <?php function custom_post_select($select_id, $post_type, $selected = 0) { $post_type_object = get_post_type_object($post_type); $label = $post_type_object->label; $posts = get_posts(array('post_type'=> $post_type, 'post_status'=> 'publish', 'suppress_filters' => false, 'posts_per_page'=>-1)); echo '<select name="'. $select_id .'" id="'.$select_id.'">'; echo '<option value = "" >'.$label.' </option>'; foreach ($posts as $post) { echo '<option value="', $post->ID, '"', $selected == $post->ID ? ' selected="selected"' : '', '>', $post->post_title, '</option>'; } echo '</select>'; } ?> Dzięki temu, jeżeli tylko chcemy umieścić w formularzu rozwijaną listę wyboru własnego typu wpisów (custom post type), wystarczy wywołać funkcję na przykład: <?php custom_post_select('product_id','product');...