Agregar elementos de tipo de entrada personalizada desde el frontend
Estoy tratando de averiguar cómo hacer que mi sitio web de WordPress pueda agregar elementos de portfolio
desde el frontend. Plugins como WP-User-Frontend permiten publicar desde el frontend pero solo funcionan con entradas de blog.
¿Hay alguna manera o algún plugin similar a wp-user-frontend pero que permita agregar elementos de tipos de entrada personalizados?

Si estás dispuesto a pagar por ello, el plugin Gravity Forms te permite crear formularios que se mapean con tus Tipos de Entradas Personalizadas (incluso con entradas y páginas regulares) así como con tus campos personalizados.
Para aquellos que no lo estén y estén dispuestos a arremangarse, puedes crear un formulario en el front-end que publique datos en cualquier tipo de entrada que elijas de manera bastante sencilla.
Aquí tienes un ejemplo básico:
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == "my_post_type") {
//almacenamos nuestras variables POST en variables para su uso posterior
//este sería un buen momento para hacer alguna comprobación/validación básica de errores
//para asegurarnos de que los datos para estos valores han sido establecidos
$title = $_POST['title'];
$content = $_POST['content'];
$post_type = 'my_custom_post';
$custom_field_1 = $_POST['custom_1'];
$custom_field_2 = $_POST['custom_2'];
//el array de argumentos para ser insertados con wp_insert_post
$new_post = array(
'post_title' => $title,
'post_content' => $content,
'post_status' => 'publish',
'post_type' => $post_type
);
//insertamos la entrada en la base de datos pasando $new_post a wp_insert_post
//almacenamos nuestro ID de entrada en una variable $pid
$pid = wp_insert_post($new_post);
//ahora usamos $pid (ID de entrada) para ayudar a añadir nuestros metadatos
add_post_meta($pid, 'meta_key', $custom_field_1, true);
add_post_meta($pid, 'meta_key', $custom_field_2, true);
}
Tu formulario HTML se vería algo similar a:
<form method="post" name="front_end" action="" >
<input type="text" name="title" value="Mi Título de Entrada" />
<input type="text" name="content" value="Mi Contenido de Entrada" />
<input type="text" name="custom_1" value="Contenido del Campo Personalizado 1" />
<input type="text" name="custom_2" value="Contenido del Campo Personalizado 2" />
<button type="button">Enviar</button>
<input type="hidden" name="action" value="my_post_type" />
</form>
Puedes colocar todo esto en tu archivo de plantilla del tema. Normalmente, yo iría un paso más allá y ejecutaría la lógica de procesamiento (PHP) desde una función dentro de mi functions.php enganchada a una acción, pero también funcionará desde un archivo de plantilla del tema.
Este es solo un ejemplo básico y carece de cualquier comprobación y validación de errores seria. Sin embargo, te proporciona el marco esencial para lo que necesitas para publicar desde el front-end a tus tipos de entrada en el back-end.
También hay numerosos tutoriales que amplían este tema en WPSE, si realizas una búsqueda encontrarás una gran cantidad de información.

<?php
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == "front_post") {
//almacenamos nuestras variables POST en variables para uso posterior
//este sería un buen momento para hacer alguna validación básica
//para asegurarnos que los datos para estos valores han sido establecidos
$title = $_POST['title'];
$content = $_POST['content'];
$tags = $_POST['tag'];
$custom_field = $_POST['custom_1'];
$post_type = 'frontpost';
//el array de argumentos a insertar 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
);
//insertamos el post en la base de datos pasando $new_post a wp_insert_post
//almacenamos nuestro ID de post en una variable $pid
//usamos $pid (id del post) para ayudar a añadir nuestros metadatos
$pid=wp_insert_post($new_post);
//usamos $pid (id del post) para ayudar a añadir nuestros metadatos
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="Título del FrontPost" required />
<textarea name="content" placeholder="Contenido del FrontPost" rows="5" ></textarea>
<input type="text" name="tag" placeholder="Etiquetas del FrontPost" />
<input type="text" name="custom_1" placeholder="Contenido del Campo Personalizado" />
<span><?php wp_dropdown_categories( 'tab_index=10&taxonomy=category&hide_empty=0' ); ?></span>
<button type="submit">Enviar</button>
<input type="hidden" name="action" value="front_post" />
</form>
</div>
¡Prueba esto, te ayudará! Aakib :)

insertar post
add_action('init', function() {
if (isset($_POST['submit'])) {
if (!is_user_logged_in()) {
echo 'Debes estar conectado para enviar un post.';
return;
}
$title = sanitize_text_field($_POST['name']);
$description = sanitize_textarea_field($_POST['description']);
$create_post = array(
'post_status' => 'publish',
'post_type' => 'user', // Asegúrate de que el tipo de post 'user' esté registrado
'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 '¡Error al subir el archivo!';
}else{
set_post_thumbnail($post_id,$attachement_id);
}
}
return $post_id ? 'Post creado exitosamente' : 'Error al crear el 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 creado exitosamente!';
} else {
echo 'Error al crear el post.';
}
}
});
aquí 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>Nombre</label>
<input type="text" name="name" class="form-control" value="<?php echo isset($user_name) ? $user_name : ''; ?>">
</div>
<div class="col-sm-6">
<label>Descripción</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> Seleccionar imagen para subir </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>Estado</label>
<input type ="text" name= "state" class="form-control" value="<?php echo isset($state) ? $state : ''; ?>">
</div>
<div class="col-sm-4">
<label>País</label>
<input type ="text" name= "country" class="form-control" value="<?php echo isset($country) ? $country : ''; ?>">
</div>
<div class="col-sm-4">
<label>Código postal</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>Nombre de la universidad </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="actualizar" 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="enviar" 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>
