Avisos al enviar un tipo de publicación personalizada desde el front-end
Tengo un formulario en una plantilla de página que permite a los usuarios enviar publicaciones a un tipo de publicación personalizada desde el front-end:
$post = array(
'post_status' => 'draft',
'post_type' => 'stories',
'post_content' => wp_kses_post( $story_content ),
'post_title' => esc_attr( wp_kses( $story_title, array() ) ),
'post_author' => 4,
);
// Insertar la historia en la base de datos
$post_success = wp_insert_post( $post );
Funciona, pero recibo estos avisos:
PHP Notice: Trying to get property of non-object in /Users/username/Sites/the_site/wp-includes/comment-template.php on line 776
PHP Notice: Trying to get property of non-object in /Users/username/Sites/the_site/wp-includes/comment-template.php on line 793
PHP Notice: Trying to get property of non-object in /Users/username/Sites/the_site/wp-includes/general-template.php on line 1645
PHP Notice: Trying to get property of non-object in /Users/username/Sites/the_site/wp-includes/link-template.php on line 1106
PHP Notice: Trying to get property of non-object in /Users/username/Sites/the_site/wp-includes/link-template.php on line 1148
PHP Notice: Trying to get property of non-object in /Users/username/Sites/the_site/wp-includes/link-template.php on line 1106
PHP Notice: Trying to get property of non-object in /Users/username/Sites/the_site/wp-includes/link-template.php on line 1148
He revisado los archivos mencionados y parece estar relacionado con el comment_status
y ping_status
de la publicación enviada. Sin embargo, supongo que los valores predeterminados de wp_insert_post
deberían incluir valores para esos campos. Incluso cuando los establezco en mi array de argumentos, sigo recibiendo los avisos. ¿Cómo solucionar esto para eliminar los avisos?

El problema está en usar la variable $post
para los argumentos. Después de cambiarlo a algo como $new_post
ya no recibo los avisos.
Debe haber algún conflicto con el global $post
que usa WordPress.
Lo tomé del Codex, pero al volver a mirar la página, me di cuenta de que $post
solo se refería al nombre del argumento y el ejemplo real en el codex no usa $post
para el array de argumentos.

Insertar Datos en un Custom Post desde el Front End
if ( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == "product") {
$title = $_POST['title'];
$post_type = 'product';
//el array de argumentos para ser insertados con wp_insert_post
$front_post = array(
'post_title' => $title,
'post_status' => 'publish',
'post_type' => $post_type
);
//insertar el post en la base de datos pasando $new_post a wp_insert_post
//almacenar nuestro ID de post en una variable $pid
$post_id = wp_insert_post($front_post);
//ahora usamos $pid (post id) para ayudar a añadir nuestros metadatos
update_post_meta($post_id, "short_description", @$_POST["short_description"]);
update_post_meta($post_id, "price", @$_POST["price"]);
update_post_meta($post_id, "length", @$_POST["length"]);
Código HTML Aquí
<form method="POST">
<label>Nombre del Producto</label>
<input type="text" value="" class="input-xlarge" name='title'>
<label>Descripción del Producto</label>
<textarea value="" rows="3" class="input-xlarge" name='short_description'>
</textarea>
<label>Precio</label>
<input type="text" value="" class="input-xlarge" name='price'>
<label>Dimensiones (pulgadas):</label>
<input type="text" value="" class="input-xlarge" name='length' placeholder="Largo">
<div>
<button class="btn btn-primary">Añadir Producto</button>
</div>
<input type="hidden" name="action" value="product" />
</form>

Parece que aún no puedo comentar, pero tienes una coma extra en tu array.
$post = array(
'post_status' => 'draft', // borrador
'post_type' => 'stories', // historias
'post_content' => wp_kses_post( $story_content ), // contenido de la historia
'post_title' => esc_attr( wp_kses( $story_title, array() ) ), // título de la historia
'post_author' => 4, //AQUÍ HAY UNA COMA EXTRA
);
Quizás ese sea tu problema.
'post_author' => 4,
debería ser
'post_author' => 4
