Tambahkan Bidang Kustom ke Jenis Posting Kustom RSS

17

Saya ingin menambahkan bidang khusus dalam jenis posting khusus saya ke umpan RSS untuk jenis posting yang terletak di http://example.com/feed/?post_type=my_custom_post_type

Saya telah melihat info tentang cara melakukan ini untuk umpan biasa tetapi tidak ada cara untuk menulis ulang umpan jenis pos kustom.

Saya perlu menambahkan 10 - 15 item ke feed (babak pertama, babak kedua, babak ketiga, harga, tautan pembelian ...)

curtismchale
sumber

Jawaban:

20
function add_custom_fields_to_rss() {
    if(get_post_type() == 'my_custom_post_type' && $my_meta_value = get_post_meta(get_the_ID(), 'my_meta_key', true)) {
        ?>
        <my_meta_value><?php echo $my_meta_value ?></my_meta_value>
        <?php
    }
}
add_action('rss2_item', 'add_custom_fields_to_rss');

Anda harus dapat mengganti dan nilai meta lainnya yang perlu Anda tambahkan ke umpan.

prettyboymp
sumber
1
jadi saya perlu menambahkan item ke cek jenis posting untuk setiap kunci meta (mungkin sekitar 10) lalu memanggilnya ke dalam template? Anda tidak bisa memanggil get_post_meta di area nilai meta dengan id pos?
curtismchale
2
Jawaban bagus!
MikeSchinkel
@curtismchale, saya baru saja memasukkan jawaban paling sederhana. Jika Anda menarik banyak bidang, saya mungkin akan pergi dengan sesuatu yang diformat lebih seperti jawaban @ mikeschinkel.
prettyboymp
19

Hai @curtismchale:

Membonceng off @ prettyboymp ini jawaban yang sangat baik, dengan berputar di atasnya, berikut adalah cara yang dapat Anda lakukan beberapa bidang kustom (saya lakukan 3, Anda dapat melakukan lebih):

add_action('rss2_item', 'yoursite_rss2_item');
function yoursite_rss2_item() {
  if (get_post_type()=='my_custom_post_type') {
    $fields = array( 'field1', 'field2', 'field3' );
    $post_id = get_the_ID();
    foreach($fields as $field)
      if ($value = get_post_meta($post_id,$field,true))
        echo "<{$field}>{$value}</{$field}>\n";
  }
}

PS Pastikan untuk memberikan props @prettyboymp karena saya tidak tahu bagaimana melakukan ini sebelum jawabannya. Aku hanya menjawab juga karena aku tidak yakin berapa lama sebelum dia kembali jadi aku memutuskan untuk memberikanmu jawaban sementara itu.

MikeSchinkel
sumber
7

Terima kasih atas informasi yang luar biasa ini.

Saya ingin memperluas apa yang sudah ditulis oleh dua yang lain ... Agar ini dapat divalidasi, Anda harus memiliki namespace khusus. Begini cara Anda melakukannya:

/* IN ORDER TO VALIDATE you must add namespace   */
add_action('rss2_ns', 'my_rss2_ns');
function my_rss2_ns(){
    echo 'xmlns:mycustomfields="'.  get_bloginfo('wpurl').'"'."\n";
}

Dan kemudian awali item nama bidang dengan namespace kustom Dalam contoh ini, saya telah menggunakan "mycustomfields" Lihat di bawah:

/*  add elements    */
add_action('rss2_item', 'yoursite_rss2_item');
function yoursite_rss2_item() {
  if (get_post_type()=='my_custom_post_type') {
    $fields = array( 'field1', 'field2', 'field3' );
    $post_id = get_the_ID();
    foreach($fields as $field)
      if ($value = get_post_meta($post_id,$field,true))
        echo "<mycustomfields:{$field}>{$value}</mycustomfields:{$field}>\n";
  }
}

Di samping catatan Anda dapat menggunakan tindakan untuk menghubungkan ke salah satu dari 3

    rss2_ns : to add a specific namespace
            add_action('rss2_ns', 'my_rss2_ns');

    rss2_head : to add tags in the feed header
            add_action('rss2_head', 'my_rss2_head');

    rss2_item : to add tags in each feed items
            add_action('rss2_item', 'my_rss2_item');
Acts7
sumber
Untuk yang muncul di sini: Jetpack iklan xmlns: geo dan xmlns: georss namespaces. Tidak perlu menambahkan ini jika Anda menggunakan Jetpack.
MastaBaba