Come aggiornare i campi personalizzati utilizzando la funzione wp_insert_post()?
La funzione WordPress viene utilizzata per inviare dati in modo programmatico. I campi standard da inviare includono il contenuto, l'estratto, il titolo, la data e molti altri.
Quello che non è documentato è come inviare dati a un campo personalizzato. So che è possibile con la funzione add_post_meta($post_id, $meta_key, $meta_value, $unique);
Ma come includere questo nella funzione standard wp_insert_post
?
<?php
$my_post = array(
'post_title' => $_SESSION['booking-form-title'],
'post_date' => $_SESSION['cal_startdate'],
'post_content' => 'Questo è il mio post.',
'post_status' => 'publish',
'post_type' => 'booking',
);
wp_insert_post( $my_post );
?>

Se leggi la documentazione per wp_insert_post
, essa restituisce l'ID del post che hai appena creato.
Se combini questa funzione con la seguente __update_post_meta
(una funzione personalizzata che ho acquisito da questo sito e adattato leggermente)
/**
* Aggiorna i meta di un post. Elimina o aggiunge automaticamente il valore al field_name se specificato
*
* @access protected
* @param integer L'ID del post che stiamo aggiornando
* @param string Il campo che stiamo aggiornando/aggiungendo/eliminando
* @param string [Opzionale] Il valore da aggiornare/aggiungere per field_name. Se lasciato vuoto, i dati verranno eliminati.
* @return void
*/
public function __update_post_meta( $post_id, $field_name, $value = '' )
{
if ( empty( $value ) OR ! $value )
{
delete_post_meta( $post_id, $field_name );
}
elseif ( ! get_post_meta( $post_id, $field_name ) )
{
add_post_meta( $post_id, $field_name, $value );
}
else
{
update_post_meta( $post_id, $field_name, $value );
}
}
Otterrai il seguente risultato:
$my_post = array(
'post_title' => $_SESSION['booking-form-title'],
'post_date' => $_SESSION['cal_startdate'],
'post_content' => 'Questo è il mio post.',
'post_status' => 'publish',
'post_type' => 'booking',
);
$the_post_id = wp_insert_post( $my_post );
__update_post_meta( $the_post_id, 'my-custom-field', 'my_custom_field_value' );

Grazie mille. Potresti darmi un'idea sull'implementazione? Cioè, quale parte del codice va dove. Molte grazie

Ben fatto. Il secondo blocco di codice sostituisce il tuo, i valori della funzione sono la coppia chiave/valore del campo personalizzato. Metti la funzione o in cima allo script, o in un file .php separato incluso all'inizio dello script.

Come nota, io uso OOP quindi questo è il motivo per il modificatore public
davanti a "function". Se includi la funzione stessa senza metterla in una classe, non devi aggiungere public

Ciao Zack, Aendrew e Philip. Tutto funziona perfettamente, però ho provato ad applicarlo anche a una query senza successo. Non riesco proprio a capire il motivo. Ecco il link, visto che conoscete tutti come funzionava inizialmente il nuovo post con campi personalizzati, pensavo poteste individuare il mio errore. http://wordpress.stackexchange.com/questions/8622/wp-insert-post-php-function-dynamically-generated-custom-fields

@Zack - Bella risposta. Ma tenderei a evitare l'uso di underscore iniziali nei nomi delle funzioni, se non altro perché i nomi con underscore iniziali vengono solitamente usati dagli sviluppatori della piattaforma quando vogliono creare funzioni "riservate" o (pseudo) "nascoste", quindi chi li vede potrebbe pensare che si tratti di funzioni della piattaforma, o peggio potrebbero entrare in conflitto con una futura funzione del core di WordPress. Solo un pensiero.

@MikeSchinkel: Inizialmente avevo usato "__" per le funzioni protette all'interno di una classe, ma poi ho modificato la struttura del mio plugin in modo che la funzione doveva essere pubblica. Avrei anche voluto chiamarla semplicemente "update_post_meta" ma questo avrebbe sicuramente creato conflitto con le funzioni core di WordPress. Quindi non sapevo come chiamarla :(

