Добавить пользовательские поля в пользовательский тип сообщения RSS

17

Я хотел бы добавить настраиваемые поля в своем настраиваемом типе записи в канал RSS для этого типа записи, расположенного по адресу http://example.com/feed/?post_type=my_custom_post_type.

Я видел информацию о том, как сделать это для обычного фида, но ничего о том, как переписать пользовательский фид типа записи.

Мне нужно будет добавить в канал 10-15 предметов (1-й акт, 2-й акт, 3-й акт, цена, ссылка на покупку ...)

curtismchale
источник

Ответы:

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

Вы должны иметь возможность заменять и любые другие мета значения, которые нужно добавить в канал.

prettyboymp
источник
1
поэтому мне нужно добавить элемент в проверку типа записи для каждого мета-ключа (вероятно, около 10), а затем вызвать его в шаблон? Вы не можете просто вызвать get_post_meta в области мета-значений с идентификатором записи?
Curtismchale
2
Хороший ответ!
MikeSchinkel
@curtismchale, я просто включил самый простой ответ. Если вы добавляете столько полей, я бы, вероятно, выбрал что-то более похожее на ответ @ mikeschinkel.
prettyboymp
19

Привет @curtismchale:

Спекуляция от @ prettyboymp в отличном ответе, с моей спиной на нем, вот как вы можете сделать несколько пользовательских полей (я сделал 3, вы можете сделать больше):

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 Обязательно дайте реквизит @prettyboymp, потому что я не знал, как это сделать до его ответа. Я просто отвечаю, потому что я не уверен, сколько времени пройдет, прежде чем он вернется, поэтому я решил дать вам ответ в это время.

MikeSchinkel
источник
7

СПАСИБО ЗА СПАСИБО за эту отличную информацию.

Я хотел расширить то, что уже написали два других ... Чтобы это проверить, у вас должно быть собственное пространство имен. Вот как вы это делаете:

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

А затем добавьте префикс имени поля к пользовательскому пространству имен. В этом примере я использовал «mycustomfields». См. Ниже:

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

На боковой ноте вы можете использовать действие, чтобы подключиться к любому из 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
источник
Для тех, кто появляется здесь: Jetpack рекламирует пространства имен xmlns: geo и xmlns: georss. Нет необходимости добавлять их, если вы используете Jetpack.
MastaBaba