Отдельная длина записи RSS-канала для категорий?

9

Я знаю, как получить канал rss2 из категории в wp, а именно добавить /feedимя категории. Однако, когда я делаю это, не все записи из этого канала включаются в rss, это потому, что я установил ограничение канала равным 50 на административном сервере.

Я хотел бы знать, можно ли задавать длину корма индивидуально для каждой категории / корма программно.

Я не смог найти какие-либо настройки API для размера каналов ... любая помощь приветствуется здесь.

Спасибо за вашу помощь.

mahatmanich
источник
Стивен Харрис и CodeMonkey ответы оба не работают для одной конкретной категории? В противном случае оба ответа работают для меня! Почему это может быть не только для одной категории?
Махатманич

Ответы:

8

Вы должны быть в состоянии использовать pre_get_postsи установить posts_per_page50 условно (при подаче на категории). К сожалению, есть этот неразрешенный билет .

Единственный обходной путь - подключить post_limitsи заменить LIMITчасть запроса SQL напрямую.

add_action('post_limits','wpse71759_category_rss_limit',10,2);
function wpse71759_category_rss_limit($limit, $query){

     if( $query->is_feed() && $query->is_category() ){
          $paged =  $query->get('paged') ? (int) $query->get('paged') : 1;
          $per_page = 50;
          $page_start = ($paged-1)*$per_page;

          return "LIMIT $page_start, $per_page";
     }
     return $limit;
}
Стивен Харрис
источник
Привет, Стивен, я посмотрю на это, хм, на самом деле, я всегда хочу, чтобы все записи из категории в канале, и только на моей странице блога я хотел ограничить ограничение, которое я установил в бэкэнде, как бы я это сделал?
Махатманич
В таком случае, return "";а не "LIMIT $page_start, $per_page"делать это.
Стивен Харрис
Эй, ты можешь немного объяснить свой код? Я не совсем уверен, хочу ли это то, что вы предлагаете здесь.
Махатманич
Таким образом, для каналов категории вы хотите вернуть все сообщения - так что вам не нужна LIMITчасть в вашем запросе. Приведенный выше фильтр позволяет заменить LIMITдеталь пустой строкой, чтобы полученный sql извлек все сообщения.
Стивен Харрис
1
Да, но я бы порекомендовал сделать из него плагин ( wpcandy.com/teaches/how-to-create-a-functionality-plugin )
Стивен Харрис
2
add_filter('query', 'sql_query_feed_filter');
function sql_query_feed_filter($sql){
    global $wp_query;

    if ($wp_query->is_feed == true &&  isset($wp_query->query_vars['custom_taxonomy']) &&  in_array($wp_query->query_vars['custom_taxonomy'], array('slug1','slug2')) ){
        if (strpos($sql, 'SELECT SQL_CALC_FOUND_ROWS') !== false){
            list($sql,) = explode('LIMIT', $sql);
        }
    }
    return $sql;
}

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

Олег Бутузов
источник
Не могли бы вы объяснить свой код?
Махатманич
Простой фильтр SQL-запросов, срабатывающий при подаче ($ wp_query-> is_feed == true), если найдена конкретная таксономия ($ wp_query-> query_vars ['custom_taxonomy'] custom_taxonomy) и если она квивенентна некоторому слагу ($ wp_query-> query_vars ['custom_taxonomy'] == 'slug'). если все это происходит и верно (на site.com/your-custom-feed-for-category.xml), вы не получите никаких предельных результатов в своем фиде ($ SQL statment, деленный на значение LIMIT, что означает, что он вернулся без последнего LIMIT оператор ... без ограничений. все записи на росс.)
Олег Бутузов
Куда я бросил этот код? functions.php моей темы?
Махатманич
functions.php идеально подходит. но измените слаг и название пользовательской таксономии раньше. и очистить кеш браузера перед тестированием (RSS-каналы кешируются браузером).
Олег Бутузов
Эй, спасибо за хедз-ап с кешем! Это вроде работает, но по крайней мере в одной категории я не получу все сообщения в ленте, в других это работает ...
mahatmanich