Поменять сортировку записей в RSS-ленте wordpress?

Ссылка скопирована
1 ответ

По умолчанию в главном feed (site.com/feed/) выводятся только последние опубликованные новые записи. Хочу поменять сортировку записей в rss, чтобы выводились последние измененные записи. Попробовал такой код добавить в functions.php, но в главном feed по-прежнему выводятся только новые записи.

/* Модификация RSS */ function add_new_post_types_to_feed( $query ) { 	// Выходим если это запрос не фидов 	if( ! $query->is_feed || ! $query->is_main_query() ) 		return; 	$query->set( 'orderby', 'modified' ); } add_filter('pre_get_posts', 'add_new_post_types_to_feed'); /* Модификация RSS */

/* Модификация RSS */ function add_new_post_types_to_feed( $query ) { // Выходим если это запрос не фидов if( ! $query->is_feed || ! $query->is_main_query() ) return; $query->set( 'orderby', 'modified' ); } add_filter('pre_get_posts', 'add_new_post_types_to_feed'); /* Модификация RSS */

Дополнительно

// Выходим если это запрос не фидов

Не нужно выходить, если это запрос фидов

  • Артем Золин, код не мой, на wp-kama увидел. Как правильно поправить, не подскажете?
  • Андрей,
    if ( $query->is_feed ) { 	$query->set( 'orderby', 'modified' ); }

    if ( $query->is_feed ) { $query->set( 'orderby', 'modified' ); }

  • Артем Золин, супер, сработало!
    Если хотите, продублируйте в ответы, выберу вас автором.
  • Ответы:

    function add_new_post_types_to_feed( $query ) { 	if ( $query->is_feed ) { 		$query->set( 'orderby', 'modified' ); 	} } add_filter( 'pre_get_posts', 'add_new_post_types_to_feed' );

    function add_new_post_types_to_feed( $query ) { if ( $query->is_feed ) { $query->set( 'orderby', 'modified' ); } } add_filter( 'pre_get_posts', 'add_new_post_types_to_feed' );

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Анна SEO Ответ

    Для сортировки главной RSS-ленты по дате изменения нужно менять основной feed-запрос до выполнения SQL. Правильная точка входа - pre_get_posts. Внутри обработчика важно проверять именно объект WP_Query, который пришел в функцию, а не менять все запросы подряд. Иначе можно случайно затронуть архивы, виджеты, админку или дополнительные выборки на странице.

    Рабочий вариант для главной ленты site.com/feed/:

    add_action('pre_get_posts', 'wturm_order_main_feed_by_modified');
     
    function wturm_order_main_feed_by_modified($query) {
        if (is_admin() || ! $query->is_main_query() || ! $query->is_feed()) {
            return;
        }
     
        if (! $query->is_home()) {
            return;
        }
     
        $query->set('orderby', 'modified');
        $query->set('order', 'DESC');
    }

    add_action('pre_get_posts', 'wturm_order_main_feed_by_modified'); function wturm_order_main_feed_by_modified($query) { if (is_admin() || ! $query->is_main_query() || ! $query->is_feed()) { return; } if (! $query->is_home()) { return; } $query->set('orderby', 'modified'); $query->set('order', 'DESC'); }

    Этот код оставляет обычные страницы сайта без изменений и срабатывает только для основной RSS-ленты. Если нужно сортировать по дате изменения все RSS-ленты, включая рубрики, метки и авторов, уберите проверку is_home. Если нужна только главная лента, проверку лучше оставить, потому что category/feed/ и tag/feed/ часто используются отдельно и пользователи ожидают там обычный порядок публикаций.

    • Используйте add_action, потому что pre_get_posts по смыслу является действием. Технически add_filter часто тоже сработает, но это ухудшает читаемость и вводит в заблуждение.
    • Проверяйте метод $query->is_feed(), а не глобальное is_feed(), чтобы работать именно с текущим изменяемым запросом.
    • Явно задавайте order DESC, чтобы сверху были записи с самой свежей датой изменения.

    После правки откройте /feed/ и сравните порядок элементов по исходному XML. Не ориентируйтесь только на визуальный просмотр в браузере: браузер может кешировать XML или отображать его не так, как его видит RSS-агрегатор. Также проверьте кеширующие плагины, серверный кеш и CDN, если они есть. Иногда код уже работает, но отдается старая версия ленты из кеша.

    Отдельный нюанс: сортировка по modified не обязательно меняет текст даты внутри элемента RSS. В ленте может отображаться дата публикации записи, хотя порядок уже построен по post_modified. Это нормально, если задача только в порядке элементов. Если нужно, чтобы агрегаторы видели измененную дату как дату обновления, это решается отдельными фильтрами вывода RSS, но для обычной смены сортировки они не нужны.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно