WP menyisipkan pos fungsi PHP dan Bidang Kustom

26

Fungsi WordPress digunakan untuk mengirimkan data secara programatik. Bidang standar untuk dikirimkan untuk memasukkan konten, kutipan, judul, tanggal, dan banyak lagi.

Untuk apa tidak ada dokumentasi adalah cara mengirim ke bidang khusus. Saya tahu itu mungkin dengan add_post_meta($post_id, $meta_key, $meta_value, $unique);fungsinya.

Tapi, bagaimana memasukkannya ke dalam wp_insert_postfungsi standar ?

<?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 );
  ?>
Robin I Knight
sumber

Jawaban:

35

Jika Anda membaca dokumentasi untuk wp_insert_post, itu mengembalikan ID posting dari posting yang baru saja Anda buat.

Jika Anda menggabungkannya dengan fungsi berikut __update_post_meta(fungsi khusus yang saya peroleh dari situs ini dan sedikit diadaptasi)

/**
  * 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 );
    }
}

Anda akan mendapatkan yang berikut ini:

$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' );
Zack
sumber
Terima kasih banyak. Bisakah Anda memberi saya ide tentang implantasi. YAITU. yang tetapi kode pergi ke mana. Terima kasih banyak
Robin I Knight
2
Bagus sekali. Blok kode kedua menggantikan milik Anda, nilai fungsi adalah pasangan bidang kunci / nilai kustom. Letakkan fungsi di bagian atas skrip, atau dalam file .php terpisah yang disertakan di bagian atas skrip.
aendrew
1
Sebagai catatan, saya menggunakan OOP jadi itulah alasan untuk publicpengubah di depan "fungsi". Jika Anda memasukkan fungsi itu sendiri tanpa memasukkannya ke dalam kelas, Anda tidak perlu menambahkanpublic
Zack
Halo Zack, Aendrew dan Philip. Semuanya berfungsi dengan baik namun saya mencoba menerapkannya ke kueri juga tetapi tidak berhasil. Saya tidak mengerti mengapa. Ini tautannya karena Anda semua tahu cara kerja bidang kustom awal baru menurut saya, Anda mungkin akan melihat kesalahan saya. wordpress.stackexchange.com/questions/8622/…
Robin I Knight
1
Saya tidak dapat menambahkan jawaban, karena saya tidak memiliki reputasi di wordpress.stackexchange. Sampai hari ini ada metode baru, Anda dapat dengan mudah memasukkan sebuah array ke wp_insert_post sebagai: meta_input => array (key => value)
Frederik Witte
13

Anda dapat dengan mudah menambahkan 'add_post_meta' setelah '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);
?>
Philip
sumber
1

Saya tidak berpikir Anda dapat menggunakannya dengan wp_insert_post () ;.

Alasannya adalah karena cara WP menyimpan dua tipe data. Posting disimpan dalam satu tabel monolitik besar dengan selusin kolom berbeda (wp_posts); bidang khusus disimpan dalam tabel 4-kolom yang lebih sederhana (wp_postmeta) yang sebagian besar terdiri dari kunci meta dan nilai, yang terkait dengan kiriman.

Akibatnya, Anda tidak dapat menyimpan bidang khusus hingga Anda memiliki ID kiriman.

Coba ini:

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);

Posting codex ini membantu - ini agak kebalikan dari apa yang Anda lakukan (yaitu, menghapus baris DB demi penghapusan posting): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post

aendrew
sumber
Dalam hal itu satu-satunya jalan keluar yang bisa saya lihat adalah menggunakan sesi, apakah itu benar.
Robin I Knight
Tidak; Saya menduga plugin Anda sedang mencoba menyisipkan bidang khusus pada saat yang sama sebuah pos disimpan, kan? Saya pikir apa yang perlu Anda lakukan adalah menghubungkan ke WP setelah postingan disimpan, ambil nomor ID baru postingan itu, lalu berikan itu ke add_post_meta (); untuk membuat CF. Saya akan memperbarui jawaban saya dalam beberapa detik dengan beberapa kode.
aendrew
Terima kasih untuk bantuannya. Ngomong-ngomong itu bukan plugin. Saya menulisnya sehingga kami dapat menyesuaikannya sebanyak yang diperlukan. (tapi jangan menganggap itu berarti saya baik-baik saja dengan php, hanya trial and error)
Robin I Knight
Itu tema, kalau begitu? Satu-satunya perbedaan nyata adalah Anda meletakkannya di functions.php, dalam hal ini.
aendrew
1

Gunakan save_postfilter, lalu panggil add_post_metafungsi filter Anda.

Micah Ernst
sumber
Tidak membantu. $ post-> ID tidak tersedia untuk wp_insert_post_data, yang diperlukan untuk membuat bidang khusus.
aendrew
@Andrew save_postaction ada di bagian paling akhir dari fungsi, memiliki ID postingan dan objek diteruskan ke sana, jawabannya adalah suara.
Rarst
1
Saya cukup yakin ini diedit, Rarst. Bagaimanapun, itu masuk akal sekarang.
aendrew
@ ahendrew ah, maaf - tidak menyadarinya
Rarst