2012-02-22 3 views
1

Я в основном создаю приложение iphone, которое получает данные из wordpress. Wordpress будет обслуживать аудио- и видео-ссылки через RSS-канал в приложение iphone. У меня есть фид и аудиоплеер, который отлично работает, но не может найти ничего, связанного с тем, как создать настраиваемый канал, где я могу указать разбивку на страницы, например start = 0 & items = 10. Плагин был бы замечательным, но я могу что-то подделать на PHP, если у кого-нибудь есть идеи.Как создать фид RSS с лимитом в wordpress

ответ

6

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

По умолчанию стандартные каналы в WordPress ограничены настройкой «Syndication каналы показывают самые последние X элементы» на Настройки → Чтение страницы, и unpaginated, поскольку это не будет вообще иметь смысл для Новостная лента. Это контролируется методом WP_Query :: get_posts() WordPress, в query.php, если вы заинтересованы в том, чтобы взглянуть на то, как все работает внутри страны.

Однако, несмотря на то, что ограничение на подачу запроса установлено на LIMIT 0, X (где X - это значение выше, 10 по умолчанию), вы можете переопределить предел путем фильтрации запроса в нужном месте.

Например, фильтр post_limits будет фильтровать предложение LIMIT запроса между точкой, которую он настроил по коду по умолчанию для каналов и времени его запуска. Таким образом, следующий код в плагине - или даже в functions.php вашей темы - полностью Unlimit возвращенные детали в вашем RSS-каналы:

function custom_rss_limits($limits) { 
    if (is_feed()) { 
    // If this is a feed, drop the LIMIT clause completely 
    return ""; 
    } else { 
    // It's not a feed; leave the normal LIMIT in place. 
    return $limits; 
    } 
} 
add_filter('post_limits', 'custom_rss_limits'); 

(В этот момент я должен отметить очевидные последствия для безопасности - Если у вас есть 20 000 сообщений в вашем блоге, вы получите много нагрузки на сервер и пропускную способность, если много людей начнут захватывать ваш канал, и вы отправляете все 20 000 предметов каждому. Поэтому имейте в виду, что независимо от того, что вы в конечном итоге делаете, вы все равно можете применить некоторые жесткие ограничения, на случай, если кто-то выяснит, что конечная точка вашего фида может быть запрошена для всего, скажем, анализируя трафик с вашего iPhone-приложения.)

Теперь все, что нам нужно сделать, это ответить на параметры запроса. Прежде всего, мы зарегистрировать два параметра запроса с WordPress:

function rss_limit_queryvars($qv) { 
    $qv[] = 'start'; 
    $qv[] = 'items'; 
    return $qv; 
} 
add_filter('query_vars', 'rss_limit_queryvars'); 

Это позволяет нам передать в start и items переменных вы предлагающие для ваших параметров URL.

Все, что мы должны сделать то, чтобы скорректировать нашу меняющуюся функцию оригинала LIMIT реагировать на них:

function custom_rss_limits($limits) { 
    if (is_feed()) { 
    global $wp_query; 
    if (isset($wp_query->query_vars['start']) && 
     isset($wp_query->query_vars['items'])) { 
     // We're a feed, and we got pagination parameters. Override our 
     // standard limit. 

     // First convert to ints in case anyone's put something hinky 
     // in the query string. 
     $start = intval($wp_query->query_vars['start']); 
     $items = intval($wp_query->query_vars['items']); 
     $limits = "LIMIT $start, $items"; 
    } else { 
     // We weren't passed pagination parameters, so just 
     // leave the default limits alone. 
    } 
    } 
    return $limits; 
} 
add_filter('post_limits', 'custom_rss_limits'); 

И там вы идете. Бросьте эти последние два блок кода в WordPress, и теперь вы можете использовать URL, как это на любом из существующих каналов:

http://example.com/feed/?start=30&items=25 

Для этого примера, вы получите нормальный RSS-канал, но с 25 пунктами начиная с пункта 30.

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

+0

похоже законный. благодаря! –

+0

Нет проблем. Он должен работать нормально; Я тестировал его локально с помощью этого точного кода, набитого в functions.php, и я не могу себе представить, что он не будет работать в плагине. И я думаю, что я использую чистые, одобренные подходы, чтобы делать все, что я здесь делаю, поэтому он должен продолжать работать с будущими версиями WordPress. Дайте мне знать, как вы справляетесь! –

Смежные вопросы