Dodaj pola niestandardowe do niestandardowego typu wiadomości RSS

17

Chciałbym dodać niestandardowe pola w moim niestandardowym typie postu do kanału RSS dla tego typu posta znajdującego się na stronie http://example.com/feed/?post_type=my_custom_post_type

Widziałem informacje na temat robienia tego w przypadku zwykłego pliku danych, ale nic, jak przepisać niestandardowy kanał typu postów.

Będę musiał dodać 10–15 elementów do pliku danych (1. akt, 2. akt, 3. akt, cena, link zakupu ...)

Curtismchale
źródło

Odpowiedzi:

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

Powinieneś być w stanie zastąpić wszelkie inne meta wartości, które musisz dodać do kanału.

prettyboymp
źródło
1
więc muszę dodać element do sprawdzania typu postu dla każdego meta klucza (prawdopodobnie około 10), a następnie wywołać go w szablonie? Nie możesz po prostu wywołać get_post_meta w obszarze wartości meta z identyfikatorem postu?
curtismchale
2
Niezła odpowiedź!
MikeSchinkel,
@curtismchale, właśnie zamieściłem najprostszą odpowiedź. Jeśli pobierasz tyle pól, prawdopodobnie wybrałbym coś sformatowanego bardziej jak odpowiedź @ mikeschinkel.
prettyboymp,
19

Cześć @curtismchale:

Piggybacking off doskonałej odpowiedzi @ prettyboymp , z moim spinem, oto jak możesz zrobić wiele niestandardowych pól (zrobiłem 3, możesz zrobić więcej):

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 Pamiętaj, aby dać rekwizyty @prettyboymp, ponieważ nie wiedziałem, jak to zrobić przed jego odpowiedzią. Ja tylko odpowiadam, ponieważ nie jestem pewien, ile czasu minie, zanim on wróci, więc postanowiłem udzielić odpowiedzi w międzyczasie.

MikeSchinkel
źródło
7

DZIĘKUJEMY ZA DZIĘKUJĘ za tę doskonałą informację.

Chciałem rozszerzyć to, co już napisali dwaj pozostali ... Aby to sprawdzić, musisz mieć niestandardową przestrzeń nazw. Oto jak to zrobić:

/* 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";
}

A następnie prefiks elementu nazwy pola niestandardową przestrzenią nazw W tym przykładzie użyłem „mycustomfields” Patrz poniżej:

/*  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";
  }
}

W notatce bocznej możesz użyć akcji, aby zaczepić się w dowolnym z 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');
Dz 7
źródło
Dla pokazujących się tutaj: Jetpack reklamuje przestrzenie nazw xmlns: geo i xmlns: georss. Nie musisz ich dodawać, jeśli używasz Jetpack.
MastaBaba,