Je ne sais pas comment formuler ma question et j'ai cherché toute la journée, en vain.
Je cherche une méthode pour créer deux versions de mes flux RSS, une avec le contenu complet et une avec seulement l'extrait.
Je souhaite principalement faire cela pour les flux "Auteur". Je voudrais deux flux créés pour chaque auteur. Une avec le contenu complet et une avec l'extrait. Si rien d'autre, j'aimerais que le fil RSS de l'auteur ne contienne que des extraits, mais le fil RSS du site principal doit TOUJOURS être un fil de contenu complet.
La raison? Le site Web en question est un site Web sportif. Je souhaite proposer le flux RSS complet à ceux qui le souhaitent, mais je publie également automatiquement mes propres articles sur mon site Web personnel (quelques-uns le font également). Lorsque l'article est publié sur mon propre site Web, je souhaite inclure uniquement l'extrait, avec un lien vers l'article original complet.
Je me fiche de la méthode utilisée, que ce soit du code ou du plugin.
UPDATE
Je travaille pour que les méthodes décrites par Michael Ecklund et Ian Dunn fonctionnent. Je n'ai pas été capable de travailler non plus. Les deux méthodes affichent toujours l'article complet dans le flux RSS et non l'extrait.
Je ne sais pas si cela fait une différence, mais je viens de me rappeler que j'utilise le plugin Advanced Excerpt pour gérer les extraits sur mon site Web. Je n'ai pas essayé de désactiver ce plugin, car il contrôle la page d'accueil, les pages de catégories, les pages de balises, les pages d'auteurs, etc.
Mon approche serait de:
For each article in a feed, show...
sur Full Text
afin que, par défaut, les flux incluent l'intégralité de la publication.http://example.com/author/username/feed?format=excerpt
. Assurez-vous de ne pas utiliser un terme réservé pour le nom du paramètre.http://example.com/author/username/feed
.Voici un code qui fait cela, en utilisant format
comme nom de paramètre. Vous pouvez utiliser n'importe quel nom de paramètre, à condition de mettre à jour chaque partie du code qui la référence. Placez le code dans un plugin fonctionnalité .
function truncateFeedContent( $content )
{
if( get_query_var( 'format' ) == 'excerpt' )
{
$content = get_the_excerpt();
$content = apply_filters( 'the_excerpt_rss', $content );
}
return $content;
}
add_filter( 'the_content_feed', 'truncateFeedContent' );
function addFormatQueryVar( $queryVars )
{
$queryVars[] = 'format';
return $queryVars;
}
add_filter( 'query_vars', 'addFormatQueryVar' );
Pour éviter un conflit avec le plug-in Advanced Excerpt, ajoutez également ce code au plug-in de fonctionnalité. Il désactivera la fonctionnalité Advanced Excerpt sur les URL de flux, mais le laissera intact pour toutes les autres pages.
function stopAdvancedExcerptOnFeeds()
{
if( is_feed() )
remove_filter( 'get_the_excerpt', array( 'AdvancedExcerpt', 'filter' ) );
}
add_action( 'pre_get_posts', 'stopAdvancedExcerptOnFeeds' );
Voici un petit plugin qui vous permet de remplacer l'option Texte intégral / Résumé feed, via un simple paramètre GET:
<?php
/**
* Plugin Name: Feeds with Summary Or Full Text
* Description: GET parameter _summary with values yes or no
* Plugin URI: http://wordpress.stackexchange.com/a/195197/26350
*/
add_action( 'rss_tag_pre', function( $tag )
{
$summary = filter_input( INPUT_GET, '_summary', FILTER_SANITIZE_STRING );
if( 'yes' === $summary )
add_filter( 'option_rss_use_excerpt', '__return_true' );
elseif( 'no' === $summary )
add_filter( 'option_rss_use_excerpt', '__return_false' );
} );
Il respecte les paramètres actuels, sans le paramètre GET. J'utilise le trait de soulignement pour éviter d'éventuelles collisions de noms, mais sinon, j'ai relevé le défi de garder le plugin très simple & court ;-) Nous pourrions facilement utiliser l'argument $tag
, pour contraindre ceci à rss2 ou atome , si nécessaire. N'oubliez pas d'utiliser des paramètres de contournement du cache lorsque vous testez cela dans votre navigateur.
example.tld/feed/?_summary=yes // Summary
example.tld/feed/?_summary=no // Full Text
example.tld/feed/ // Uses Default settings
example.tld/author/anna/feed/?_summary=yes // Summary
example.tld/author/anna/feed/?_summary=no // Full Text
example.tld/author/anna/feed/ // Uses Default settings
Il existe en fait une approche assez facile pour accomplir cette tâche particulière.
Suivez ces étapes pour créer facilement un flux RSS personnalisé sur votre site Web WordPress:
Vous pouvez maintenant accéder à votre flux personnalisé à l'adresse suivante: votre- domaine.com/custom-feed/user-slug/
Les crédits vont à Joost de Valk pour avoir publié un excellent article . Cependant, j'ai légèrement modifié son code par rapport à l'article d'origine.
<?php
/*
Template Name: Custom Feed
*/
//----------------------------------------
// CONFIGURE THIS
//----------------------------------------
$contentType = 'excerpt';// Enter 'excerpt' or 'content'
$numposts = 5;// Enter number of posts to display for each author
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// NO MORE CONFIGURATION NECESSARY
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
function custom_rss_date( $timestamp = null ) {
$timestamp = ($timestamp==null) ? time() : $timestamp;
echo date(DATE_RSS, $timestamp);
}
function custom_rss_text_limit($string, $length, $replacer = '...') {
$string = strip_tags($string);
if(strlen($string) > $length)
return (preg_match('/^(.*)\W.*$/', substr($string, 0, $length+1), $matches) ? $matches[1] : substr($string, 0, $length)) . $replacer;
return $string;
}
function custom_rss_post_id() {
global $wp_query;
$thePostID = $wp_query->post->ID;
return $thePostID;
}
$thePage = get_page(custom_rss_post_id());
$posts = query_posts('showposts='.$numposts.'&author_name='.$thePage->post_name);
$lastpost = $numposts - 1;
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: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 bloginfo_rss('name'); wp_title_rss(); ?>
</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>
<lastBuildDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false); ?></lastBuildDate>
<language>
<?php bloginfo_rss( 'language' ); ?>
</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 foreach ($posts as $post) { ?>
<item>
<title><?php echo get_the_title($post->ID); ?></title>
<link>
<?php echo get_permalink($post->ID); ?>
</link>
<description>
<?php
if(!empty($contentType) && $contentType == 'excerpt'){
echo '<![CDATA['.custom_rss_text_limit($post->post_content, 500).']]>';
} elseif(!empty($contentType) && $contentType == 'content'){
echo '<![CDATA['.apply_filters('the_content', $post->post_content).']]>';
}
?>
</description>
<pubDate>
<?php custom_rss_date( strtotime($post->post_date_gmt) ); ?>
</pubDate>
<guid><?php echo get_permalink($post->ID); ?></guid>
</item>
<?php } ?>
</channel>
</rss>
Vous pouvez placer ceci dans votre fichier functions.php du thème WordPress actif actuel:
// Tell the hourly cronjob what operation it needs to perform.
add_action('update_custom_user_feeds', 'create_custom_user_feeds');
// Create a cronjob to update our custom feeds hourly.
function cron_custom_user_feeds(){
if(!wp_next_scheduled('update_custom_user_feeds')){
wp_schedule_event(current_time('timestamp'), 'hourly', 'update_custom_user_feeds');
}
}
add_action('init', 'cron_custom_user_feeds');
// Delete our hourly cronjob when the theme is changed.
function clear_custom_user_feeds(){
wp_clear_scheduled_hook('update_custom_user_feeds');
}
add_action('switch_theme', 'clear_custom_user_feeds');
// Generate the custom user feeds
function create_custom_user_feeds(){
// "Custom Feed" is the main feed page.
$feedParent = get_page_by_title('Custom Feed', 'OBJECT', 'page');
if(!$feedParent){
$pageData = array(
'post_title' => 'Custom Feed',
'post_name' => 'custom-feed',
'post_status' => 'publish',
'post_type' => 'page'
);
// Create custom user feed.
$parentID = wp_insert_post($pageData);
} else{
$parentID = $feedParent->ID;
}
$wpUsers = get_users();
for($i = 0; $i < count($wpUsers); $i++){
// Check if the custom user feed already exists.
$userFeed = get_page_by_title($wpUsers[$i]->user_nicename, 'OBJECT', 'page');
if(!$userFeed){
$pageData = array(
'post_title' => $wpUsers[$i]->user_nicename,
'post_name' => $wpUsers[$i]->user_nicename,
'post_status' => 'publish',
'post_type' => 'page',
'post_parent' => $parentID
);
// Create custom user feed.
$insertPage = wp_insert_post($pageData);
if($insertPage){
// Assign our custom feed template.
update_post_meta($insertPage, '_wp_page_template', 'your_custom_feed.php');
}
}
}
// Attempt to flush caches
wp_cache_flush();
if(function_exists('w3tc_objectcache_flush')){
w3tc_objectcache_flush();
}
if(function_exists('w3tc_pgcache_flush')){
w3tc_pgcache_flush();
}
if(function_exists('w3tc_minify_flush')){
w3tc_minify_flush();
}
if(function_exists('w3tc_dbcache_flush')){
w3tc_dbcache_flush();
}
}
Maintenant, je ne dis pas que cette solution est pratique, mais cela fonctionne.
Alternativement, vous pouvez éventuellement faire un usage de cette classe que j'ai faite en utilisant add_feed();
Instructions d'utilisation de cette méthode de classe dans votre thème. (Remarque: cette classe pourrait facilement être intégrée dans un plugin.)
Vous pouvez maintenant accéder à votre flux personnalisé à l'adresse suivante: votre- domaine.com/feed/custom-user-slug/
Remarque: vous pouvez remplacer le préfixe "personnalisé" par tout ce que vous souhaitez. Il suffit de configurer les paramètres dans le constructeur de classe.
<?php
if(!class_exists('custom_feeds')){
class custom_feeds{
private $feed_settings;
private $feed_data;
public function __construct(){
// Configure the Feed
$this->feed_settings['number_posts'] = -1;// # of feed items, -1 means all posts
$this->feed_settings['content_type'] = 'excerpt';// Excerpt or Content
$this->feed_settings['excerpt_length'] = 500;// if excerpt, display how many characters?
$this->feed_settings['offset_posts'] = 0;// Skip # of recent posts
$this->feed_settings['custom_prefix'] = 'custom';// domain.com/feed/{prefix}-feed-name/
$this->feed_settings['signature_link'] = false;// add link back to your site after the content.
// Specify what type of feed you want to create.
$this->prepare_feed('user');// All users, Nice names
//$this->prepare_feed('user', 'some-user');// Specific user's Nice name
// Prepare the feed
add_action('init', array($this, 'setup_custom_feeds'));
}
public function setup_custom_feeds(){
global $wp_rewrite;
// Add a feed for each type.
foreach($this->feed_data as $type => $posts){
add_feed($this->feed_settings['custom_prefix'].'-'.$type, call_user_func_array(array($this, 'display_feed'), array($type, $posts)));
}
// Flush rewrite rules.
$wp_rewrite->flush_rules();
// Attempt to flush caches.
$this->flush_all_caches();
}
public function prepare_feed($type, $Nice_name=NULL){
if($type == 'user'){
if(!is_null($Nice_name)){
// Get specified user.
$data[] = get_user_by('slug', $Nice_name);
} else{
// Get all users.
$data = get_users();
}
// Find posts for our request.
for($i = 0; $i < count($data); $i++){
$userPosts = new WP_Query(array('posts_per_page' => intval($this->feed_settings['number_posts']), 'author_name' => $data[$i]->user_nicename, 'offset' => intval($this->feed_settings['offset_posts'])));
wp_reset_postdata();
if(!empty($userPosts->posts)){
$theData[$data[$i]->user_nicename] = $userPosts->posts;
}
}
}
$this->feed_data = $theData;
}
public function display_feed($type, $posts){
$current_feed = explode('/feed/', $this->self_link());
if($this->feed_settings['custom_prefix'].'-'.$type == $current_feed[1]){
header('Content-Type: '.feed_content_type('rss-http').'; charset='.get_option('blog_charset'), true);
echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'.PHP_EOL;
echo '<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: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/"';
do_action('rss2_ns');
echo '>'.PHP_EOL;
echo '<channel>'.PHP_EOL;
echo '<title>';
bloginfo_rss('name');
wp_title_rss();
echo '</title>'.PHP_EOL;
echo '<atom:link href="'.$this->self_link().'" rel="self" type="application/rss+xml" />'.PHP_EOL;
echo '<link>'.get_bloginfo_rss('url').'</link>'.PHP_EOL;
echo '<description>'.get_bloginfo_rss('description').'</description>'.PHP_EOL;
echo '<lastBuildDate>'.mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false).'</lastBuildDate>'.PHP_EOL;
echo '<language>'.get_bloginfo_rss('language').'</language>'.PHP_EOL;
echo '<sy:updatePeriod>'.apply_filters('rss_update_period', 'hourly').'</sy:updatePeriod>'.PHP_EOL;
echo '<sy:updateFrequency>'.apply_filters('rss_update_frequency', '1').'></sy:updateFrequency>'.PHP_EOL;
// Begin displaying posts in our feed.
foreach($posts as $post){
echo '<item>'.PHP_EOL;
echo '<title>'.$post->post_title.'</title>'.PHP_EOL;
echo '<link>'.get_permalink($post->ID).'</link>'.PHP_EOL;
echo '<description>'.PHP_EOL;
if($this->feed_settings['signature_link']){
$feed_signature = '<h3>Original Post:<br /> <a title="'.$post->post_title.'" href="'.get_permalink($post->ID).'">'.$post->post_title.'</a></h3>';
} else{
$feed_signature = '';
}
if(!empty($this->feed_settings['content_type']) && $this->feed_settings['content_type'] == 'excerpt'){
echo '<![CDATA['.$this->custom_rss_text_limit($post->post_content, intval($this->feed_settings['excerpt_length'])).$feed_signature.']]>'.PHP_EOL;
} elseif(!empty($this->feed_settings['content_type']) && $this->feed_settings['content_type'] == 'content'){
echo '<![CDATA['.apply_filters('the_content', $post->post_content).$feed_signature.']]>'.PHP_EOL;
}
echo '</description>'.PHP_EOL;
echo '<pubDate>'.$this->custom_rss_date(strtotime($post->post_date_gmt)).'</pubDate>'.PHP_EOL;
echo '<guid>'.$post->guid.'</guid>'.PHP_EOL;
echo '</item>'.PHP_EOL;
}
echo '</channel>'.PHP_EOL;
echo '</rss>'.PHP_EOL;
}
}
private function custom_rss_date($timestamp = null){
$timestamp = ($timestamp==null) ? time() : $timestamp;
return date(DATE_RSS, $timestamp);
}
private function custom_rss_text_limit($string, $length, $replacer = '...'){
$string = strip_tags($string);
if(strlen($string) > $length)
return (preg_match('/^(.*)\W.*$/', substr($string, 0, $length+1), $matches) ? $matches[1] : substr($string, 0, $length)) . $replacer;
return $string;
}
private function self_link(){
$Host = @parse_url(home_url());
$Host = $Host['Host'];
$return = esc_url(
'http'
. ( (isset($_SERVER['https']) && $_SERVER['https'] == 'on') ? 's' : '' ) . '://'
. $Host
. stripslashes($_SERVER['REQUEST_URI'])
);
return $return;
}
private function flush_all_caches(){
wp_cache_flush();
if(function_exists('w3tc_objectcache_flush')){
w3tc_objectcache_flush();
}
if(function_exists('w3tc_pgcache_flush')){
w3tc_pgcache_flush();
}
if(function_exists('w3tc_minify_flush')){
w3tc_minify_flush();
}
if(function_exists('w3tc_dbcache_flush')){
w3tc_dbcache_flush();
}
}
}// END custom_feeds class.
// Instantiate the class.
$custom_feeds = new custom_feeds();
}// END custom_feeds class exists.
?>
Remarque: Je ne sais pas si cela fonctionnerait bien sur des sites Web à grande échelle. Bien que la façon dont j'ai configuré cette classe permette une manipulation facile. Vous pouvez utiliser cette même classe pour générer des flux d'un type de publication personnalisé ou une taxonomie personnalisée. Ma classe Custom Feeds a été testée sur WordPress 3.4.1 et fonctionne correctement.
Si vous voulez l'utiliser comme je l'ai configuré actuellement, il vous suffit de configurer les paramètres de flux dans le constructeur de la classe.
Vous accéderiez à une version courte avec un extrait à l'adresse: http://www.dicazine.com.br/author/admin/feed?version=short
Le moins le mieux:
add_filter('the_content','author_feed_version',10);
function author_feed_version($content) {
if(is_feed()){
if($_GET['version'] == 'version')
$content = limit_words(strip_tags($content),100);
}
return $content;
}
function limit_words($string, $Word_limit){
$words = explode(" ",$string);
return implode(" ",array_splice($words,0,$Word_limit));
}