"Yeni ekle" özel alan açılır menüsüne programlı olarak seçenekler ekleyin


10

"Yeni ekle" özel alan açılır menüsüne önceden tanımlanmış seçenekleri nasıl ekleyebilirim?

resim açıklamasını buraya girin

Yeni özel alanları otomatik olarak eklemek ve göstermek için iki örnek:

  1. WordPress: Yeni Gönderilere Varsayılan Özel Alanlar Ekleme
  2. Otomatik özel alan oluştur

Bu benim yapmak istediğim şeye yakın; amacım "yeni ekle" özel dosyalanmış açılır menüsüne önceden tanımlanmış seçenekler eklemek, ancak blogcu bunları ekleyene kadar alan olarak gösterilmemelerini sağlamaktır.

Bir eklenti kullanmadan bunu nasıl yapacağımı bilmek istiyorum.


Doldurulmuş belirli alanlara ihtiyacınız varsa, neden özel bir meta kutu kullanmıyorsunuz? Bunu kolayca yapmak için birçok seçenek var: Meta Box, WP Simya, Gelişmiş Özel Alanlar, vb
helgatheviking

@helgatheviking İpuçları için teşekkürler! Bu seçeneklere göz atacağım ( Meta Box , WP Alchemy ve Advanced Custom Fields ); gerçekten güzel görünüyorlar! Dürüst olmak gerekirse, asgari kalmaya ve çözmem gereken her sorun için bir eklenti kullanmaktan kaçınmaya çalışıyorum, çoğunlukla bir eklenti kullanmadan bunu nasıl yapacağımı merak ediyorum. ) dikkatli değildir). : D
mhulse

Tabi ki. Eklentiler olmadan meta kutular yapabilirsiniz (burada, Codex'te veya sadece googling'de birçok örnek). ancak bazen eklentiler tam olarak ihtiyacınız olanı yapabilir veya hayatınızı daha basit hale getirebilir.
helgatheviking

@helgatheviking Teşekkürler! Harika tavsiye! Bu proje için ne kadar meta kutusu ayarlaması yapmam gerektiğine bağlı olarak yolda bir eklenti kullanabilirim. Yardım / bağlantılar / tavsiye için tekrar teşekkürler, gerçekten takdir ediyorum!
mhulse

FYI, benimle aynı teknede olan herkese: WP Simya tamamen programcılar için yapılmış bakış açısından güzel görünüyor; yukarıda listelenen üçte, bu yüzden WP Simya'yı en çok sevdiğimi düşünüyorum. Diğerleri de gerçekten harika görünüyor, ama mümkün olduğunca koda yakın kalmayı tercih ediyorum. Ancak dikkat edilmesi gereken bir şey, WP Alchemy veya diğerlerinin stok özel alan açılır menüsüne varsayılan seçenekler ekleyip ekleyemeyeceğinden emin değilim. Eğer birini veya hepsini kullanarak
bitirirsem

Yanıtlar:


4

Bu alanlar saf PHP ile yapamazsınız çünkü alanlar mevcut alanlardan getirilir ve kanca yoktur. Ancak JavaScript'i kullanabilir, gönderi türünün özel alanları destekleyip desteklemediğini kontrol edebilir ve alan zaten mevcut değildir - ve ekleyin:

<?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
}

Vay, harika! Şimdi deniyorum, teşekkürler! (+1) Test edildikten sonra cevap olarak işaretlemeye geri döneceğim. Sadece meraktan, bunun anlamı ne # -*- coding: utf-8 -*-? Bu yorum stili WordPress'e özel bir şey ifade ediyor mu? Teşekkür ederim!!!! :)
mhulse

@MickyHulse # -*- coding: utf-8 -*-bir kodlama çerezidir , editörlerin dosya kodlamasını tespit etmesine yardımcı olur. Vim, Scite ve diğer bazı editörler bunu okuyacak. Standart PHP şablonumun bir parçası.
fuxia

Mükemmel çalışıyor! Kodumu için yaptığım bazı tweaks ile benim yazı güncelledim ( <select>zaten yoktu , oluşturmak zorunda kaldı ). Yardım için çok teşekkürler, gerçekten takdir ediyorum !!!!!
mhulse

... ve kodlama çerezi hakkında bilgi için teşekkürler , daha önce görmemiştim. Çok takdir etmek.
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');

Yukarıdaki kodu temalar function.php içinde herhangi bir yere eklemeniz yeterlidir. Yukarıdaki kodu ekledikten sonra, açılır menüden 'www.cyberxoft.com' seçeneğini belirleme seçeneklerinden biri olarak ekler.

Görürseniz, 'www.cyberxoft.com' yerine gerekli alan adınızı yazın ve yönetici sayfasını yenileyin ve bunun gerçekleştiğini gördüğünüzde devam edin ve istediğiniz kadar ekleyin, ancak sadece 30'un olabileceğini unutmayın. bunun için belirlenen varsayılan sınır olarak görüntüleniyor.

Zevk almak...


1

Aşağıda @toscho tarafından yayınlanan müthiş betiğin değiştirilmiş bir versiyonu bulunmaktadır . Henüz <select>mevcut değilse , yaratma yeteneğine ihtiyacım vardı .

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

JS adaptasyonlarımın geliştirilebileceğinden eminim, ama işi hallediyor. Değişiklik / iyileştirme yaparsam güncellenmiş kodu buraya gönderirim.

Tekrar teşekkürler @toscho !!!! Sana borçlandım. :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.