@Zack - Forse zacks_update_post_meta()
? :) L'altro problema che non ho menzionato con gli underscore iniziali è che qualcun altro altrettanto creativo potrebbe usare la stessa convenzione in un plugin e quindi entrare in conflitto con il tuo. A proposito, sapevi che update_post_meta()
aggiunge se non esiste? add_post_meta()
è necessario solo quando vuoi aggiungere chiavi duplicate.

@MikeSchinkel: Originariamente ho trovato la funzione su questo sito, mi è piaciuta e l'ho rifattorizzata solo perché sono fatto così. Avevo anche intuito che update_post_meta()
facesse già così, ma non ne ero sicuro. Quando ho trovato la funzione, ho saltato alle conclusioni.

@Zack - Ehi, imparare WordPress è un viaggio. Credo di avere ancora almeno il 50% di quel viaggio davanti a me, se non molto di più!

Puoi semplicemente aggiungere la funzione 'add_post_meta' dopo 'wp_insert_post'
<?php
$my_post = array(
'post_title' => $_SESSION['booking-form-title'],
'post_date' => $_SESSION['cal_startdate'],
'post_content' => 'Questo è il mio articolo.',
'post_status' => 'publish',
'post_type' => 'booking',
);
$post_id = wp_insert_post($my_post);
add_post_meta($post_id, 'META-KEY-1', 'META_VALUE-1', true);
add_post_meta($post_id, 'META-KEY-2', 'META_VALUE-2', true);
?>

Puoi aggiungere l'elemento 'meta_input' nei parametri del post come un array di valori di metadati del post indicizzati dalla loro chiave di metadato
<?php
$my_post = array(
'post_title' => $_SESSION['booking-form-title'],
'post_date' => $_SESSION['cal_startdate'],
'post_content' => 'Questo è il mio post.',
'post_status' => 'publish',
'post_type' => 'booking',
'meta_input' => array(
'your_custom_meta_field_name' => $_SESSION['your_custom_meta_field_value']
)
);
wp_insert_post( $my_post );
?>

Non utile. $post->ID non è disponibile per wp_insert_post_data, il che è necessario per creare campi personalizzati.

@aendrew L'azione save_post
è alla fine della funzione, ha l'ID del post e l'oggetto passato, la risposta è valida.

Sono abbastanza sicuro che sia stato modificato, Rarst. Comunque, ora ha senso.

Non credo tu possa usarlo con wp_insert_post();.
Il motivo è legato a come WordPress memorizza i due tipi di dati. I post vengono archiviati in una grande tabella monolitica con una dozzina di colonne diverse (wp_posts); i campi personalizzati vengono memorizzati in una tabella più semplice a 4 colonne (wp_postmeta) composta principalmente da una chiave meta e un valore, associati a un post.
Di conseguenza, non puoi realmente memorizzare campi personalizzati finché non hai l'ID del post.
Prova questo:
function myplugin_insert_customs($pid){
$customs = array(
'post_id' => $pid,
'meta_key' => 'La tua chiave meta',
'meta_value' => 'Il tuo valore meta',
);
add_post_meta($customs);
}
add_action('save_post', 'myplugin_insert_customs', 99);
Questo articolo del Codex è stato utile -- è più o meno l'opposto di quello che stai facendo (cioè, eliminare una riga del database alla cancellazione di un post): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post

In quel caso l'unica soluzione che vedo è utilizzare una sessione, sarebbe corretto?

No; immagino che il tuo plugin stia cercando di inserire campi personalizzati nello stesso momento in cui un articolo viene salvato, giusto? Penso che quello che devi fare sia agganciarti a WP dopo che l'articolo è stato salvato, prendere il nuovo ID numero dell'articolo, e poi fornirlo a add_post_meta(); per creare i campi personalizzati. Aggiornerò la mia risposta tra un secondo con del codice.

Grazie per l'aiuto. A proposito non è un plugin. L'ho scritto in modo da poterlo personalizzare il più possibile. (ma non pensare che sia bravo con php, è solo prova e errore)
