Apakah ada cara untuk mengatur bidang khusus default saat membuat posting?

11

Ketika saya membuat posting baru, tepat setelah mengklik "Tambah Baru" , ketika editor posting menunjukkan, alih-alih harus menggunakan dropdown dan memilih bidang khusus untuk digunakan, saya ingin memiliki beberapa input bidang khusus standar sudah openend.

Secara visual, alih-alih:

masukkan deskripsi gambar di sini

Saya ingin memiliki sesuatu seperti:

masukkan deskripsi gambar di sini

Saya tahu ada plugin untuk itu (CPT, Lebih banyak bidang, dll) tetapi saya ingin cara sederhana untuk melakukannya dengan fungsi dasar.

Saya mencoba sesuatu seperti ini (Saya menggunakan 'produk' jenis pos kustom):

function register_custom_fields( $post_ID ) {

    global $wpdb;

        if( !wp_is_post_revision( $post_ID ) ) {

            add_post_meta( $post_ID, 'reference', '', true);
            add_post_meta( $post_ID, 'price', '', true);

        }

}

add_action('edit_product', 'register_custom_fields');

Tapi itu sepertinya tidak berhasil. Saya berpikir bahwa pengaitnya mungkin salah (karena edit_postmuncul setelah pembaruan), tetapi saya tidak melihat pengait untuk "pos baru" (tepat setelah pengguna mengklik "pos baru" di admin wp). Apakah ada ?

Atau mungkin seluruh idenya salah dan ada cara lain?

mike23
sumber

Jawaban:

9

Kait tindakan save_postdipanggil simpan, tetapi saya tidak tahu apakah Anda dapat menambahkan metadata saat ini. Tetapi harus dimungkinkan untuk membuat / memperbarui data meta Anda setelah pos disimpan dengan kait tindakan updated_post_meta.

EDIT

Untuk pra-pilih beberapa bidang meta (bidang khusus) pada layar pembuatan posting, Anda harus menambahkan nilai-nilai meta ini terlebih dahulu dengan nilai kosong.

Jika Anda melihat post_custom_meta_box()fungsi (yang merupakan panggilan balik untuk metabox yang digunakan postcustom) dalam file wp-admin/includes/meta-boxes.php, Anda dapat melihat bahwa fungsi tersebut digunakan list_meta()untuk membuat bidang meta yang dipilih sebelumnya.

Sekarang mari kita lihat aliran program sampai metabox ini ditampilkan (Kami sedang mencari kait tindakan / filter yang dapat kami gunakan di sini):

  1. WordPress memuat file tersebut post-new.php
  2. File ini menghasilkan posting default di database sesuai 39dengan fungsinya get_default_post_to_edit(). Itu bagus. Pada dasarnya posting sudah ada di database sebagai konsep otomatis. Sayangnya tidak ada pengait pada saat ini untuk mengubah data ini atau menambahkan sesuatu yang baru.
  3. Sebagai langkah selanjutnya, file edit-form-advaned.phpdisertakan. File ini akan menghasilkan halaman admin lubang dan mencakup semua metabox yang diperlukan berdasarkan supportsparameter dari jenis posting.
  4. Secara online 136metabox bidang khusus postcustomdisertakan dan fungsi di atas disebut. Sekali lagi, tidak ada kait tindakan yang bisa kita gunakan.

Kesimpulan

Saya pikir satu-satunya cara yang dapat Anda lakukan adalah menggunakan jQuery atau membebani postcustommetabox dan menambahkan nilai-nilai meta sebelum Anda menjalankan list_meta()fungsi.

Misalnya

add_action('admin_menu', 'wpse29358_replaceMetaBoxes'); // maybe add_meta_boxes hook
function wpse29358_replaceMetaBoxes() {
    remove_meta_box('postcustom', {POST_TYPE}, 'normal');
    add_meta_box('postcustom', __('Custom Fields'), 'wpse29358_postcustomMetabox', {POST_TYPE}, 'normal', 'core');
}

function wpse29358_postcustomMetabox($post) {
    // Add your meta data to the post with the ID $post->ID
    add_post_meta($post->ID, 'key', 'value');

    // and then copy&past the metabox content from the function post_custom_meta_box()
}
rofflox
sumber
Masalahnya adalah saya tidak mencoba menambahkan apa pun pada save untuk saat ini, saya mencoba untuk menunjukkan beberapa input bidang khusus yang sudah dibuka ketika pengguna menemukan di halaman pengeditan (lihat pembaruan dengan tangkapan layar)
mike23
Ah. Sekarang saya mengerti masalah Anda. Saya sudah mengedit jawaban saya.
rofflox
3

