Meta verileri yalnızca belirli bir özel yayın türü için nasıl kaydedebilirim?


16

Bu öğreticiyi izleyerek özel bir yazı türü ayarlamaya çalışıyorum . Ancak, nasıl / nerede uygulanacağı konusunda biraz kafam karıştı update_post_meta(). Eğitici şu modeli önerir:

add_action('save_post', 'save_my_metadata');

function save_my_metadata()
{
    global $post;
    update_post_meta($post->ID, 'my_metadata', $_POST['my_metadata']);
}

Bu işe yarar, ancak bu özel türe ait olsun ya da olmasın, her metaya bu meta verileri eklemenin talihsiz etkisi vardır.

Yukarıdakileri koydum functions.phpve sorunun bir parçası olabileceğini tahmin ediyorum . Ben sadece benim özel tip mesajlar için tetiklemek için 'save_post' eylem kısıtlamak gerekir tahmin ediyorum.


Güzel bir soru Bobby Jack, ama sizden soruyu "Belirli Özel Yazı Türleri İçin Meta Verileri Nasıl Kaydedilir"; başlığınız insanların bu soruna bir çözüm aradıklarında anlayamayacakları kadar genel.
MikeSchinkel

@Mike: bitti (önerinizi tamamen kabul edin, teşekkürler!)
Bobby Jack

Yanıtlar:


18
function save_my_metadata($ID = false, $post = false)
{
    if($post->post_type != 'your_post_type')
        return;
    update_post_meta($ID, 'my_metadata', $_POST['my_metadata']);
}

Bu işe yaramalı. 'Your_post_type' yerine yazı türünün adını yazın. Ayrıca, az bilinen gerçek: 'save_post' kancası gönderinin kimliğini argüman olarak geçer.

DÜZENLE

Jan'ın yorumunu yansıtacak şekilde işlevi güncelledim. Teşekkürler Jan!


1
Hatta gönderinin kendisini ikinci argüman olarak ekler , böylece global değişkeni kullanmanıza gerek yoktur.
Jan Fabry

Bu çözüm işe yarıyor ... Daha önce çok başarılı bir şekilde müşteri projelerinde kullandım.
EAMann

Parlak - bir cazibe gibi çalışır. Ve "if ($ post-> post_type == 'animal') {update_post_meta ($ ID," number_of_legs ", $ _POST ['number_of_legs']);} if yapmanın mantıklı olacağını varsayıyorum. post-> post_type == 'araç') {update_post_meta ($ ID, "number_of_wheels", $ _POST ['number_of_wheels']);} // ... etc ... birkaç farklı yazı türünü ele almak için? ( zayıf biçimlendirme özellikleri!)
Bobby Jack

Aslında, birden çok yazı tipi ile, bunun yerine bir switch deyimi kullanmanızı tavsiye ederim. Daha az biçimlendirme, daha hızlı performans, gelecekte vaka eklemek daha kolay.
EAMann

@EAMann - yup, bunun yarısını yazarak, bir anahtarın daha iyi olacağını fark ettim, ancak yorumlar kod düzenlemeye başlamak için ideal bir yer değil, bu yüzden tembel oldum;)
Bobby Jack

4

Birden çok gönderi türünü işlemek istiyorsanız, temel bir anahtar bildirimi öneririm:

add_action('save_post', 'save_my_metadata');

function save_my_metadata($ID = false, $post = false)
{
    switch($post->post_type) 
    {
        case 'post_type_1':
            // Do stuff for post type 1
            update_post_meta($ID, 'my_metadata', $_POST['my_metadata']); // Example...
            break;
        case 'post_type_2':
            // Do stuff for post type 2
            break;
        default:
            return;
    }
}

Durumlar temelde aynıdır, if($post->post_type) == 'post_type_1') {}ancak birden fazla if-else bloğu gerektirmez. defaultAnahtarı blok sonrası tipi özel takımında olmayan durumları ele alır.


4

