WordPress è un CMS spesso utilizzato come testata giornalistica e spesso gli articoli sono scritti da diversi autori, WordPress ha la possibilità di avere utenti con diversi ruoli in modo tale che dopo il login anche la dashboard sia personalizzata e nasconda alcune parti del sito, poniamo invece di non voler dare l’accesso all’area amministrativa di WP ma di avere la necessità che siano scritti articoli.
Possiamo utilizzare la funzione wp_insert_post() per preparare un form da far compilare a front end, vediamo come fare.
Come prima cosa dichiariamo la variable $post che è globale
1 2 3 4 5 6 7 8 |
<?php function simple_fep_form($content = null) { global $post; ob_start(); ?> |
Siccome vogliamo far scegliere anche la categoria in cui pubblicare il post, scriviamo questo parte di codice che richiameremo dopo nel form
1 2 3 4 5 6 7 8 |
<?php $args = array( 'show_option_none' => __( 'Categoria' ), 'show_count' => 1, 'orderby' => 'name', 'hide_empty' => '0', ); ?> |
Ora creiamo un div contenitore che mi imposta una classe diversa a seconda che l’utente sia loggato o no
1 |
<div class="col-md-12 <?php if(is_user_logged_in()) echo 'closed'; else echo 'loggedout'?>"> |
Qui invece eseguiamo un’azione, ossiamo mostreremo degli avvisi dopo il submit del form
1 |
<?php do_action( 'simple-fep-notice' ); ?> |
Ok ora prepariamo il form di inserimento del post, utilizzo la funzione is_user_logged_in() per mostrare il post solo se l’utente è loggato
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php if(is_user_logged_in()) { ?> <form id="fep-new-post" name="new_post" method="post" action="<?php the_permalink(); ?>"> <div class="form-group"> <label>Titolo *</label> <input type="text" id="fep-post-title" class="form-control" name="post-title" /> </div> <div class="form-group"> <label>Contenuto *</label> <textarea class="form-control" name="posttext" id="fep-post-text" tabindex="1" rows="4" cols="60"></textarea> </div> <div class="form-group"> <?php wp_dropdown_categories($args); ?> </div> <div class="form-group"> <label>Tags</label> <input id="fep-tags" class="form-control" name="tags" type="text" tabindex="2" autocomplete="off" value="<?php esc_attr_e( 'Add tags', 'simple-fep' ); ?>" onfocus="this.value=(this.value=='<?php echo esc_js( __( 'Add tags', 'simple-fep' ) ); ?>') ? '' : this.value;" onblur="this.value=(this.value=='') ? '<?php echo esc_js( __( 'Add tags', 'simple-fep' ) ); ?>' : this.value;" /> </div> <div class="form-group"> <input id="submit" class="btn btn-lg btn-primary pull-right" type="submit" tabindex="3" value="<?php esc_attr_e( 'Post', 'simple-fep' ); ?>" /> </div> <input type="hidden" name="action" value="post" /> <input type="hidden" name="empty-description" id="empty-description" value="1"/> <?php wp_nonce_field( 'new-post' ); ?> </form> <?php } else { ?> <div class="alert alert-danger">Devi prima accedere</div> <?php } ?> </div> <!-- #simple-fep-postbox --> |
Ok, a questo punto processo il form ed aggiungo del codice per validare i campi, nonchè i relativi avvisi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
<?php // Output the content. $output = ob_get_contents(); ob_end_clean(); // Return only if we're inside a page. This won't list anything on a post or archive page. if (is_page()) return $output; } // Add the shortcode to WordPress. add_shortcode('wpfepm-posting', 'simple_fep_form'); function simple_fep_add_post(){ if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == 'post' ){ if ( !is_user_logged_in() ) return; global $current_user; $user_id = $current_user->ID; $post_title = $_POST['post-title']; $post_content = $_POST['posttext']; $tags = $_POST['tags']; $category = array($_POST['cat']); global $error_array; $error_array = array(); if (empty($post_title)) $error_array[]='Il titolo è obbligatorio.'; if (empty($post_content)) $error_array[]='Il contenuto è obbligatorio.'; if (count($error_array) == 0){ $post_id = wp_insert_post( array( 'post_author' => $user_id, 'post_title' => $post_title, 'post_category' => array($_POST['cat']), 'post_type' => 'post', 'post_content' => $post_content, 'tags_input' => $tags, 'post_status' => 'draft' ) ); global $notice_array; $notice_array = array(); $notice_array[] = "Grazie! Il tuo post è in fase di approvazione. "; add_action('simple-fep-notice', 'simple_fep_notices'); } else { add_action('simple-fep-notice', 'simple_fep_errors'); } } } add_action('init','simple_fep_add_post'); function simple_fep_errors(){ ?> <?php global $error_array; foreach($error_array as $error){ echo '<div class="alert alert-danger">' . $error . '</div>'; } } function simple_fep_notices(){ ?> <?php global $notice_array; foreach($notice_array as $notice){ echo '<div class="alert alert-warning">' . $notice . '</div>'; } } |
Come si può notare dal codice ho utilizzato “draft” qui ‘post_status’ => ‘draft’ , significa che ogni nuovo post verrà salvato come bozza, nel caso in cui volessimo pubblicarlo in automatico utilizzeremo “publish”
Adesso per vedere il form di inserimento è sufficiente creare una pagina ed incollarci lo shortcode [wpfepm-posting]
Programmatore WordPress Esperto WooCommerce
Sono l’autore di questo blog con tanti trucchi e guide su WordPress e WooCommerce.