Ini adalah metode yang tepat untuk menambahkan dukungan bidang khusus (Anda tidak mendapatkan bidang kosong saat mengedit posting)

function set_default_meta($post_ID){
    $current_field_value = get_post_meta($post_ID,'Sort Order',true);
    $default_meta = '100'; // value
    if ($current_field_value == '' && !wp_is_post_revision($post_ID)){
            add_post_meta($post_ID,'Sort Order',$default_meta,true);
    }
    return $post_ID;
}
add_action('wp_insert_post','set_default_meta');
Yuri Korolov
sumber
1

Anda harus menggunakan tindakan save_post dan mengisolasi operasi Anda dengan memeriksa jenis posting karena ini berjalan pada semua jenis posting. Jelas ada beberapa logika yang harus Anda bangun untuk membuatnya bekerja untuk Anda. Anda mungkin harus menetapkan bidang meta pos yang memeriksa apakah Anda telah menetapkan default satu kali sehingga pengguna Anda tidak akan frustrasi jika mereka ingin membiarkan kolom meta pos kosong.

Jika Anda ingin default menjadi nol (seperti yang terlihat pada contoh kode Anda), maka jangan membuat fungsi karena ini hanya menambah overhead dan kolom pos meta tidak diisi dengan nilai secara default.

function register_custom_fields( $post_ID ) {
    //Do nonce checking here
    if( !wp_is_post_revision( $post_ID ) ) {
        if('product' === $_REQUEST['post_type']){
            $reference = $_REQUEST['reference'] ? esc_html($_REQUEST['reference']) : 'default_value';
            $price = $_REQUEST['price'] ? esc_html($_REQUEST['price']) : 'default_value';
            update_post_meta( $post_ID, 'reference', $reference);
            update_post_meta( $post_ID, 'price', $price);
        }
    }
}
add_action('save_post', 'register_custom_fields');
Brian Fegter
sumber
1

Saya mencari untuk memiliki deskripsi meta unik untuk setiap pos kustom di situs WP yang saya kembangkan. Jadi saya juga mencari bidang khusus default dan mendarat di sini.

Saya tahu ini adalah posting yang cukup lama, tetapi saya pikir saya akan memposting jawaban sederhana yang saya temukan di mariokostelac.com .

kg adalah namespace saya, Anda dapat memberi nama fungsi yang Anda suka. Saya cukup baru untuk pengait dan pengubahsuaian WP secara umum, tapi saya yakin wp_insert_post adalah pengait yang Anda cari.

add_action('wp_insert_post', 'kg_set_default_custom_fields');

function kg_set_default_custom_fields($post_id)
{
    if ( $_GET['post_type'] != 'page' ) {
        add_post_meta($post_id, 'meta-description', '', true);
    }

    return true;
}
kaplan
sumber
FYI: Ada get_post_type(). Juga, ketika melakukan perbandingan longgar, Anda harus menggunakan sintaks kondisi gaya YODA.
kaiser
@kaiser apa maksudmu dengan gaya YODA? Juga mengapa get_post_type($post_id) lebih baik daripada $_GET['post_type']?
Aziz
1
Gunakan nilai sebelum perbandingan: 'page' === $_GET['post_type']. Lain, ketika Anda lupa satu =Anda bisa berakhir dalam situasi di mana Anda menetapkan nilai daripada membandingkan dua nilai. Dan itu akan berakhir sebagai sampah di basis data Anda. Anda mungkin juga ingin menggunakan perbandingan === jenis yang aman (apakah nilainya page? Dan adalah nilai tipe string?)
kaiser
1
@kasier saya melihat - sehingga kode akhir adalah sesuatu seperti: 'page' === get_post_type($post_id) ?
Aziz
-1

jika seseorang perlu mengambil bidang kustom dengan jenis posting saya meninggalkan kode di bawah ini seperti yang saya lakukan dan bekerja dengan baik untuk saya :)

function awh_field_type($post_id){
$awh_f_post = get_post_type($post_id);
$meta_value = '';
$meta_name = 'custom';
    if($awh_f_post == 'product'){
        add_post_meta($post_id,$meta_name,$meta_value,true);
    }
return $awh_f_post;

} add_action ('wp_insert_post', 'awh_field_type');

Edgardo Aleman
sumber