Here’s a fairly complete example of one way to do this.
Let’s register a Job post type that will be used with our feed.
/**
* Register Job post type
* https://developer.wordpress.org/reference/functions/register_post_type/
*/
function wpse_register_job_post() {
$book_args = [
'label' => __( 'Jobs', 'textdomain' ),
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => [ 'slug' => 'jobs' ],
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => null,
'supports' => [ 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments', 'custom-fields' ],
];
register_post_type( 'jobby_job', $book_args );
}
add_action( 'init', 'wpse_register_job_post' );
Now for the good stuff. Let’s create our custom feed and renderer. The feed can be accessed by visiting http://example.com/?feed=indeed
Register Feed
/**
* Create a custom feed.
* https://developer.wordpress.org/reference/functions/add_feed/
*/
function wpse_add_indeed_job_feed() {
add_feed( 'indeed', 'wpse_render_indeed_job_feed' );
}
add_action( 'init', 'wpse_add_indeed_job_feed' );
Render Feed
/**
* Render our custom feed.
*/
function wpse_render_indeed_job_feed() {
header( 'Content-Type: ' . feed_content_type( 'rss2' ) . '; charset=" . get_option( "blog_charset' ), true );
echo '<?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '>';
?>
<source>
<publisher><?php wp_title_rss(); ?></publisher>
<publisherurl><?php echo get_site_url(); ?></publisherurl>
<lastBuildDate><?php echo date( 'D, j M Y G:i:s' ) . ' GMT'; ?></lastBuildDate>
<?php
// Get the job posts. Customize arguments as needed.
$job_query = new WP_Query( [
'post_type' => 'jobby_job',
'posts_per_page' => 42,
] );
if ( $job_query->have_posts() ) {
while ( $job_query->have_posts() ) {
$job_query->the_post();
// Note: You'll need to get the various post meta fields and add them below.
// Use get_post_meta() or for ACF, get_field() can be used.
// Meta is hard coded in this example.
?>
<job>
<title><![CDATA[<?php the_title_rss(); ?>]]></title>
<date><![CDATA[<?php echo mysql2date( 'D, d M Y H:i:s +0000', get_post_time( 'Y-m-d H:i:s', true ), false ); ?>]]></date>
<referencenumber><![CDATA[unique123131]]></referencenumber>
<url><![CDATA[<?php the_permalink_rss(); ?>]]></url>
<company><![CDATA[Big ABC Corporation]]></company>
<city><![CDATA[Phoenix]]></city>
<state><![CDATA[AZ]]></state>
<country><![CDATA[US]]></country>
<postalcode><![CDATA[85003]]></postalcode>
<description><![CDATA[<?php echo get_the_content_feed( 'rss2' ); ?>]]></description>
<salary><![CDATA[$50K per year]]></salary>
<education><![CDATA[Bachelors]]></education>
<jobtype><![CDATA[fulltime, parttime]]></jobtype>
<category><![CDATA[Category1, Category2, CategoryN]]></category>
<experience><![CDATA[5+ years]]></experience>
</job>
<?php } ?>
<?php } ?>
</source>
<?php
wp_reset_postdata();
}
For reference, WP’s default RSS feed template is located at wp-includes/feed-rss2.php
.
Remember to clear your cache when working on customizing the feed since browsers tend to cache the output.
Some other resources: