Aggiungere elementi di tipo post personalizzato dal frontend
Sto cercando di capire come fare in modo che il mio sito WordPress possa aggiungere elementi di tipo portfolio
dal frontend. Plugin come WP-User-Frontend permettono la pubblicazione dal frontend ma funzionano solo con i post del blog.
Ci sono modi o plugin simili a wp-user-frontend ma che permettano di aggiungere elementi di tipo post personalizzato?

Se sei disposto a pagare per questo, il plugin Gravity Forms ti permette di creare moduli che si mappano ai tuoi Custom Post Types (anche i tipi di post e pagine regolari) così come ai tuoi campi personalizzati.
Per coloro che non lo sono e che sono disposti a rimboccarsi le maniche, puoi creare un modulo front-end che invia dati a qualsiasi tipo di post tu scelga in modo abbastanza semplice.
Ecco un esempio base:
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == "my_post_type") {
// memorizziamo le variabili del post in variabili per un uso successivo
// ora sarebbe un buon momento per eseguire alcuni controlli di errore/validazione di base
// per assicurarsi che i dati per questi valori siano stati impostati
$title = $_POST['title'];
$content = $_POST['content'];
$post_type = 'my_custom_post';
$custom_field_1 = $_POST['custom_1'];
$custom_field_2 = $_POST['custom_2'];
// l'array di argomenti da inserire con wp_insert_post
$new_post = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'publish',
'post_type' => $post_type
);
// inseriamo il post nel database passando $new_post a wp_insert_post
// memorizziamo l'ID del post in una variabile $pid
$pid = wp_insert_post($new_post);
// ora usiamo $pid (post id) per aggiungere i nostri metadati del post
add_post_meta($pid, 'meta_key', $custom_field_1, true);
add_post_meta($pid, 'meta_key', $custom_field_2, true);
}
Il tuo modulo HTML avrebbe un aspetto simile a questo:
<form method="post" name="front_end" action="" >
<input type="text" name="title" value="Titolo del mio post" />
<input type="text" name="content" value="Contenuto del mio post" />
<input type="text" name="custom_1" value="Contenuto del campo personalizzato 1" />
<input type="text" name="custom_2" value="Contenuto del campo personalizzato 2" />
<button type="button">Invia</button>
<input type="hidden" name="action" value="my_post_type" />
</form>
Puoi inserire tutto questo nel file template del tuo tema. Normalmente, farei un passo avanti e eseguirei la logica di elaborazione (PHP) da una funzione all'interno del mio functions.php agganciata a un'azione, tuttavia funzionerà anche da un file del tema.
Questo è solo un esempio base e manca di un controllo degli errori e una validazione seria. Tuttavia, ti fornisce il framework essenziale per ciò che ti serve per inviare dal front-end ai tuoi tipi di post nel back-end.
Ci sono anche numerosi tutorial che approfondiscono l'argomento su WPSE se esegui una ricerca troverai una ricchezza di informazioni.

<?php
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == "front_post") {
// memorizziamo le variabili POST in variabili per uso successivo
// questo sarebbe un buon momento per eseguire alcuni controlli di errore/validazione di base
// per assicurarci che i dati per questi valori siano stati impostati
$title = $_POST['title'];
$content = $_POST['content'];
$tags = $_POST['tag'];
$custom_field = $_POST['custom_1'];
$post_type = 'frontpost';
// l'array di argomenti da inserire con wp_insert_post
$new_post = array(
'post_title' => $title,
'post_content' => $content,
'tags_input' => $tags,
'post_status' => 'publish',
'post_category' => array('0',$_POST['cat']),
'post_type' => $post_type
);
// inseriamo il post nel database passando $new_post a wp_insert_post
// memorizziamo l'ID del post in una variabile $pid
// ora usiamo $pid (post id) per aggiungere i metadati del post
$pid=wp_insert_post($new_post);
// ora usiamo $pid (post id) per aggiungere i metadati del post
add_post_meta($pid, 'cust_key', $custom_field);
}
?>
<div class="front-form col-sm-6">
<form method="post" name="front_end" action="" >
<input type="text" name="title" placeholder="Titolo FrontPost" required />
<textarea name="content" placeholder="Contenuto FrontPost" rows="5" ></textarea>
<input type="text" name="tag" placeholder="Tag FrontPost" />
<input type="text" name="custom_1" placeholder="Contenuto Campo Personalizzato" />
<span><?php wp_dropdown_categories( 'tab_index=10&taxonomy=category&hide_empty=0' ); ?></span>
<button type="submit">Invia</button>
<input type="hidden" name="action" value="front_post" />
</form>
</div>
prova questo, ti aiuterà..! Aakib :)

