Ajouter des champs personnalisés au type de message personnalisé RSS

17

Je voudrais ajouter des champs personnalisés dans mon type de publication personnalisé au flux RSS pour ce type de publication situé sur http://example.com/feed/?post_type=my_custom_post_type

J'ai vu des informations sur la façon de procéder pour le flux régulier, mais rien sur la façon de réécrire le flux de type de publication personnalisé.

Je devrai ajouter 10 à 15 articles au flux (1er acte, 2e acte, 3e acte, prix, lien d'achat ...)

Curtismchale
la source

Réponses:

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

Vous devriez pouvoir remplacer et toutes les autres méta-valeurs que vous devez ajouter au flux.

prettyboymp
la source
1
donc j'aurais besoin d'ajouter un élément à la vérification du type de message pour chaque clé méta (probablement environ 10), puis de l'appeler dans le modèle? Vous ne pouvez pas simplement appeler get_post_meta dans la zone de valeur de méta avec l'identifiant de publication?
curtismchale
2
Bonne réponse!
MikeSchinkel
@curtismchale, je viens d'inclure la réponse la plus simple. Si vous saisissez autant de domaines, j'irais probablement avec quelque chose de plus formaté comme la réponse de @ mikeschinkel.
prettyboymp
19

Bonjour @curtismchale:

Ferroutage off @ de prettyboymp excellente réponse, avec ma rotation là - dessus, voici comment vous pouvez faire plusieurs champs personnalisés (je l' ai fait 3, vous pouvez faire plus):

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 Assurez-vous de donner des accessoires @prettyboymp parce que je ne savais pas comment faire cela avant sa réponse. Je réponds aussi parce que je ne sais pas combien de temps il faudra avant son retour, j'ai donc décidé de vous donner une réponse dans l'intervalle.

MikeSchinkel
la source
7

MERCI MERCI pour cette excellente information.

Je voulais étendre ce que les deux autres ont déjà écrit ... Pour que cela soit valide, vous devez avoir un espace de noms personnalisé. Voici comment procéder:

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

Et puis préfixez l'élément de nom de champ avec l'espace de nom personnalisé Dans cet exemple, j'ai utilisé "mycustomfields" Voir ci-dessous:

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

Sur une note latérale, vous pouvez utiliser une action pour accrocher dans l'un des 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');
Actes7
la source
Pour ceux qui apparaissent ici: Jetpack annonce les espaces de noms xmlns: geo et xmlns: georss. Pas besoin de les ajouter si vous utilisez Jetpack.
MastaBaba