Adicionar campos personalizados ao tipo de postagem personalizada RSS

17

Gostaria de adicionar campos personalizados no meu tipo de postagem personalizado ao feed RSS desse tipo de publicação localizado em http://example.com/feed/?post_type=my_custom_post_type

Vi informações sobre como fazer isso no feed regular, mas nada sobre como reescrever o feed do tipo de postagem personalizado.

Vou precisar adicionar de 10 a 15 itens no feed (primeiro ato, segundo ato, terceiro ato, preço, link de compra ...)

curtismchale
fonte

Respostas:

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

Você deve poder substituir e quaisquer outros valores meta que você precisa adicionar ao feed.

prettyboymp
fonte
1
então eu precisaria adicionar um item à verificação do tipo de postagem para cada meta-chave (provavelmente em torno de 10) e chamá-lo no modelo? Você não pode simplesmente chamar get_post_meta na área de meta-valor com o ID da postagem?
Curtismchale
2
Boa resposta!
precisa saber é o seguinte
@ curtismchale, acabei de incluir a resposta mais simples. Se você está pesquisando em muitos campos, provavelmente eu usaria algo formatado como a resposta de @ mikeschinkel.
prettyboymp
19

Olá @curtismchale:

Pegando carona na excelente resposta da @ prettyboymp , com a minha rotação, veja como você pode fazer vários campos personalizados (fiz 3, você pode fazer mais):

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 Não deixe de dar adereços para @prettyboymp, porque eu não sabia como fazer isso antes da resposta dele. Só estou respondendo também, porque não tenho certeza de quanto tempo levará para ele voltar, então decidi dar uma resposta nesse meio tempo.

MikeSchinkel
fonte
7

OBRIGADO OBRIGADO por esta excelente informação.

Eu queria estender o que os outros dois já escreveram ... Para isso, para validar, você deve ter um espaço para nome personalizado. Aqui está como você faz isso:

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

E prefixe o item do nome do campo com o namespace personalizado. Neste exemplo, usei "mycustomfields". Veja abaixo:

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

Em uma nota lateral, você pode usar uma ação para conectar-se a qualquer um dos três

    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');
Atos7
fonte
Para aqueles que aparecem aqui: O Jetpack anuncia os namespaces xmlns: geo e xmlns: georss. Não é necessário adicioná-los se você estiver usando o Jetpack.
MastaBaba