Come aggiornare i campi personalizzati utilizzando la funzione wp_insert_post()?

4 feb 2011, 22:10:23
Visualizzazioni: 81K
Voti: 31

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 );
  ?>
0
Tutte le risposte alla domanda 5
10
35

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' );
4 feb 2011 23:01:57
Commenti

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

Robin I Knight Robin I Knight
4 feb 2011 23:13:58

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.

aendra aendra
4 feb 2011 23:37:11

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

Zack Zack
5 feb 2011 05:13:38

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

Robin I Knight Robin I Knight
5 feb 2011 19:22:23

@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 MikeSchinkel
5 feb 2011 19:46:08

@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 Zack
5 feb 2011 19:50:08

@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 MikeSchinkel
5 feb 2011 20:01:08

@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 Zack
5 feb 2011 20:04:00

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

MikeSchinkel MikeSchinkel
5 feb 2011 20:06:43

Non posso aggiungere una risposta, poiché non ho abbastanza reputazione su wordpress.stackexchange. Ad oggi c'è un nuovo metodo, puoi semplicemente inserire un array in wp_insert_post come: meta_input => array(chiave=>valore)

Frederik Witte Frederik Witte
15 ott 2016 12:59:23
Mostra i restanti 5 commenti
0
17

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);
?>
5 feb 2011 10:58:21
0

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 );
  ?>
21 set 2020 02:44:33
4

Utilizza il filtro save_post, quindi chiama add_post_meta nella tua funzione di filtro.

4 feb 2011 22:30:13
Commenti

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

aendra aendra
4 feb 2011 22:40:01

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

Rarst Rarst
5 feb 2011 02:16:12

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

aendra aendra
5 feb 2011 04:04:54

@aendrew ah, scusa - non l'avevo notato

Rarst Rarst
5 feb 2011 11:46:54
4

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

4 feb 2011 22:31:37
Commenti

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

Robin I Knight Robin I Knight
4 feb 2011 22:42:46

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.

aendra aendra
4 feb 2011 22:48:58

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)

Robin I Knight Robin I Knight
4 feb 2011 22:52:01

È un tema, allora? L'unica vera differenza è che dovresti inserirlo in functions.php, in quel caso.

aendra aendra
4 feb 2011 23:00:49