Bir yayın oluştururken varsayılan özel alanları ayarlamanın bir yolu var mı?


11

Yeni bir yazı oluştururken, "Yeni Ekle" yi tıkladıktan hemen sonra , yayın düzenleyicisi gösterildiğinde, açılır listeyi kullanmak ve kullanmak için özel bir alan seçmek yerine, zaten bazı varsayılan özel alan girişlerine sahip olmak istiyorum açık uç.

Görsel olarak, yerine:

resim açıklamasını buraya girin

Şuna benzer bir şey istiyorum:

resim açıklamasını buraya girin

Bunun için eklentiler olduğunu biliyorum (CPT, Daha fazla alan vb.) Ama temel bir işlevle yapmanın basit bir yolu istiyorum.

Böyle bir şey denedim (özel bir yazı tipi 'ürün' kullanıyorum):

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

Ama bu işe yaramıyor gibi görünüyor. Kanca muhtemelen yanlış olduğunu düşünüyorum (çünkü edit_postbir güncelleme sonra geliyor), ama "yeni yazı" (kullanıcı wp admin "yeni yazı" tıkladıktan hemen sonra) için herhangi bir kanca görmüyorum. Var mı?

Ya da belki de tüm fikir yanlıştır ve başka bir yol var mı?

Yanıtlar:


9

Eylem kanca save_postkaydet denir, ancak şu anda meta veri ekleyip ekleyemeyeceğinizi bilmiyorum. Ancak, yayın işlem kancasıyla kaydedildikten sonra meta verilerinizi oluşturmak / güncellemek mümkün olmalıdır updated_post_meta.

DÜZENLE

Gönderi oluşturma ekranında bazı meta alanları (özel alanlar) önceden seçmek için, önce bu meta değerleri boş bir değerle eklemeniz gerekir.

Eğer bakarsanız post_custom_meta_box()(kullanılmış METABOX için geri arama olduğu işlevin postcustomdosyasında) wp-admin/includes/meta-boxes.php, işlevin kullandığını görebilirsiniz list_meta()önceden seçilmiş meta alanlar oluşturun.

Şimdi bu meta kutu görüntülenene kadar program akışına bir göz atalım (Burada kullanabileceğimiz bir eylem / filtre kancası arıyoruz):

  1. WordPress dosyayı yükler post-new.php
  2. Bu dosya 39, işleve bağlı olarak veritabanında varsayılan bir yazı oluşturur get_default_post_to_edit(). Bu iyi. Temelde yazı zaten otomatik taslak olarak veritabanında. Maalesef şu anda bu verileri değiştirmek veya yeni bir şeyler eklemek için herhangi bir kanca yok.
  3. Bir sonraki adım olarak, dosya edit-form-advaned.phpdahil edilir. Bu dosya delik yönetim sayfası oluşturur supportsve gönderi türünün parametresine göre gerekli tüm meta kutuları içerir .
  4. Hatta 136özel alanlar meta kutusu eklenir postcustomve yukarıdaki işlev çağrılır. Yine, biz-ebil kullanma hiçbir eylem kanca.

Sonuç

Yapabileceğiniz tek yolu jQuery kullanmak veya postcustommetabox aşırı ve list_meta()işlevi çalıştırmadan önce meta değerleri eklemek olduğunu düşünüyorum .

Örneğin

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()
}

Şey şu an için kaydetmeye bir şey eklemeye çalışmıyorum, kullanıcı düzenleme sayfasında arrvies olduğunda zaten açık olan bazı özel alan girişlerini göstermeye çalışıyorum (ekran görüntüleri ile güncellemelere bakın)
mike23

Ah. Şimdi problemini anlıyorum. Cevabımı düzenledim.
rofflox

3

Bu, özel alanlar desteği eklemek için uygun yöntemdir (yayınları düzenlerken boş alanları alamazsınız)

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

1

Save_post eylemini kullanmalı ve tüm yazı türlerinde çalıştığı için yazı türünü kontrol ederek işleminizi izole etmelisiniz. Açıkçası sizin için çalışmasını sağlamak için bunu inşa etmek zorunda kalacak daha fazla mantık var. Büyük olasılıkla varsayılanları bir kez ayarlayıp ayarlamadığınızı kontrol eden bir yayın meta alanı ayarlamanız gerekir; böylece kullanıcılarınız bir yayın meta alanını boş bırakmak istiyorlarsa hayal kırıklığına uğramazlar.

Varsayılanların null olmasını istiyorsanız (kod örneğinizde görüldüğü gibi), bir işlev oluşturmayın, çünkü bu yalnızca ek yük ekler ve meta meta alanları varsayılan olarak değerlerle doldurulmaz.

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

1

Geliştirdiğim bir WP sitesindeki her özel gönderi için benzersiz bir meta açıklamaya sahip olmak istiyorum. Ben de varsayılan bir özel alan arıyordum ve buraya indim.

Bunun oldukça eski bir yazı olduğunu biliyorum, ama mariokostelac.com'da bulduğum basit cevabı yayınlayacağımı düşündüm .

kg benim ad alanım, işlevi istediğiniz gibi adlandırabilirsiniz. Kancalar ve WP genel olarak özelleştirme için oldukça yeniyim, ancak wp_insert_post'un aradığınız kanca olduğuna inanıyorum.

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

FYI: Var get_post_type(). Ayrıca, gevşek karşılaştırma yaparken, YODA stili koşul sözdizimini kullanmalısınız.
kaiser

@kaiser YODA stiliyle ne demek istiyorsun? Ayrıca neden get_post_type($post_id) daha iyidir $_GET['post_type']?
Aziz

1
Kullanım değeri karşılaştırma öncesi: 'page' === $_GET['post_type']. Aksi halde, bir single'ı unuttuğunuzda, iki değeri karşılaştırmak yerine bir değer atadığınız bir =duruma gelebilirsiniz . Ve bu veritabanınızda çöp olarak sonuçlanır. Ayrıca, tür güvenli karşılaştırmayı da kullanmak isteyebilirsiniz (değer mi? Ve türün değeri mi?)=== pagestring
kaiser

1
@kasier görüyorum - son kod gibi bir şey yani: 'page' === get_post_type($post_id) ?
Aziz

-1

bazı biri posta türüne göre özel alan almak gerekiyorsa ben yaptığım yolun altındaki kodu bırakın ve benim için iyi çalışır :)

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

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.