WP PHP işlevini ve Özel Alanları ekle


26

WordPress işlevi, verileri programlı olarak göndermek için kullanılır. İçeriği, alıntıyı, unvanı, tarihi ve daha pek çok şeyi teşvik etmek için gönderilecek standart alanlar.

Belli bir dokümantasyonun olmadığı özel bir alana nasıl gönderileceği. add_post_meta($post_id, $meta_key, $meta_value, $unique);Fonksiyonla mümkün olduğunu biliyorum .

Ancak, bunu standart wp_insert_postfonksiyona nasıl dahil edersiniz?

<?php 
$my_post = array(
     'post_title' => $_SESSION['booking-form-title'],
     'post_date' => $_SESSION['cal_startdate'],
     'post_content' => 'This is my post.',
     'post_status' => 'publish',
     'post_type' => 'booking',
  );
  wp_insert_post( $my_post );
  ?>

Yanıtlar:


35

İçin belgeleri okursanız, wp_insert_postyeni oluşturduğunuz gönderinin posta kimliğini döndürür.

Bunu aşağıdaki işlevle birleştirirseniz __update_post_meta(bu siteden edindiğim ve biraz uyarladığım özel bir işlev)

/**
  * Updates post meta for a post. It also automatically deletes or adds the value to field_name if specified
  *
  * @access     protected
  * @param      integer     The post ID for the post we're updating
  * @param      string      The field we're updating/adding/deleting
  * @param      string      [Optional] The value to update/add for field_name. If left blank, data will be deleted.
  * @return     void
  */
public function __update_post_meta( $post_id, $field_name, $value = '' )
{
    if ( empty( $value ) OR ! $value )
    {
        delete_post_meta( $post_id, $field_name );
    }
    elseif ( ! get_post_meta( $post_id, $field_name ) )
    {
        add_post_meta( $post_id, $field_name, $value );
    }
    else
    {
        update_post_meta( $post_id, $field_name, $value );
    }
}

Aşağıdakileri alacaksınız:

$my_post = array(
    'post_title' => $_SESSION['booking-form-title'],
    'post_date' => $_SESSION['cal_startdate'],
    'post_content' => 'This is my post.',
    'post_status' => 'publish',
    'post_type' => 'booking',
);
$the_post_id = wp_insert_post( $my_post );


__update_post_meta( $the_post_id, 'my-custom-field', 'my_custom_field_value' );

Çok teşekkürler. Bana implantasyon hakkında bir fikir verebilir misin? IE. hangi kod ama nereye gidiyor. Çok teşekkürler
Robin ben Knight

2
Güzel bitti. İkinci kod bloğu sizinkinin yerine geçmiştir, fonksiyon değerleri özel alan anahtarı / değer çiftidir. İşlevi ya komut dosyasının en üstüne ya da komut dosyasının en üstünde bulunan ayrı bir .php dosyasına yerleştirin.
aendrew

1
Not olarak, OOP kullanıyorum, bu yüzden public"işlev" in önündeki değiştiricinin nedeni budur . Eğer bir sınıfa koymadan işlevin kendisini dahil ediyorsanız, eklemeniz gerekmezpublic
Zack

Merhaba Zack, Aendrew ve Philip. Her şey güzel çalışıyor, ancak boşuna da bir sorguya uygulamaya çalıştım. Nedenini tam olarak anlamadım. İşte bağlantı yeni hepiniz ilk özel alanın nasıl çalıştığını bildiğinizden beri işe yaradığını düşündüm. wordpress.stackexchange.com/questions/8622/…
Robin I Knight

1
Wordpress.stackexchange'te itibar almadığım için cevap ekleyemiyorum. Bugünden itibaren yeni bir yöntem var, sadece bir diziyi wp_insert_post içine şu şekilde koyabilirsiniz: meta_input => array (key => value)
Frederik Witte

13

'Wp_insert_post' ifadesinden sonra 'add_post_meta' öğesini basit bir şekilde ekleyebilirsiniz.

<?php 
$my_post = array(
     'post_title' => $_SESSION['booking-form-title'],
     'post_date' => $_SESSION['cal_startdate'],
     'post_content' => 'This is my post.',
     'post_status' => 'publish',
     'post_type' => 'booking',
  );

$post_id = wp_insert_post($my_post);

add_post_meta($post_id, 'META-KEY-1', 'META_VALUE-1', true);
add_post_meta($post_id, 'META-KEY-2', 'META_VALUE-2', true);
?>

1

Wp_insert_post (); ile kullanabileceğinizi sanmıyorum.

Bunun nedeni, WP'nin iki veri türünü nasıl depoladığıdır. Mesajlar, bir düzine farklı sütuna sahip büyük bir monolitik tabloda depolanır (wp_posts); özel alanlar, bir gönderiyle ilişkilendirilen, çoğunlukla bir meta anahtar ve değerden oluşan daha basit, 4 sütunlu bir tabloda (wp_postmeta) depolanır.

Sonuç olarak, posta kimliğinizi alana kadar özel alanları gerçekten saklayamazsınız.

Bunu dene:

function myplugin_insert_customs($pid){

    $customs = array(
    'post_id' => $pid,
    'meta_key' => 'Your meta key',
    'meta_value' => 'Your meta value',
    );

    add_post_meta($customs);

}

add_action('save_post', 'myplugin_insert_customs', 99);

Bu kodeksi yayın yardımcı oldu - yaptığınız işin tam tersi (yani silme sonrası bir DB satırını silmek): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post


Bu durumda görebildiğim tek çıkış oturumu kullanmak, doğru olur mu?
Robin I Knight

Hayır; Eklentinizin bir yayın kaydedilirken aynı zamanda özel alanlar eklemeye çalıştığını tahmin ediyorum, değil mi? Yapmanız gereken şey, gönderim kaydedildikten sonra WP'ye bağlanmak, gönderinin yeni kimlik numarasını almak ve sonra bunu add_post_meta () 'a vermek; CF'leri oluşturmak için. Cevabımı bir saniye içinde bazı kodlarla güncelleyeceğim.
aendrew

Yardım için teşekkürler. Bu arada, bu bir eklenti değil. İstediğim kadar özelleştirebilmemiz için yazdım. (ama ben php ile herhangi bir iyiyim, sadece deneme yanılma anlamına gelmez)
Robin I Knight

Öyleyse bu bir tema mı? Tek gerçek fark, bu durumda, function.php dosyasına koyarsınız.
21

1

save_postFiltreyi kullanın , ardından add_post_metafiltre işlevinizi çağırın .


Yararsız'ı. $ post-> ID, özel alanlar oluşturmak için gerekli olan wp_insert_post_data'da kullanılamaz.
aendrew

@ aendrew save_posteylem, işlevin en sonundadır , yazının kimliği ve nesnesi kendisine iletilir, yanıt sesdir .
Rarst

1
Bunun düzenlendiğinden eminim Rarst. Ne olursa olsun, şimdi mantıklı.
aendrew

ah @aendrew, üzgünüm - fark etmedi
Rarst
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.