it-swarm.asia

Meta tasarımı netleştirilmiş bir özel yazı tipi için nasıl yapılırerim?

Aşağıdaki özel bir gönderi türü oluşturmaya çalışıyorum bu eğitim . Bununla birlikte, update_post_meta() işlevini nasıl/nereye uygulayacağımı biraz kafam karıştı. Öğretici bu 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 meta veriyi bu özel türe ait olsun veya olmasın, her gönderiye ekleme talihsiz bir etkisi vardır.

Yukarıdakileri functions.php içine koydum ve sorunun bir parçası olabileceğini tahmin ediyorum. Sanırım 'save_post' eylemini yalnızca özel türümdeki gönderiler için tetikleyecek şekilde kısıtlamam gerekiyor.

15
Bobby Jack
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 çalışması gerekir. 'Your_post_type' yerine yazı türünün adını yazın. Ayrıca, az bilinen bir gerçek: 'save_post' kancası yazının kimliğini bir argüman olarak iletir.

DÜZENLE

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

16
John P Bloch

Birden fazla yayın türünü işlemek istiyorsanız, temel bir anahtar ifadesi ö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;
    }
}

Davalar temel olarak if($post->post_type) == 'post_type_1') {} ile aynıdır ancak birden fazla if-else bloğu gerektirmez. Anahtardaki default bloğu, yazı türünün özel kümenizde olmadığı durumları işler.

4
EAMann

@John P Bloch ve @EAMann zaten büyük cevaplar verdiler, bu yüzden benimki de:

  1. Düşünmek meta_key'lerinizi alt çizgi ile önekleme. Bunu yapmak, yazı düzenleme ekranında görüntülenen özel alanlar listesinden gizler;.

    save_my_metadata işlevi ($ post_id, $ post = false) {
     eğer ($ post-> post_type == 'your_post_type') 
     güncelleme_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metada' ' ].);. 
    } 
    
    Açıkçası bu, alanları da düzenleyebilmek için özel bir meta kutusuna ihtiyaç duyacağınız anlamına geliyor. İşte bağlam için bir düzenleme ekranı:



  2. Yapabileceğiniz başka bir şey, belirli yazı tiplerini kaydetmeyi kolaylaştırmak için kendi kancanızı eklemek, yani kancanız "save_{$post_type}_post" olabilir; movie yazı tipi için save_movie_post olacaktır. İşte temanın functions.php dosyasına ya da başka bir yerdeki bir eklentiye eklemeniz gerekenler:

     add_action ('save_post', 'save_custom_post_type_posts', 10,2); 
     işlevi save_custom_post_type_posts ($ post_id, $ post = false) {
     do_action ("save _ {$ post-) > post_type} _POST "); [. .____]} [. .____]
    Bununla, orijinal kodunuzu şöyle yazabilirsiniz (yukarıdaki # 1 alt çizgi numarası dahil):

     add_action ('save_my_postype_post', 'save_my_postype_metadata', 10,2); 
     işlevi save_my_postype_metadata ($ post_id, $ post) {
     _POST [ 'my_metadata']); 
    }
4
MikeSchinkel

Şahsen, yazı tiplerine özel meta işleyicileri eklemek için aşağıdaki modeli izlemeyi tercih ederim. Aşağıda, bir destek türüne yalnızca destek anahtarını (aşağıdaki örnekte 'altyazı') ekleyerek, yazı tipi için destek dizisine add_post_type_support ('my_post_type', 'subtitle');

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 çekirdek içine eklenecektir.

1
prettyboymp

Bunun çalışmasını sağlayamıyorum - yanlış yaptığımdan emin değilim - ama save_post yerine post_updated kanca kullanmaya çalışıyorum - bu değerlerin yazı güncellendikten sonra eklenmesini istiyorum, böylece diğer özel alanlardan değerleri alabilirim .

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

Güncellemeden önce, geçerli gönderinin yazı türünüz olup olmadığını kontrol edin. Bu, tüm yazılar için kaydetmediğinizden emin olmanızı sağlar.

Girişi de kontrol etmelisiniz (örneğinizde yoktur) ve bunun yanında, yalnızca bu post-type aktifken eylemi ekleyebileceğinizi unutmayın. Bu durumda, daha sonra bu yazı tipini kontrol etmeniz gerekmez.

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

0
hakre