inserisci post
add_action('init', function() {
if (isset($_POST['submit'])) {
if (!is_user_logged_in()) {
echo 'Devi essere loggato per inviare un post.';
return;
}
$title = sanitize_text_field($_POST['name']);
$description = sanitize_textarea_field($_POST['description']);
$create_post = array(
'post_status' => 'publish',
'post_type' => 'user', // Assicurati che il post type 'user' sia registrato
'post_title' => $title,
'post_content' => $description,
);
$post_id = wp_insert_post($create_post);
if(isset($_FILES['fileToUpload']) && !empty($_FILES['fileToUpload']['name'])){
require_once( ABSPATH . 'wp-admin/includes/image.php' );
require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/media.php' );
$attachement_id = media_handle_upload('fileToUpload',$post_id);
if(is_wp_error($attachement_id)){
echo 'upload fallito !!';
}else{
set_post_thumbnail($post_id,$attachement_id);
}
}
return $post_id ? 'post creato con successo' : 'errore nella creazione del post';
if ($post_id) {
$state = sanitize_text_field($_POST['state']);
$country = sanitize_text_field($_POST['country']);
$pincode = sanitize_text_field($_POST['pincode']);
$college = sanitize_text_field($_POST['college']);
update_post_meta($post_id, 'state', $state);
update_post_meta($post_id, 'country', $country);
update_post_meta($post_id, 'pincode', $pincode);
update_post_meta($post_id, 'college', $college);
echo 'Post creato con successo!';
} else {
echo 'Creazione del post fallita.';
}
}
});
ecco la parte HTML
<style cdn>
<div class="container">
<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="post_id" value="<?php echo $post_idd ?>"
<div class="row mt-3">
<div class="col-sm-6">
<label>Nome</label>
<input type="text" name="name" class="form-control" value="<?php echo isset($user_name) ? $user_name : ''; ?>">
</div>
<div class="col-sm-6">
<label>Descrizione</label>
<input type ="text" name= "description" class="form-control" value="<?php echo isset($user_description) ? $user_description : ''; ?>">
</div>
</div>
<div class="row mt-3">
<div class="col-sm-12">
<label> Seleziona immagine da caricare </label>
<input type="file" name="fileToUpload" id="fileToUpload" class="form-control" value=" <?php echo isset($image) ? $image : ''; ?>">
</div>
</div>
<div class="row mt-3">
<div class="col-sm-4">
<label>Stato</label>
<input type ="text" name= "state" class="form-control" value="<?php echo isset($state) ? $state : ''; ?>">
</div>
<div class="col-sm-4">
<label>Paese</label>
<input type ="text" name= "country" class="form-control" value="<?php echo isset($country) ? $country : ''; ?>">
</div>
<div class="col-sm-4">
<label>CAP</label>
<input type ="text" name= "pincode" class="form-control" value="<?php echo isset($pincode) ? $pincode : '' ?>">
</div>
</div>
<div class="row mt-3">
<div class="col-sm-12">
<label>Nome College</label>
<input type ="text" name= "college" class="form-control" value="<?php echo isset($college) ? $college : ''; ?>">
</div>
</div>
<?php if( isset($_GET['post_id']) && $_GET['post_id']!=""){?>
<div class="row mb-5 mt-3">
<div class="col-sm-12">
<input type="submit" name="update" value="aggiorna" class="btn btn-primary">
</div>
<?php } else {
?>
</div>
<div class="row mb-5 mt-3">
<div class="col-sm-12">
<input type="submit" name="submit" value="invia" class="btn btn-primary">
</div>
</div>
<?php }
?>
</form>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
