WP inserisci post PHP e campi personalizzati


26

La funzione WordPress viene utilizzata per l'invio di dati a livello di codice. Campi standard da inviare per includere contenuto, estratto, titolo, data e molti altri.

Ciò per cui non esiste documentazione è come inviare a un campo personalizzato. So che è possibile con la add_post_meta($post_id, $meta_key, $meta_value, $unique);funzione.

Ma come includerlo nella wp_insert_postfunzione standard ?

<?php 
$my_post = array(
     'post_title' => $_SESSION['booking-form-title'],
     'post_date' => $_SESSION['cal_startdate'],
     'post_content' => 'This is my post.',
     'post_status' => 'publish',
     'post_type' => 'booking',
  );
  wp_insert_post( $my_post );
  ?>

Risposte:


35

Se leggi la documentazione per wp_insert_post, restituisce l'ID del post appena creato.

Se lo combini con la seguente funzione __update_post_meta(una funzione personalizzata che ho acquisito da questo sito e adattata un po ')

/**
  * Updates post meta for a post. It also automatically deletes or adds the value to field_name if specified
  *
  * @access     protected
  * @param      integer     The post ID for the post we're updating
  * @param      string      The field we're updating/adding/deleting
  * @param      string      [Optional] The value to update/add for field_name. If left blank, data will be deleted.
  * @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 quanto segue:

$my_post = array(
    'post_title' => $_SESSION['booking-form-title'],
    'post_date' => $_SESSION['cal_startdate'],
    'post_content' => 'This is my 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'impianto. IE. quale ma di codice va dove. Mille grazie
Robin I Knight,

2
Ben fatto. Il secondo blocco di codice sostituisce il tuo, i valori della funzione sono la coppia chiave / valore del campo personalizzata. Inserisci la funzione nella parte superiore dello script o in un file .php separato incluso nella parte superiore dello script.
aendrew

1
Come nota, io uso OOP, quindi questo è il motivo del publicmodificatore di fronte a "funzione". Se stai includendo la funzione stessa senza metterla in una classe, non è necessario aggiungerepublic
Zack

Ciao Zack, Aendrew e Philip. Tutto funziona alla perfezione, ma ho provato ad applicarlo anche a una query senza risultati. Non capisco bene perché. Ecco il link poiché tutti voi sapete come ha funzionato il nuovo campo personalizzato iniziale, ho pensato che potreste vedere il mio errore. wordpress.stackexchange.com/questions/8622/…
Robin I Knight,

1
Non riesco ad aggiungere una risposta, in quanto non ho reputazione su wordpress.stackexchange. Ad oggi esiste un nuovo metodo, puoi semplicemente inserire un array in wp_insert_post come: meta_input => array (key => value)
Frederik Witte

13

Puoi semplicemente aggiungere "add_post_meta" dopo "wp_insert_post"

<?php 
$my_post = array(
     'post_title' => $_SESSION['booking-form-title'],
     'post_date' => $_SESSION['cal_startdate'],
     'post_content' => 'This is my post.',
     '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);
?>

1

Non penso che tu possa usarlo con wp_insert_post () ;.

Il motivo è dovuto al modo in cui WP memorizza i due tipi di dati. I post sono archiviati in una grande tabella monolitica con una dozzina di colonne diverse (wp_posts); i campi personalizzati sono memorizzati in una tabella a 4 colonne più semplice (wp_postmeta) composta principalmente da una meta chiave e un valore, associati a un post.

Di conseguenza, non è possibile archiviare realmente i campi personalizzati fino a quando non si ha l'ID del post.

Prova questo:

function myplugin_insert_customs($pid){

    $customs = array(
    'post_id' => $pid,
    'meta_key' => 'Your meta key',
    'meta_value' => 'Your meta value',
    );

    add_post_meta($customs);

}

add_action('save_post', 'myplugin_insert_customs', 99);

Questo post sul codice ha aiutato - è un po 'l'opposto di quello che stai facendo (ovvero, cancellare una riga DB dopo l'eliminazione post): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post


In tal caso, l'unica via d'uscita che posso vedere è quella di utilizzare una sessione, sarebbe corretto.
Robin I Knight,

Nah; Immagino che il tuo plug-in stia cercando di inserire campi personalizzati contemporaneamente al salvataggio di un post, giusto? Penso che ciò che devi fare sia agganciarti a WP dopo aver salvato il post, prendere il nuovo numero ID del post, quindi fornirlo a add_post_meta (); per creare i CF. Aggiornerò la mia risposta in un secondo con del codice.
aendrew

Grazie per l'aiuto. A proposito non è un plugin. L'ho scritto in modo che possiamo personalizzarlo quanto basta. (ma non dare per scontato che sto bene con php, solo prove ed errori)
Robin I Knight,

È un tema, allora? L'unica vera differenza è che l'avresti messo in Functions.php, in quel caso.
aendrew

1

Usa il save_postfiltro, quindi chiama la add_post_metatua funzione filtro.


Inutile. $ post-> ID non è disponibile per wp_insert_post_data, necessario per creare campi personalizzati.
aendrew

L' save_postazione @aendrew è alla fine della funzione, ha l'ID post e l'oggetto passato ad essa, la risposta è valida.
Rarst

1
Sono abbastanza sicuro che sia stato modificato, Rarst. Indipendentemente da ciò, ora ha senso.
Annunciato il

@aendrew ah, mi spiace - non me ne sono accorto
Rarst
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.