@John P Bloch ve @EAMann çoktan harika cevaplar verdiler, bu yüzden benimki ek olarak:

  1. Meta_key'lerinizin önüne alt çizgi eklemeyi düşünün . Aksi takdirde, bunları yazı düzenleme ekranında görüntülenen özel alanlar listesinden gizler, ör.

    save_my_metadata işlevi ($ post_id, $ post = false) {
       if ($ post-> post_type == 'your_post_type')
          update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata']);
    }
    
    Açıkçası bu, alanları da düzenlemek için özel bir meta kutusuna ihtiyacınız olduğu anlamına gelir. Bağlam için bir düzenleme ekranı:



  2. Yapabileceğiniz başka bir şey, belirli yazı türlerini kaydetmeyi kolaylaştırmak için kendi kancalarınızı eklemektir, yani kancalarınız " save_{$post_type}_post" olabilir ; bir movieyazı türü için olurdu save_movie_post. Temanızın functions.phpdosyasına veya bir yerdeki bir eklentiye eklemeniz gerekenler şunlardır :

    add_action ('save_post', 'save_custom_post_type_posts', 10,2);
    save_custom_post_type_posts işlevi ($ post_id, $ post = false) {
       do_action ( "kaydet _ {$ post-> post_type} _POST");
    }
    
    Bununla daha sonra orijinal kodunuzu şu şekilde yeniden yazabilirsiniz (yukarıdaki 1 numaralı alt çizgi hilesi dahil):

    ADD_ACTION ( 'save_my_postype_post', 'save_my_postype_metadata', 10,2);
    save_my_postype_metadata işlevi ($ post_id, $ post) {
        update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata']);
    }

1

Şahsen, yazı türlerine özel meta işleyiciler eklemek için aşağıdaki kalıbı takip etmeyi tercih ediyorum. Aşağıdakilerle, add_post_type_support ('my_post_type', 'altyazı') 'yı çağırarak yalnızca destek türünü (aşağıdaki örnekte' altyazı) destek dizisine ekleyerek meta desteğini bir yazı türüne ekleyebilirsiniz;

class Subtitle_Meta_Handler {
    public function initialize() {
        add_action('add_meta_boxes', array($this, 'add_metabox'), 10, 2);
        add_action('save_post', array($this, 'update'));
    }

    public function add_metabox($post_type, $post)
    {
        if(post_type_supports($post_type, 'subtitle'))
        {
            add_meta_box('subtitle', 'Subtitle', array($this, 'metabox'), $post_type);
        }
    }

    public function metabox($post)
    {
        $subtitle = get_post_meta($post->ID, 'subtitle', true);
        if(!$subtitle)
        {
            $subtitle = '';
        }
        ?>
        <input type="text" style="width: 70%;" value="<?php echo esc_attr($subtitle);?>" name="subtitle" id="subtitle">
        <?php
        wp_nonce_field('update_subtitle', 'subtitle_nonce');
    }

    public function update($post_id)
    {
        if(wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
            return $post_id;
        }
        if(isset($_REQUEST['subtitle_nonce']) && wp_verify_nonce($_REQUEST['subtitle_nonce'], 'update_subtitle')) {
            $subtitle = trim(strip_tags($_REQUEST['subtitle'], '<b><strong><span><a>'));
            if(empty($subtitle)) {
                delete_post_meta($post_id, 'subtitle');
            } else {
                update_post_meta($post_id, 'subtitle', $subtitle);
            }
        }
    }
}
add_action('init', array(new Subtitle_Meta_Handler(), 'initialize'));

Umarım böyle bir şey yakında çekirdeğe eklenir.


0

Güncellemeden önce, mevcut gönderinin gönderi türünüzde olup olmadığını kontrol edin. Bu, tüm yayınlar için kaydetmemenizi sağlar.

Girdiyi de kontrol etmelisiniz (örneğinizde eksik olan) ve bunun yanında, eylemi yalnızca bu gönderi türü etkinken ekleyebileceğinizi unutmayın. Bu durumda, daha sonra bu yazı türünü kontrol etmeniz gerekmez.

Yayın türü alma: get_post_type()veya$post->post_type;


0

Ben diğer özel alanlardan değerleri alabilirsiniz böylece yazı güncelleştirildikten sonra bu değerleri eklenmesini istiyorum olarak ben bu işe yarayamıyorum - ne yaptığımı emin değilim - ama ben save_post yerine post_updated kanca kullanmaya çalışıyorum - .

 function update_meta ($ID = false, $post = false) {
  update_post_meta($ID, 'rest_long', 'Test 1');
  update_post_meta($ID, 'rest_lat', 'Test 2');
}

add_action('post_updated', 'update_meta');

Nevermind - Anladım!
jrutter
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.