Agregar campos personalizados al tipo de publicación personalizada RSS

17

Me gustaría agregar campos personalizados en mi tipo de publicación personalizada a la fuente RSS para ese tipo de publicación ubicada en http://example.com/feed/?post_type=my_custom_post_type

He visto información sobre cómo hacer esto para el feed regular, pero nada sobre cómo reescribir el feed de tipo de publicación personalizado.

Tendré que agregar de 10 a 15 elementos al feed (1er acto, 2º acto, 3er acto, precio, enlace de compra ...)

curtismchale
fuente

Respuestas:

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

Debería poder sustituir y cualquier otro metavalor que necesite agregar al feed.

prettyboymp
fuente
1
Entonces, ¿debo agregar un elemento a la verificación del tipo de publicación para cada metaclave (probablemente alrededor de 10) y luego llamarlo a la plantilla? ¿No puede simplemente llamar a get_post_meta en el área de metavalor con el ID de publicación?
curtismchale
2
¡Buena respuesta!
MikeSchinkel
@curtismchale, acabo de incluir la respuesta más simple. Si está tirando en tantos campos, probablemente iría con algo formateado más como la respuesta de @ mikeschinkel.
prettyboymp
19

Hola @curtismchale:

Que lleva a cuestas fuera de @ prettyboymp respuesta excelente, con mi vuelta en ella, aquí es cómo se puede hacer múltiples campos personalizados (lo hice 3, se puede hacer algo más):

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

PD: Asegúrate de darle accesorios a @prettyboymp porque no sabía cómo hacer esto antes de su respuesta. Solo estoy respondiendo porque no estoy seguro de cuánto tiempo pasará antes de que regrese, así que decidí darte una respuesta mientras tanto.

MikeSchinkel
fuente
7

GRACIAS GRACIAS por esta excelente información.

Quería extender lo que los otros dos ya han escrito ... Para que esto valide, debe tener un espacio de nombres personalizado. Así es como lo haces:

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

Y luego prefije el elemento del nombre del campo con el espacio de nombres personalizado. En este ejemplo, he usado "mycustomfields". Vea a continuación:

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

En una nota al margen, puede usar una acción para enganchar en cualquiera de los 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');
Hechos7
fuente
Para aquellos que se muestran aquí: Jetpack anuncia los espacios de nombres xmlns: geo y xmlns: georss. No es necesario agregarlos si está usando Jetpack.
MastaBaba