Melampirkan data taksonomi untuk diposkan dengan wp_insert_post


17

Saya mencoba menerapkan sistem posting ujung depan yang menampilkan data taksonomi di beberapa bidang pilih turun bawah. Setiap dropdown diberi nama dengan menggunakan "nama" $argdi wp_dropdown_categories().

wp_dropdown_categories( array(
    'taxonomy'      => 'location',
    'hide_empty'    => 0,
    'orderby'       => 'name',
    'order'         => 'ASC',
    'name'          => 'location',
) );

Seperti yang Anda lihat, taksonomi adalah "lokasi" dan nama yang dipilih juga "lokasi".

Saya kemudian menambahkan variabel untuk masing-masing dropdown pilih taksonomi seperti begitu bersama dengan post_title, post_content dll:

$title          = trim( $_POST['wpuf_post_title'] );
$content        = trim( $_POST['wpuf_post_content'] );
$tags           = wpuf_clean_tags( $_POST['wpuf_post_tags'] );
$customcategory = trim( $_POST['customcategory'] );
$cat            = trim( $_POST['cat'] );
$location       = trim( $_POST['location'] );
$sale_rental    = trim( $_POST['sale_rental'] );
$price          = trim( $_POST['price'] );

Akhirnya saya menambahkan info tambahan ke dalam array yang siap dikirim oleh wp_insert_post(). Saya cukup terjebak pada apakah saya melakukan hal yang benar dengan menambahkan tax_inputke dalam array seperti di bawah ini karena ini adalah apa yang saya pahami dari codex yang perlu saya lakukan.

'tax-input' => array( 
    $location,
    $sale_rental,
    $price
),

Sehingga semuanya tampak seperti ini:

$my_post = array(
    'post_title'    => $title,
    'post_content'  => $content,
    'post_status'   => $post_status,
    'post_author'   => $userdata->ID,
    'post_category' => array( $_POST['cat'] ),
    'post_type'     => $customcategory,
    'tags_input'    => $tags,
    'tax_input'     => array( 
        $location,
        $sale_rental,
        $price
    ),
);

$post_id = wp_insert_post( $my_post );

Namun, ketika saya mengirim posting baru, semua data posting standar (dan juga tipe posting kustom saya) masuk ok tapi taksonomi tidak. Saya jelas melakukan sesuatu yang salah tetapi apa?

Jawaban:


25

Gunakan wp_set_object_termssetelah Anda memiliki id pos untuk setiap taksonomi:

...
$post_id = wp_insert_post( $my_post );
wp_set_object_terms( $post_id, $location, 'location' );
wp_set_object_terms( $post_id, $sale_rental, 'sale_rental' );
wp_set_object_terms( $post_id, $price, 'price' );

Saya hanya tidak tahu di mana saya akan berada tanpa bantuan Anda, bekerja pertama kali ... terima kasih banyak Bainternet. Ditandai sebagai dijawab
MartinJJ

Senang saya bisa membantu :)
Bainternet

Apakah $ location dan $ sale_rental array integer atau string?
Doug

5

Anda dapat melakukannya menggunakan wp_insert_post , tetapi Anda juga harus menentukan taksonomi tax_input, sehingga harus terlihat seperti ini:

$item['tax_input'] = array (
    'location'      => implode( ',', $location ),
    'sale_rental'   => implode( ',', $sale_rental ),
    'price'         => implode( ',', $price ),
)

Saya menggunakan implode()sehingga $locationbisa menjadi array dengan banyak istilah.

Juga, perhatikan bahwa ini hanya berfungsi untuk taksonomi non-hierarkis. Untuk taksonomi hierarkis, Anda harus menyediakan array alih-alih astring.


2

Sumber masalahnya

Setelah beberapa penelitian untuk topik ini, saya diberitahu untuk memeriksa bagian dalam (yang saya lakukan). Karena saya mengimpor posting dari umpan eksternal sebagai jenis posting khusus, saya cukup mengatur pengguna -1(alih-alih menambahkan pengguna bot). Masalah yang saya temui adalah bahwa wp_insert_post()dengan satu tax_inputset, secara internal memeriksa kemampuan pengguna, yang jelas tidak dimiliki oleh pengguna yang sudah ada.

SysBot untuk penyelamatan

Solusinya kemudian adalah saya menulis plugin SysBot . Dengan cara ini saya bisa dengan mudah melampirkan pengguna SysBot (yang memiliki peran editor ) ke posting yang baru dibuat dan semuanya bekerja seperti yang diharapkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.