Intereting Posts
Изменить дату публикации в меню для публикации заголовка Установите флажок из окна ACF get_post_meta не извлекает заголовок, permalink и posttype Использование оператора IF в файле заголовка Переместился на новый сервер, резервное копирование было днем ​​и отсутствовало 3 сообщения, так или иначе, чтобы восстановить их со старого хоста? Проверьте, зарегистрировано ли конкретное имя пользователя Опция WP Plugin with Upgrade Работает ли рамка «Тема» или создатели темы замедляют производительность? URL-адрес субдомена WordPress CDN недоступен для публики Профили пользователей и ассоциации объектов Runng Cron Job для плагина без доступа к CronTab Как я могу сортировать категории по ID tinymce.get () возвращает ошибку после запроса ajax Изображения, которые не отображаются на главной странице после миграции автоматическое создание пользовательских статей типа post

Несколько версий RSS-канала? Один с полным содержанием, один с выдержкой

Я не знаю, как рассказать о моем вопросе, и я искал весь день, но безрезультатно.

Я ищу метод для создания двух версий моих RSS-каналов, один из которых содержит полный контент и один только с отрывком.

В основном, я хочу сделать это для каналов «Автор». Я бы хотел, чтобы для каждого автора создавались два канала. Один с полным содержанием и один с выдержкой. Если ничего другого, я бы хотел, чтобы RSS-канал автора имел только выдержки, но основной RSS-канал сайта должен ВСЕГДА быть полным контентом контента.

Причина? Этот веб-сайт является спортивным сайтом. Я хочу предлагать RSS в полном объеме для тех, кто этого хочет, но я также автоматически публикую свои статьи на моем личном веб-сайте (некоторые другие также делают). Когда статья отправляется на мой собственный сайт, я хочу включить только выдержку со ссылкой на полную оригинальную статью.

Меня не волнует используемый метод, будь то код или плагин.

ОБНОВИТЬ

Я работал над тем, чтобы попытаться найти методы, описанные Майклом Эклундом и Яном Данном. Я не смог ни работать, ни работать. Оба метода по-прежнему показывают полную статью в RSS-канале, а не в выдержке.

Я не уверен, что это имеет значение, но я просто вспомнил, что я использую плагин Advanced Excerpt для управления выдержками на моем веб-сайте. Я не пробовал отключить этот плагин, так как он управляет домашней страницей, страницами категорий, страницами тегов, страницами авторов и т. Д.

Solutions Collecting From Web of "Несколько версий RSS-канала? Один с полным содержанием, один с выдержкой"

Мой подход будет заключаться в следующем:

  1. На странице «Параметры чтения» установите для параметра « For each article in a feed, show... вариант « Full Text чтобы по умолчанию каналы включали всю запись.
  2. Передайте настраиваемый параметр URL для каждого отдельного канала, если вы хотите выдержку вместо полного текста. например, http://example.com/author/username/feed?format=excerpt . Убедитесь, что вы не используете зарезервированный термин для имени параметра.
  3. Подключитесь к процессу создания фида и измените контент на основе того, присутствует ли пользовательский параметр в URL текущего канала.
  4. Если он присутствует, переопределите содержимое канала, чтобы отображать только выдержку, а не полный текст.
  5. Когда вы хотите полный контент, просто используйте обычный URL. например, http://example.com/author/username/feed .

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

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

Чтобы избежать конфликта с плагином Advanced Excerpt, добавьте этот код в плагин функциональности. Он отключит функциональность расширенного эксперемента для URL-адресов каналов, но оставит его тактично для всех других страниц.

 function stopAdvancedExcerptOnFeeds() { if( is_feed() ) remove_filter( 'get_the_excerpt', array( 'AdvancedExcerpt', 'filter' ) ); } add_action( 'pre_get_posts', 'stopAdvancedExcerptOnFeeds' ); 

Plugin

Вот крошечный плагин, который позволяет вам переопределить параметр Full-Text / Summary feed, используя простой параметр 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' ); } ); 

Он учитывает текущие настройки без параметра GET. Я использую подчеркивание, чтобы избежать возможных коллизий имен, но в остальном я взял на себя задачу сохранить плагин очень простым и коротким 😉 Мы могли бы легко использовать аргумент $tag , чтобы ограничить это rss2 или атомом , если это необходимо. Не забудьте использовать параметры перебора кеша при проверке этого в вашем браузере.

Примеры использования

 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 

Вы получите доступ к короткой версии с выдержкой по адресу: http://www.dicazine.com.br/author/admin/feed?version=short

Чем меньше, тем лучше:

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

На самом деле существует довольно простой подход для выполнения этой конкретной задачи.

МЕТОД ОДИН

Выполните следующие шаги, чтобы легко создать настраиваемый канал RSS на своем веб-сайте WordPress:

  1. Создайте собственный шаблон страницы. Назовите его your_custom_feed.php
  2. Вставьте код в первый блок кода в файл your_custom_feed.php
  3. Загрузите файл your_custom_feed.php в текущий активный каталог темы WordPress.
  4. Вставьте второй блок кода в текущий активный файл WordPress functions.php.
  5. Деактивируйте и активируйте свою тему, чтобы она вступила в силу.

Теперь вы можете получить доступ к своему пользовательскому каналу по адресу: your-domain.com/custom-feed/user-slug/

Кредиты идут на Joost de Valk за публикацию отличной статьи . Однако я немного изменил его код из оригинальной статьи.

 <?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 MYH: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> 

Вы можете поместить это в текущую активную WordPress тему functions.php:

 // 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(); } } 

Теперь я не говорю, что это решение практично, но оно работает.

Кроме того, вы можете сделать некоторое использование этого класса, который я создал, который использует add_feed();

МЕТОД ДВА

Указания по использованию этого метода класса в вашей теме. (Примечание. Этот класс можно легко интегрировать в плагин.)

  1. Создайте подкаталог в текущей активной теме WordPress. Назовите его: «inc». (Структура каталогов должна выглядеть так: ./wp-content/themes/ your_theme / inc /)
  2. Создайте файл PHP и поместите блок кода ниже (Третий / последний блок кода в этом ответе) в файле. Сохраните его как custom-feeds.php
  3. Загрузите custom-feeds.php в свой каталог «inc».
  4. Может потребоваться деактивировать и активировать вашу тему, чтобы она вступила в силу.

Теперь вы можете получить доступ к своему пользовательскому каналу по адресу: your-domain.com/feed/custom-user-slug/

Примечание: вы можете изменить префикс «custom-» на все, что хотите. Просто настройте параметры в конструкторе класса.

 <?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 MYH: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. ?> 

Примечание. Я не знаю, насколько хорошо он будет работать на крупных веб-сайтах. Хотя способ, которым я настраивал этот класс, позволяет легко манипулировать. Вы можете использовать этот же класс для генерации фидов настраиваемого типа сообщений или пользовательской таксономии. Класс Custom Customs был протестирован на WordPress 3.4.1 и работает правильно.

Если вы хотите использовать его так, как я его сейчас настраиваю, все, что вам нужно сделать, это настроить параметры фида в конструкторе класса.