本篇文章更新時間:2023/09/02
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知或向一介資男的 LINE 社群反應。
如果本站內容對你有幫助,歡迎贊助支持


WordPress 內建有一個預設的 RSS Feed,就是網站網址後補上 /feed/,像是: https://www.mxp.tw/feed/ 。一般來說沒特殊用途,有人跟你說要 RSS Feed 給這個連結就好!

有興趣購買本篇文章的完整 Yahoo / FTV 民視 RSS Feed 功能完整程式碼的讀者,可以使用 付款連結 金額: 3000 元新台幣,並來信聯絡告知。收到款項後隨即發信完整打包原始碼以及安裝說明。

2023/09 新增 遊戲橘子 beanfun! 的 RSS。金額: 3000 元新台幣

不過有些新聞台接收其他媒體投稿的方式雖然也是 RSS 格式,但會有自己要求的特殊欄位。

常見的有:特殊分類方式 <category>、文章特色圖片 <enclosure>,或是原本預設的欄位呈現內容的定義調整(例如描述欄位直接塞內文全文)

簡單來說,這樣的修改幅度不建議直接去修改內建的 feed 來完成,建立過一個才是正確做法。

最近剛好客戶有需求實作 民視 、 Yahoo 與 遊戲橘子 beanfun! 的 RSS Feed,正是上述的情況。面對 1. 是否需要輸出該篇文章到 Feed 上?2. 輸出時需要帶入的資訊 這兩個問題,我們使用 ACF 客製化欄位工具在文章編輯處新增一些控制項。

然後就是開始在子主題中 functions.php 補上客製化 RSS 的程式:

function mxp_custom_rss_feed_channels() {
    add_feed('ftv_feed', 'mxp_custom_rss_feed_for_ftv_callback');
}
add_action('init', 'mxp_custom_rss_feed_channels');

function mxp_custom_rss_feed_for_ftv_callback() {
    get_template_part('rss', 'ftv');
}

這邊舉例民視的為主,宣告新增一個 ftv_feed 的 Feed,然後指定一個樣板 rss-ftv.php

然後就是一樣子主題下編輯 rss-ftv.php 檔案,加入下方的程式:

<?php
/**
 * Template Name: 民視 FTV RSS
 */
function wxr_cdata($str) {
    $str = '<![CDATA[' . str_replace(']]>', ']]]]><![CDATA[>', $str) . ']]>';
    return $str;
}
$posts = get_posts(
    array(
        'numberposts' => 10,
        'orderby'     => 'date',
        'order'       => 'DESC',
        'meta_query'  => array(
            array(
                'key'     => 'rss1_control',
                'value'   => '1',
                'compare' => '=',
            ),
        ),
    )
);
header('Content-Type: ' . feed_content_type('rss-http') . '; charset=' . get_option('blog_charset'), true);
echo '<?xml version="1.0" encoding="' . get_option('blog_charset') . '"?>';
?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" <?php do_action('rss2_ns');?>>
<channel>
<title><?php wxr_cdata(bloginfo_rss('name'));?> - FTVFeed</title>
<atom:link href="<?php self_link();?>" rel="self" type="application/rss+xml" />
<link><?php bloginfo_rss('url')?></link>
<description><?php bloginfo_rss('description')?></description>
<pubDate><?php echo mysql2date('D, d M Y H:i:s +0800', get_lastpostmodified('GMT'), false); ?></pubDate>
<language>zh-tw</language>
<sy:updatePeriod><?php echo apply_filters('rss_update_period', 'hourly'); ?></sy:updatePeriod>
<sy:updateFrequency><?php echo apply_filters('rss_update_frequency', '1'); ?></sy:updateFrequency>
<?php
do_action('rss2_head');
foreach ($posts as $index => $post) {
    $item = '<item>';
    $item .= '<title>' . apply_filters('the_title_rss', $post->post_title) . '</title>' . PHP_EOL;
    $item .= '<link>' . esc_url(apply_filters('the_permalink_rss', get_the_permalink($post->ID))) . '</link>' . PHP_EOL;
    $item .= '<pubDate>' . mysql2date('D, d M Y H:i:s +0800', get_post_time('Y-m-d H:i:s', true), false) . '</pubDate>' . PHP_EOL;
    $item .= '<dc:creator>' . get_the_author_meta('display_name', $post->post_author) . '</dc:creator>' . PHP_EOL;
    $item .= '<guid isPermaLink="false">' . get_the_guid($post->ID) . '</guid>' . PHP_EOL;
    $item .= '<description><![CDATA[' . apply_filters('the_content_rss', get_the_content($post->ID)) . ']]></description>' . PHP_EOL;    
    $thumbnail_id = get_post_thumbnail_id($post->ID);
    if ($thumbnail_id !== false) {
        $img_url    = wp_get_attachment_image_url($thumbnail_id);
        $upload_dir = wp_upload_dir();
        $item .= '<enclosure url="' . $img_url . '" type="' . get_post_mime_type($thumbnail_id) . '"/>' . PHP_EOL;
    }
    $cat_id   = get_post_meta($post->ID, 'rss1_rss_cat', true);
    $cat_name = get_cat_name($cat_id);
    $the_cat_list = "<category>" . $cat_name . "</category>" . PHP_EOL;
    echo $item . $the_cat_list;
    rss_enclosure();
    do_action('rss2_item');
    echo '</item>' . PHP_EOL;
    $item = '';
}
echo '</channel></rss>';

都建立完成後,要去後台「設定」->「永久連結」重新存擋一次來啟用,這樣就完成客製化一個新的 RSS 囉~

其他媒體平台有個別的需求也是比照辦理即可。


Share:

作者: Chun

WordPress 社群貢獻者、開源社群推廣者。專注於 WordPress 外掛開發、網站效能最佳化、伺服器管理,以及 iDempiere 開源 ERP 導入與客製開發。曾參與 WordCamp Taipei 等社群活動,GitHub Arctic Code Vault Contributor。提供資訊顧問、WordPress 開發教學、主機最佳化與企業 ERP 整合服務。

參與討論

  1. debra15
  2. Chun

4 則留言

  1. 你這篇早點出來多好,我之前弄LINE的弄好久啊!

      1. 對,LINE Today,不過我在弄的時候是2018年初,這個外掛或許還沒出來,不然他有用 feed 這個 tag,應該會找到才是。

發佈留言

發佈回覆給「Chun」的留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon