FeedWordPress is the best free plugin to syndicate posts from WordPress RSS feeds. Syndication is not the best practice, but it suits the needs of a client and their site network.
However, there is some minor issues. There is no built in duplicate post detection. This can create a mess when syndicating multiple feeds that may contain the same posts. Also, a default category is not assigned to posts if there is no matching category on your site. Place the below filter in your themes functions.php file to correct these issues.
/**
* FeedWordPress - Detect duplicates and prepare the syndicated post.
*
* @param array $post
* @param SyndicatedPost $syndicatedpost
* @return array|null
*/
add_filter('syndicated_post', function (array $post, SyndicatedPost $syndicatedpost) {
// --- Duplicate Detection
if (!$syndicatedpost->fresh_content_is_update()) {
global $wpdb;
$duplicate_post = $wpdb->get_row($wpdb->prepare("
SELECT ID FROM $wpdb->posts
WHERE post_status = 'publish' AND post_type = 'post' AND post_title = %s
AND ( post_date BETWEEN DATE_SUB( %s, INTERVAL 2 HOUR ) AND DATE_ADD( %s, INTERVAL 1 HOUR ) )
LIMIT 1
", [
$post[ 'post_title' ],
$post[ 'post_date' ],
$post[ 'post_date' ]
]));
// Is it a duplicate post?
if (!empty($duplicate_post)) {
return null;
}
}
// --- Prepare Syndicated Post
// Assign the default category when a post has no categories.
// No idea why FeedWordPress doesn't do this by default.
if (empty($post[ 'tax_input' ][ 'category' ])) {
$post[ 'tax_input' ][ 'category' ][] = intval(get_option('default_category'));
}
// Syndicated posts will include a 'read more' from the source site at the
// end of their excerpts. Strip that out.
$post[ 'post_excerpt' ] = preg_replace("/(…|…) <a href=.+<\/a>/", '', $post[ 'post_excerpt' ]);
$post[ 'post_excerpt' ] = preg_replace("/\\[…\\]/", '', $post[ 'post_excerpt' ]);
$post[ 'post_excerpt' ] = trim($post[ 'post_excerpt' ]);
return $post;
}, 10, 2);
Lastly, we don’t want search engines to index these articles, they aren’t original content on our site. I also make use of Yoast WordPress SEO, we’ll use that to our advantage.
/**
* Yoast WordPress SEO - Hide Syndicated Posts, and Sign Up form from Search Engines.
*
* @return void
*/
add_action('template_redirect', function (): void {
if (!function_exists('YoastSEO')) {
return;
}
$noindex = false;
// Don't index Syndicated posts from FeedWordpress
$is_syndicated = false;
if (function_exists('is_syndicated')) {
$is_syndicated = is_syndicated();
}
if (is_single() && $is_syndicated) {
$noindex = true;
}
if ($noindex) {
add_filter('wpseo_robots_array', [ YoastSEO()->helpers->robots, 'set_robots_no_index' ], 10, 2);
}
});


