Secara terprogram tambahkan opsi ke dropdown bidang khusus “tambah baru”

10

Bagaimana saya bisa menambahkan opsi yang telah ditentukan ke dropdown kolom "tambah baru"?

masukkan deskripsi gambar di sini

Berikut adalah dua contoh menambahkan dan menampilkan bidang khusus baru secara otomatis:

  1. WordPress: Menambahkan Bidang Kustom Default pada Posting Baru
  2. Otomatis buat bidang khusus

Itu dekat dengan apa yang ingin saya lakukan; tujuan saya adalah untuk menambahkan opsi yang telah ditentukan ke dropdown "tambah baru" yang diarsipkan, tetapi tidak membuatnya ditampilkan sebagai bidang sampai blogger menambahkannya.

Saya ingin tahu bagaimana melakukan ini tanpa menggunakan plugin.

mhulse
sumber
Jika Anda perlu mengisi bidang tertentu, mengapa tidak menggunakan metabox khusus? Ada banyak opsi di luar sana untuk melakukan ini dengan mudah: Meta Box, WP Alchemy, Advanced Custom Fields, dll
helgatheviking
@helgatheviking Terima kasih atas tipsnya! Saya akan memeriksa opsi-opsi itu ( Kotak Meta , Alkimia WP , dan Bidang Kustom Tingkat Lanjut ); itu terlihat sangat bagus! Jujur, saya sebagian besar penasaran bagaimana melakukan ini tanpa menggunakan plugin karena saya mencoba untuk tetap minimal dan menghindari menggunakan plugin untuk setiap masalah yang perlu saya selesaikan (saya tahu seberapa cepat plugin dapat menumpuk jika ada (yaitu, saya ) tidak hati-hati). : D
mhulse
Tentu saja. Anda dapat membuat metabox tanpa plugin (banyak contoh di sini, Codex atau hanya dengan googling). tetapi terkadang plugin dapat melakukan apa yang Anda butuhkan atau membuat hidup Anda jauh lebih sederhana.
Helgatheviking
@helgatheviking Terima kasih! Saran bagus! Saya mungkin berakhir menggunakan plugin di jalan tergantung pada berapa banyak lagi kotak meta tweak yang perlu saya buat untuk proyek ini. Sekali lagi terima kasih atas bantuan / tautan / sarannya, saya sangat menghargainya!
mhulse
FYI, kepada orang lain di kapal yang sama dengan saya: WP Alchemy terlihat bagus murni dari sudut pandang yang dibuat untuk programmer; dari tiga yang tercantum di atas, saya pikir saya suka WP Alkimia yang terbaik karena alasan itu. Yang lain terlihat sangat keren juga, tapi saya lebih suka tetap sedekat mungkin dengan kode. Sesuatu yang perlu diperhatikan, saya tidak yakin apakah WP Alkimia, atau yang lain, dapat menambahkan opsi default ke dropdown bidang kustom saham. Jika saya akhirnya menggunakan satu, atau semua, saya akan memposting kembali di sini dengan konfirmasi (atau, jika orang lain dapat mengonfirmasi, itu akan keren!)
mhulse

Jawaban:

4

Anda tidak dapat melakukannya dengan PHP murni, karena bidang diambil dari bidang yang ada, dan tidak ada kait. Tetapi Anda dapat menggunakan JavaScript, periksa apakah jenis posting mendukung bidang khusus dan bidang tersebut belum ada - dan masukkan:

<?php # -*- coding: utf-8 -*-
/* Plugin Name: Extend custom fields */

add_action( 'admin_footer-post-new.php', 'wpse_98269_script' );
add_action( 'admin_footer-post.php', 'wpse_98269_script' );

function wpse_98269_script()
{
    if ( ! isset ( $GLOBALS['post'] ) )
        return;

    $post_type = get_post_type( $GLOBALS['post'] );

    if ( ! post_type_supports( $post_type, 'custom-fields' ) )
        return;
    ?>
<script>
    if ( jQuery( "[value='demo_data']" ).length < 1 ) // avoid duplication
        jQuery( "#metakeyselect").append( "<option value='demo_data'>demo_data</option>" );
</script>
    <?php
}
fuxia
sumber
Wah, luar biasa! Coba sekarang, terima kasih! (+1) Saya akan kembali menandai sebagai jawaban setelah diuji. Hanya karena penasaran, apa artinya di belakang # -*- coding: utf-8 -*-? Apakah gaya komentar itu berarti sesuatu yang istimewa bagi WordPress? Terima kasih!!!! :)
mhulse
@MickyHulse # -*- coding: utf-8 -*-adalah cookie penyandian , ini membantu editor mendeteksi penyandian file. Vim, Scite dan beberapa editor lainnya akan membacanya. Bagian dari template PHP standar saya.
fuxia
Bekerja dengan sempurna! Saya telah memperbarui posting saya dengan beberapa tweak yang saya buat pada kode Anda (saya harus membuat <select>jika belum ada). Terima kasih banyak atas bantuannya, saya sangat menghargainya !!!!!
mhulse
... dan terima kasih atas info tentang cookie penyandian , saya belum pernah melihat itu sebelumnya. Sangat dihargai.
mhulse
2
function add_predefined_custom_field_names( $query ) {
    $predefined = array(
        'www.cyberxoft.com'
    );

    global $table_prefix;

    $query = preg_replace('/[\r\n\t]/', ' ', $query); //minify by removing all tabs and line breaks
    $query = preg_replace('/\s+/', ' ', $query); //minify by replacing spaces, tabs and carriages to single space

    //SELECT meta_key FROM wp_postmeta GROUP BY meta_key HAVING meta_key NOT LIKE '\\_%' ORDER BY meta_key LIMIT 30
    $pattern = ("/SELECT meta_key FROM ".$table_prefix."postmeta/i");   

    if( preg_match($pattern, $query) ) {
        $keys = '';     

        foreach($predefined as $key){$keys .= (" UNION SELECT '$key' AS meta_key");}        

        $query = preg_replace('/SELECT/i', 'SELECT meta_key FROM (SELECT', $query);
        $query = preg_replace('/FROM wp_postmeta/i', ('FROM wp_postmeta'.$keys), $query);
        $query = preg_replace('/ GROUP BY/i', ')t GROUP BY', $query);
    }

    return $query;
}
add_filter('query', 'add_predefined_custom_field_names');

Cukup tambahkan kode di atas di mana saja di theme. function.php Anda. Setelah Anda menambahkan kode di atas, itu akan menambahkan 'www.cyberxoft.com' ke drop down sebagai salah satu opsi untuk memilih.

Jika Anda dapat melihatnya, maka ganti 'www.cyberxoft.com' dengan nama bidang yang Anda butuhkan dan segarkan halaman admin dan ketika Anda melihat itu terjadi, silakan tambahkan dan sebanyak yang Anda suka TETAPI ingat bahwa hanya 30 yang bisa menjadi. dipandang sebagai batas default yang ditetapkan untuk itu.

Nikmati...

CyberXoft
sumber
1

Di bawah ini adalah versi modifikasi dari skrip mengagumkan yang diposting oleh @toscho. Saya hanya perlu kemampuan untuk membuat <select>jika belum ada.

/**
 * Programatically add custom fields.
 *
 * @see http://wordpress.stackexchange.com/questions/98269/programatically-add-options-to-add-new-custom-field-dropdown/
 */

function wpse_98269_script() {

    if (isset($GLOBALS['post'])) {

        $post_type = get_post_type($GLOBALS['post']);

        if (post_type_supports($post_type, 'custom-fields')) {

            ?>

                <script>

                    // Cache:
                    var $metakeyinput = jQuery('#metakeyinput'),
                        $metakeyselect = jQuery('#metakeyselect');

                    // Does the default input field exist and is it visible?
                    if ($metakeyinput.length && ( ! $metakeyinput.hasClass('hide-if-js'))) {

                        // Hide it:
                        $metakeyinput.addClass('hide-if-js'); // Using WP admin class.

                        // ... and create the select box:
                        $metakeyselect = jQuery('<select id="metakeyselect" name="metakeyselect">').appendTo('#newmetaleft');

                        // Add the default select value:
                        $metakeyselect.append('<option value="#NONE#">— Select —</option>');

                    }

                    // Does "demo_data" already exist?
                    if (jQuery("[value='demo_data']").length < 1) {

                        // Add option:
                        $metakeyselect.append("<option value='demo_data'>demo_data</option>");

                    }

                </script>

            <?php

        }

    }

}

add_action('admin_footer-post-new.php', 'wpse_98269_script');
add_action('admin_footer-post.php', 'wpse_98269_script');

Saya yakin adaptasi JS saya dapat ditingkatkan, tetapi menyelesaikan pekerjaan. Saya akan mengirim kode yang diperbarui kembali ke sini jika saya membuat perubahan / peningkatan.

Terima kasih lagi @toscho !!!! I berutang budi padamu. :)

mhulse
sumber